Merge branch 'remote-ui-communication' at r6431 into trunk

Review by: rdayal

Conflicts:
	branch-info.txt

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6432 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/build.xml b/dev/build.xml
index 824fe7a..be0bce9 100755
--- a/dev/build.xml
+++ b/dev/build.xml
@@ -38,6 +38,7 @@
           <include name="apache/ant-1.6.5.jar" />
           <include name="eclipse/jdt-3.4.2.jar" />
           <include name="jetty/jetty-6.1.11.jar" />
+          <include name="protobuf/protobuf-2.2.0/protobuf-java-2.2.0.jar" />
           <include name="tomcat/ant-launcher-1.6.5.jar" />
           <include name="tomcat/catalina-1.0.jar" />
           <include name="tomcat/catalina-optional-1.0.jar" />
@@ -93,6 +94,7 @@
           <zipfileset src="${gwt.tools.lib}/apache/ant-1.6.5.jar" />
           <zipfileset src="${gwt.tools.lib}/eclipse/jdt-3.4.2.jar" />
           <zipfileset src="${gwt.tools.lib}/jetty/jetty-6.1.11.jar" />
+          <zipfileset src="${gwt.tools.lib}/protobuf/protobuf-2.2.0/protobuf-java-2.2.0.jar" />
           <zipfileset src="${gwt.tools.lib}/tomcat/ant-launcher-1.6.5.jar" />
           <zipfileset src="${gwt.tools.lib}/tomcat/catalina-1.0.jar" />
           <zipfileset src="${gwt.tools.lib}/tomcat/catalina-optional-1.0.jar" />
diff --git a/dev/core/src/com/google/gwt/dev/DevModeBase.java b/dev/core/src/com/google/gwt/dev/DevModeBase.java
index 3dfb154..ebe9592 100644
--- a/dev/core/src/com/google/gwt/dev/DevModeBase.java
+++ b/dev/core/src/com/google/gwt/dev/DevModeBase.java
@@ -31,6 +31,7 @@
 import com.google.gwt.dev.shell.ModuleSpaceHost;
 import com.google.gwt.dev.shell.OophmSessionHandler;
 import com.google.gwt.dev.shell.ShellModuleSpaceHost;
+import com.google.gwt.dev.shell.remoteui.RemoteUI;
 import com.google.gwt.dev.ui.DevModeUI;
 import com.google.gwt.dev.ui.DoneCallback;
 import com.google.gwt.dev.ui.DoneEvent;
@@ -200,6 +201,7 @@
     public String getTag() {
       return "-logdir";
     }
+
     @Override
     public String[] getTagArgs() {
       return new String[] {"directory"};
@@ -333,6 +335,54 @@
     }
   }
 
+  protected static class ArgHandlerRemoteUI extends ArgHandlerString {
+
+    private final OptionUI options;
+
+    public ArgHandlerRemoteUI(OptionUI options) {
+      this.options = options;
+    }
+
+    @Override
+    public String getPurpose() {
+      return "Sends Development Mode UI event information to the specified host and port.";
+    }
+
+    @Override
+    public String getTag() {
+      return "-remoteUI";
+    }
+
+    @Override
+    public String[] getTagArgs() {
+      return new String[] {"port-number | host-string:port-number"};
+    }
+
+    @Override
+    public boolean setString(String str) {
+      String[] split = str.split(":");
+      String hostStr = "localhost";
+      String portStr = null;
+
+      if (split.length > 1) {
+        hostStr = split[0];
+        portStr = split[1];
+      } else {
+        portStr = split[0];
+      }
+
+      try {
+        RemoteUI remoteUI = new RemoteUI(hostStr, Integer.parseInt(portStr));
+        options.setUI(remoteUI);
+      } catch (NumberFormatException nfe) {
+        System.err.println("A port must be an integer");
+        return false;
+      }
+
+      return true;
+    }
+  }
+
   /**
    * Handles the -whitelist command line flag.
    */
@@ -360,13 +410,13 @@
 
   protected interface HostedModeBaseOptions extends JJSOptions, OptionLogDir,
       OptionLogLevel, OptionGenDir, OptionNoServer, OptionPort,
-      OptionPortHosted, OptionStartupURLs {
+      OptionPortHosted, OptionStartupURLs, OptionUI {
 
     /**
      * The base shell work directory.
      * 
-     * @param moduleDef 
-     * @return working directory base 
+     * @param moduleDef
+     * @return working directory base
      */
     File getShellBaseWorkDir(ModuleDef moduleDef);
   }
@@ -377,6 +427,7 @@
   protected static class HostedModeBaseOptionsImpl extends
       PrecompileOptionsImpl implements HostedModeBaseOptions {
 
+    private DevModeUI ui;
     private boolean isNoServer;
     private File logDir;
     private int port;
@@ -418,6 +469,10 @@
       return Collections.unmodifiableList(startupURLs);
     }
 
+    public DevModeUI getUI() {
+      return ui;
+    }
+
     public boolean isNoServer() {
       return isNoServer;
     }
@@ -437,6 +492,10 @@
     public void setPortHosted(int port) {
       portHosted = port;
     }
+
+    public void setUI(DevModeUI ui) {
+      this.ui = ui;
+    }
   }
 
   /**
@@ -453,7 +512,6 @@
     void setLogFile(String filename);
   }
 
-
   /**
    * Controls whether to run a server or not.
    * 
@@ -489,6 +547,15 @@
     List<String> getStartupURLs();
   }
 
+  /**
+   * Controls the UI that should be used to display the dev mode server's data.
+   */
+  protected interface OptionUI {
+    DevModeUI getUI();
+
+    void setUI(DevModeUI ui);
+  }
+
   abstract static class ArgProcessor extends ArgProcessorBase {
     public ArgProcessor(HostedModeBaseOptions options, boolean forceServer) {
       if (!forceServer) {
@@ -507,8 +574,7 @@
       registerHandler(new ArgHandlerDisableCastChecking(options));
       registerHandler(new ArgHandlerDraftCompile(options));
       registerHandler(new ArgHandlerPortHosted(options));
-      // TODO(rdayal): implement
-      // registerHandler(new ArgHandlerRemoteUI(options));
+      registerHandler(new ArgHandlerRemoteUI(options));
     }
   }
 
@@ -538,12 +604,14 @@
   /**
    * Produce a random string that has low probability of collisions.
    * 
-   * <p>In this case, we use 16 characters, each drawn from a pool of 94,
-   * so the number of possible values is 94^16, leading to an expected number
-   * of values used before a collision occurs as sqrt(pi/2) * 94^8 (treated the
-   * same as a birthday attack), or a little under 10^16.
+   * <p>
+   * In this case, we use 16 characters, each drawn from a pool of 94, so the
+   * number of possible values is 94^16, leading to an expected number of values
+   * used before a collision occurs as sqrt(pi/2) * 94^8 (treated the same as a
+   * birthday attack), or a little under 10^16.
    * 
-   * <p>This algorithm is also implemented in hosted.html, though it is not
+   * <p>
+   * This algorithm is also implemented in hosted.html, though it is not
    * technically important that they match.
    * 
    * @return a random string
@@ -602,11 +670,11 @@
   public TreeLogger getTopLogger() {
     return topLogger;
   }
-  
+
   /**
    * Launch the arguments as Urls in separate windows.
    * 
-   * @param logger TreeLogger instance to use 
+   * @param logger TreeLogger instance to use
    */
   public void launchStartupUrls(final TreeLogger logger) {
     ensureCodeServerListener();
@@ -626,7 +694,7 @@
   public final String normalizeURL(String unknownUrlText) {
     return normalizeURL(unknownUrlText, getPort(), getHost());
   }
- 
+
   /**
    * Callback for the UI to indicate it is done.
    */
@@ -715,8 +783,9 @@
    * Perform any startup tasks, including initializing the UI (if any) and the
    * logger, updates checker, and the development mode code server.
    * 
-   * <p>Subclasses that override this method should be careful what facilities
-   * are used before the super implementation is called.
+   * <p>
+   * Subclasses that override this method should be careful what facilities are
+   * used before the super implementation is called.
    * 
    * @return true if startup was successful
    */
@@ -727,11 +796,10 @@
 
     // Set done callback
     ui.setCallback(DoneEvent.getType(), this);
-    
+
     // Check for updates
     final TreeLogger logger = getTopLogger();
-    final CheckForUpdates updateChecker
-        = CheckForUpdates.createUpdateChecker(logger);
+    final CheckForUpdates updateChecker = CheckForUpdates.createUpdateChecker(logger);
     if (updateChecker != null) {
       Thread checkerThread = new Thread("GWT Update Checker") {
         @Override
@@ -810,7 +878,7 @@
       String path = parsedUrl.getPath();
       String query = parsedUrl.getQuery();
       String hash = parsedUrl.getRef();
-      String hostedParam =  "gwt.hosted=" + listener.getEndpointIdentifier();
+      String hostedParam = "gwt.hosted=" + listener.getEndpointIdentifier();
       if (query == null) {
         query = hostedParam;
       } else {
@@ -826,8 +894,7 @@
       getTopLogger().log(TreeLogger.ERROR, "Invalid URL " + url, e);
       throw new UnableToCompleteException();
     }
-    System.err.println(
-        "Using a browser with the GWT Development Plugin, please browse to");
+    System.err.println("Using a browser with the GWT Development Plugin, please browse to");
     System.err.println("the following URL:");
     System.err.println("  " + url);
     getTopLogger().log(TreeLogger.INFO,
@@ -873,6 +940,9 @@
       throw new IllegalStateException("Startup code has already been run");
     }
 
+    // See if there was a UI specified by command-line args
+    ui = options.getUI();
+
     // If no UI was specified by command-line args, then create one.
     if (ui == null) {
       if (headlessMode) {
@@ -894,8 +964,8 @@
         return false;
       }
       options.setPort(resultPort);
-      getTopLogger().log(TreeLogger.INFO, "Started web server on port "
-          + resultPort);
+      getTopLogger().log(TreeLogger.INFO,
+          "Started web server on port " + resultPort);
     }
 
     return true;
diff --git a/dev/core/src/com/google/gwt/dev/shell/remoteui/DevModeServiceRequestProcessor.java b/dev/core/src/com/google/gwt/dev/shell/remoteui/DevModeServiceRequestProcessor.java
new file mode 100644
index 0000000..d17d4fe
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/remoteui/DevModeServiceRequestProcessor.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2009 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.dev.shell.remoteui;
+
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange;
+
+/**
+ * A request processor that handles DevModeService requests. There should only
+ * be one instance of this class for a given {@link RemoteUI} instance.
+ * 
+ * TODO: We currently reference protobuf classes directly. We're going to be
+ * re-basing the protobuf API, and we don't want to expose these rebased classes
+ * directly to users of this API. We need to provide a level of indirection
+ * between protobuf messages.
+ */
+public class DevModeServiceRequestProcessor implements RequestProcessor {
+
+  private final RemoteUI remoteUI;
+
+  /**
+   * Create a new instance for the given remoteUI.
+   */
+  public DevModeServiceRequestProcessor(RemoteUI remoteUI) {
+    this.remoteUI = remoteUI;
+  }
+
+  public Response execute(Request request) throws Exception {
+    if (request.getServiceType() != Request.ServiceType.DEV_MODE) {
+      throw new IllegalArgumentException(
+          "Unknown Service Type: This request processor cannot handle requests of type "
+              + request.getServiceType().name());
+    }
+
+    switch (request.getDevModeRequest().getRequestType()) {
+      case CAPABILITY_EXCHANGE:
+        return processCapabilityExchange(request.getRequestId());
+
+      case RESTART_WEB_SERVER:
+        return processRestartServer();
+
+      default: {
+        break;
+      }
+    }
+
+    throw new IllegalArgumentException(
+        "Unknown DevModeService Request: The DevModeService cannot handle requests of type "
+            + request.getDevModeRequest().getRequestType().name());
+
+  }
+
+  private Response processCapabilityExchange(int requestId) {
+    CapabilityExchange.Builder capabilityExchangeBuilder = CapabilityExchange.newBuilder();
+
+    CapabilityExchange.Capability.Builder c1Builder = CapabilityExchange.Capability.newBuilder();
+    c1Builder.setCapability(DevModeRequest.RequestType.CAPABILITY_EXCHANGE);
+    capabilityExchangeBuilder.addCapabilities(c1Builder);
+
+    if (remoteUI.supportsRestartWebServer()) {
+      CapabilityExchange.Capability.Builder c2Builder = CapabilityExchange.Capability.newBuilder();
+      c2Builder.setCapability(DevModeRequest.RequestType.CAPABILITY_EXCHANGE);
+      capabilityExchangeBuilder.addCapabilities(c2Builder);
+    }
+
+    DevModeResponse.Builder devModeResponseBuilder = DevModeResponse.newBuilder();
+    devModeResponseBuilder.setResponseType(DevModeResponse.ResponseType.CAPABILITY_EXCHANGE);
+    devModeResponseBuilder.setCapabilityExchange(capabilityExchangeBuilder);
+
+    Response.Builder responseBuilder = Response.newBuilder();
+    responseBuilder.setDevModeResponse(devModeResponseBuilder);
+
+    return responseBuilder.build();
+  }
+
+  private Response processRestartServer() {
+    remoteUI.restartWebServer();
+
+    DevModeResponse.Builder devModeResponseBuilder = DevModeResponse.newBuilder();
+    devModeResponseBuilder.setResponseType(DevModeResponse.ResponseType.RESTART_WEB_SERVER);
+
+    Response.Builder responseBuilder = Response.newBuilder();
+    responseBuilder.setDevModeResponse(devModeResponseBuilder);
+
+    return responseBuilder.build();
+  }
+}
diff --git a/dev/core/src/com/google/gwt/dev/shell/remoteui/MessageTransport.java b/dev/core/src/com/google/gwt/dev/shell/remoteui/MessageTransport.java
new file mode 100644
index 0000000..aa2fa3c
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/remoteui/MessageTransport.java
@@ -0,0 +1,335 @@
+/*
+ * Copyright 2009 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.dev.shell.remoteui;
+
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Responsible for exchanging requests and responses between services.
+ */
+public class MessageTransport {
+  class PendingRequest extends PendingSend {
+    private final ReentrantLock lock = new ReentrantLock();
+    private final Condition availableResponseCondition = lock.newCondition();
+    private Response responseMessage;
+    private Exception exception;
+    private final Message message;
+
+    public PendingRequest(Message message) {
+      this.message = message;
+    }
+
+    @Override
+    public void failed(Exception e) {
+      pendingRequestMap.remove(message.getRequest().getRequestId());
+
+      lock.lock();
+      try {
+        exception = e;
+        availableResponseCondition.signal();
+      } finally {
+        lock.unlock();
+      }
+    }
+
+    @Override
+    public void send(OutputStream outputStream) throws IOException {
+      Request request = message.getRequest();
+      int requestId = request.getRequestId();
+      pendingRequestMap.put(requestId, this);
+      message.writeDelimitedTo(outputStream);
+    }
+
+    /**
+     * Sets the response that was received from the server, and signals the
+     * thread that is waiting on the response.
+     * 
+     * @param responseMessage the server's response
+     * @throws InterruptedException
+     */
+    public void setResponse(Message.Response responseMessage)
+        throws InterruptedException {
+      assert (responseMessage != null);
+      lock.lock();
+      try {
+        if (this.responseMessage != null) {
+          throw new IllegalStateException("Response has already been set.");
+        }
+        this.responseMessage = responseMessage;
+        availableResponseCondition.signal();
+      } finally {
+        lock.unlock();
+      }
+    }
+
+    /**
+     * Waits for a response to be returned for a given request.
+     * 
+     * @return the response from the server
+     * @throws Exception if an exception occurred while processing the request
+     */
+    public Response waitForResponse() throws Exception {
+      lock.lock();
+
+      try {
+        while (responseMessage == null && exception == null) {
+          availableResponseCondition.await();
+        }
+
+        if (exception != null) {
+          throw exception;
+        }
+
+        return responseMessage;
+      } finally {
+        lock.unlock();
+      }
+    }
+  }
+
+  static class PendingRequestMap {
+    private final Lock mapLock = new ReentrantLock();
+    private final Map<Integer, PendingRequest> requestIdToPendingServerRequest = new HashMap<Integer, PendingRequest>();
+    private boolean noMoreAdds;
+
+    public void blockAdds(Exception e) {
+      mapLock.lock();
+      try {
+        noMoreAdds = true;
+        for (PendingRequest pendingRequest : requestIdToPendingServerRequest.values()) {
+          pendingRequest.failed(e);
+        }
+      } finally {
+        mapLock.unlock();
+      }
+    }
+
+    public PendingRequest remove(int requestId) {
+      mapLock.lock();
+      try {
+        return requestIdToPendingServerRequest.remove(requestId);
+      } finally {
+        mapLock.unlock();
+      }
+    }
+
+    void put(int requestId, PendingRequest pendingServerRequest) {
+      mapLock.lock();
+      try {
+        if (noMoreAdds) {
+          pendingServerRequest.failed(new IllegalStateException(
+              "InputStream is closed"));
+        } else {
+          requestIdToPendingServerRequest.put(requestId, pendingServerRequest);
+        }
+      } finally {
+        mapLock.unlock();
+      }
+    }
+  }
+
+  class PendingResponse extends PendingSend {
+    Message message;
+
+    public PendingResponse(Message message) {
+      this.message = message;
+    }
+
+    @Override
+    public void failed(Exception e) {
+      // Do nothing
+    }
+
+    @Override
+    public void send(OutputStream outputStream) throws IOException {
+      message.writeDelimitedTo(outputStream);
+    }
+  }
+
+  abstract class PendingSend {
+    public abstract void failed(Exception e);
+
+    public abstract void send(OutputStream outputStream) throws IOException;
+  }
+
+  private static final int DEFAULT_SERVICE_THREADS = 2;
+
+  private final Thread messageProcessingThread;
+  private final AtomicInteger nextMessageId = new AtomicInteger();
+  private final RequestProcessor requestProcessor;
+  private final LinkedBlockingQueue<PendingSend> sendQueue = new LinkedBlockingQueue<PendingSend>();
+  private final Thread sendThread;
+  private final ExecutorService serverRequestExecutor;
+  private final PendingRequestMap pendingRequestMap = new PendingRequestMap();
+
+  /**
+   * Create a new instance using the given streams and request processor.
+   * Closing either stream will cause the termination of the transport.
+   * 
+   * @param inputStream an input stream for reading messages
+   * @param outputStream an output stream for writing messages
+   * @param requestProcessor a callback interface for handling remote client
+   *          requests
+   */
+  public MessageTransport(final InputStream inputStream,
+      final OutputStream outputStream, RequestProcessor requestProcessor) {
+    this.requestProcessor = requestProcessor;
+    serverRequestExecutor = Executors.newFixedThreadPool(DEFAULT_SERVICE_THREADS);
+
+    // This thread terminates on interruption or IO failure
+    messageProcessingThread = new Thread(new Runnable() {
+      public void run() {
+        try {
+          while (true) {
+            Message message = Message.parseDelimitedFrom(inputStream);
+            processMessage(message);
+          }
+        } catch (IOException e) {
+          terminateDueToException(e);
+        } catch (InterruptedException e) {
+          terminateDueToException(e);
+        }
+      }
+    });
+    messageProcessingThread.start();
+
+    // This thread only terminates if it is interrupted
+    sendThread = new Thread(new Runnable() {
+      public void run() {
+        while (true) {
+          try {
+            PendingSend pendingSend = sendQueue.take();
+            try {
+              pendingSend.send(outputStream);
+            } catch (IOException e) {
+              pendingSend.failed(e);
+            }
+          } catch (InterruptedException e) {
+            break;
+          }
+        }
+      }
+    });
+    sendThread.setDaemon(true);
+    sendThread.start();
+  }
+
+  /**
+   * Asynchronously executes the request on a remote server.
+   * 
+   * @param requestMessage The request to execute
+   * 
+   * @return a {@link Future} that can be used to access the server's response
+   */
+  public Future<Response> executeRequestAsync(final Request requestMessage) {
+    Future<Response> responseFuture = serverRequestExecutor.submit(new Callable<Response>() {
+      public Response call() throws Exception {
+        int requestId = nextMessageId.getAndIncrement();
+
+        Message.Request.Builder requestBuilder = Message.Request.newBuilder(requestMessage);
+        requestBuilder.setRequestId(requestId);
+
+        Message.Builder messageBuilder = Message.newBuilder();
+        messageBuilder.setMessageType(Message.MessageType.REQUEST);
+        messageBuilder.setRequest(requestBuilder);
+
+        Message message = messageBuilder.build();
+        PendingRequest pendingRequest = new PendingRequest(message);
+        sendQueue.put(pendingRequest);
+
+        return pendingRequest.waitForResponse();
+      }
+    });
+
+    return responseFuture;
+  }
+
+  private void processClientRequest(int requestId, Request request)
+      throws InterruptedException {
+    Message.Builder messageBuilder = Message.newBuilder();
+    messageBuilder.setMessageType(Message.MessageType.RESPONSE);
+
+    Response response = null;
+    try {
+      response = requestProcessor.execute(request);
+    } catch (Exception e) {
+      // TODO: Write error information into the builder and set the request Id
+      return;
+    }
+
+    // This would not be necessary if the request id was not part of request
+    // or response.
+    Response.Builder responseBuilder = Response.newBuilder(response);
+    responseBuilder.setRequestId(requestId);
+
+    messageBuilder.setResponse(responseBuilder);
+    PendingResponse pendingResponse = new PendingResponse(
+        messageBuilder.build());
+    sendQueue.put(pendingResponse);
+  }
+
+  private void processMessage(final Message message)
+      throws InterruptedException {
+    switch (message.getMessageType()) {
+      case RESPONSE: {
+        processServerResponse(message.getResponse().getRequestId(),
+            message.getResponse());
+        break;
+      }
+
+      case REQUEST: {
+        processClientRequest(message.getRequest().getRequestId(),
+            message.getRequest());
+        break;
+      }
+
+      default: {
+        // TODO: Return a response indicating that the message type
+        // is unknown
+        break;
+      }
+    }
+  }
+
+  private void processServerResponse(int requestId, Response response)
+      throws InterruptedException {
+    PendingRequest pendingServerRequest = pendingRequestMap.remove(requestId);
+    if (pendingServerRequest != null) {
+      pendingServerRequest.setResponse(response);
+    }
+  }
+
+  private void terminateDueToException(Exception e) {
+    pendingRequestMap.blockAdds(e);
+  }
+}
diff --git a/dev/core/src/com/google/gwt/dev/shell/remoteui/RemoteMessageProto.java b/dev/core/src/com/google/gwt/dev/shell/remoteui/RemoteMessageProto.java
new file mode 100644
index 0000000..3d17d13
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/remoteui/RemoteMessageProto.java
@@ -0,0 +1,10020 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+
+package com.google.gwt.dev.shell.remoteui;
+
+public final class RemoteMessageProto {
+  private RemoteMessageProto() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public static final class Message extends
+      com.google.protobuf.GeneratedMessage {
+    // Use Message.newBuilder() to construct.
+    private Message() {}
+    
+    private static final Message defaultInstance = new Message();
+    public static Message getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public Message getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_fieldAccessorTable;
+    }
+    
+    public enum MessageType
+        implements com.google.protobuf.ProtocolMessageEnum {
+      REQUEST(0, 0),
+      RESPONSE(1, 1),
+      ;
+      
+      
+      public final int getNumber() { return value; }
+      
+      public static MessageType valueOf(int value) {
+        switch (value) {
+          case 0: return REQUEST;
+          case 1: return RESPONSE;
+          default: return null;
+        }
+      }
+      
+      public static com.google.protobuf.Internal.EnumLiteMap<MessageType>
+          internalGetValueMap() {
+        return internalValueMap;
+      }
+      private static com.google.protobuf.Internal.EnumLiteMap<MessageType>
+          internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<MessageType>() {
+              public MessageType findValueByNumber(int number) {
+                return MessageType.valueOf(number)
+      ;        }
+            };
+      
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor
+          getValueDescriptor() {
+        return getDescriptor().getValues().get(index);
+      }
+      public final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+      public static final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptor() {
+        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.getDescriptor().getEnumTypes().get(0);
+      }
+      
+      private static final MessageType[] VALUES = {
+        REQUEST, RESPONSE, 
+      };
+      public static MessageType valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+        }
+        return VALUES[desc.getIndex()];
+      }
+      private final int index;
+      private final int value;
+      private MessageType(int index, int value) {
+        this.index = index;
+        this.value = value;
+      }
+      
+      static {
+        com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+      }
+    }
+    
+    public static final class Request extends
+        com.google.protobuf.GeneratedMessage {
+      // Use Request.newBuilder() to construct.
+      private Request() {}
+      
+      private static final Request defaultInstance = new Request();
+      public static Request getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public Request getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_fieldAccessorTable;
+      }
+      
+      public enum ServiceType
+          implements com.google.protobuf.ProtocolMessageEnum {
+        VIEWER(0, 0),
+        DEV_MODE(1, 1),
+        ;
+        
+        
+        public final int getNumber() { return value; }
+        
+        public static ServiceType valueOf(int value) {
+          switch (value) {
+            case 0: return VIEWER;
+            case 1: return DEV_MODE;
+            default: return null;
+          }
+        }
+        
+        public static com.google.protobuf.Internal.EnumLiteMap<ServiceType>
+            internalGetValueMap() {
+          return internalValueMap;
+        }
+        private static com.google.protobuf.Internal.EnumLiteMap<ServiceType>
+            internalValueMap =
+              new com.google.protobuf.Internal.EnumLiteMap<ServiceType>() {
+                public ServiceType findValueByNumber(int number) {
+                  return ServiceType.valueOf(number)
+        ;        }
+              };
+        
+        public final com.google.protobuf.Descriptors.EnumValueDescriptor
+            getValueDescriptor() {
+          return getDescriptor().getValues().get(index);
+        }
+        public final com.google.protobuf.Descriptors.EnumDescriptor
+            getDescriptorForType() {
+          return getDescriptor();
+        }
+        public static final com.google.protobuf.Descriptors.EnumDescriptor
+            getDescriptor() {
+          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.getDescriptor().getEnumTypes().get(0);
+        }
+        
+        private static final ServiceType[] VALUES = {
+          VIEWER, DEV_MODE, 
+        };
+        public static ServiceType valueOf(
+            com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+          if (desc.getType() != getDescriptor()) {
+            throw new java.lang.IllegalArgumentException(
+              "EnumValueDescriptor is not for this type.");
+          }
+          return VALUES[desc.getIndex()];
+        }
+        private final int index;
+        private final int value;
+        private ServiceType(int index, int value) {
+          this.index = index;
+          this.value = value;
+        }
+        
+        static {
+          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+        }
+      }
+      
+      public static final class ViewerRequest extends
+          com.google.protobuf.GeneratedMessage {
+        // Use ViewerRequest.newBuilder() to construct.
+        private ViewerRequest() {}
+        
+        private static final ViewerRequest defaultInstance = new ViewerRequest();
+        public static ViewerRequest getDefaultInstance() {
+          return defaultInstance;
+        }
+        
+        public ViewerRequest getDefaultInstanceForType() {
+          return defaultInstance;
+        }
+        
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_fieldAccessorTable;
+        }
+        
+        public enum RequestType
+            implements com.google.protobuf.ProtocolMessageEnum {
+          CAPABILITY_EXCHANGE(0, 0),
+          ADD_LOG(1, 1),
+          ADD_LOG_BRANCH(2, 2),
+          ADD_LOG_ENTRY(3, 3),
+          DISCONNECT_LOG(4, 4),
+          ;
+          
+          
+          public final int getNumber() { return value; }
+          
+          public static RequestType valueOf(int value) {
+            switch (value) {
+              case 0: return CAPABILITY_EXCHANGE;
+              case 1: return ADD_LOG;
+              case 2: return ADD_LOG_BRANCH;
+              case 3: return ADD_LOG_ENTRY;
+              case 4: return DISCONNECT_LOG;
+              default: return null;
+            }
+          }
+          
+          public static com.google.protobuf.Internal.EnumLiteMap<RequestType>
+              internalGetValueMap() {
+            return internalValueMap;
+          }
+          private static com.google.protobuf.Internal.EnumLiteMap<RequestType>
+              internalValueMap =
+                new com.google.protobuf.Internal.EnumLiteMap<RequestType>() {
+                  public RequestType findValueByNumber(int number) {
+                    return RequestType.valueOf(number)
+          ;        }
+                };
+          
+          public final com.google.protobuf.Descriptors.EnumValueDescriptor
+              getValueDescriptor() {
+            return getDescriptor().getValues().get(index);
+          }
+          public final com.google.protobuf.Descriptors.EnumDescriptor
+              getDescriptorForType() {
+            return getDescriptor();
+          }
+          public static final com.google.protobuf.Descriptors.EnumDescriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.getDescriptor().getEnumTypes().get(0);
+          }
+          
+          private static final RequestType[] VALUES = {
+            CAPABILITY_EXCHANGE, ADD_LOG, ADD_LOG_BRANCH, ADD_LOG_ENTRY, DISCONNECT_LOG, 
+          };
+          public static RequestType valueOf(
+              com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+            if (desc.getType() != getDescriptor()) {
+              throw new java.lang.IllegalArgumentException(
+                "EnumValueDescriptor is not for this type.");
+            }
+            return VALUES[desc.getIndex()];
+          }
+          private final int index;
+          private final int value;
+          private RequestType(int index, int value) {
+            this.index = index;
+            this.value = value;
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+        }
+        
+        public static final class CapabilityExchange extends
+            com.google.protobuf.GeneratedMessage {
+          // Use CapabilityExchange.newBuilder() to construct.
+          private CapabilityExchange() {}
+          
+          private static final CapabilityExchange defaultInstance = new CapabilityExchange();
+          public static CapabilityExchange getDefaultInstance() {
+            return defaultInstance;
+          }
+          
+          public CapabilityExchange getDefaultInstanceForType() {
+            return defaultInstance;
+          }
+          
+          public static final com.google.protobuf.Descriptors.Descriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_CapabilityExchange_descriptor;
+          }
+          
+          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+              internalGetFieldAccessorTable() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_CapabilityExchange_fieldAccessorTable;
+          }
+          
+          public final boolean isInitialized() {
+            return true;
+          }
+          
+          public void writeTo(com.google.protobuf.CodedOutputStream output)
+                              throws java.io.IOException {
+            getUnknownFields().writeTo(output);
+          }
+          
+          private int memoizedSerializedSize = -1;
+          public int getSerializedSize() {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+          
+            size = 0;
+            size += getUnknownFields().getSerializedSize();
+            memoizedSerializedSize = size;
+            return size;
+          }
+          
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(
+              com.google.protobuf.ByteString data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(
+              com.google.protobuf.ByteString data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(byte[] data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(
+              byte[] data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseDelimitedFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseDelimitedFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(
+              com.google.protobuf.CodedInputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange parseFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          
+          public static Builder newBuilder() { return Builder.create(); }
+          public Builder newBuilderForType() { return newBuilder(); }
+          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange prototype) {
+            return newBuilder().mergeFrom(prototype);
+          }
+          public Builder toBuilder() { return newBuilder(this); }
+          
+          public static final class Builder extends
+              com.google.protobuf.GeneratedMessage.Builder<Builder> {
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange result;
+            
+            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.newBuilder()
+            private Builder() {}
+            
+            private static Builder create() {
+              Builder builder = new Builder();
+              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange();
+              return builder;
+            }
+            
+            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange internalGetResult() {
+              return result;
+            }
+            
+            public Builder clear() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "Cannot call clear() after build().");
+              }
+              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange();
+              return this;
+            }
+            
+            public Builder clone() {
+              return create().mergeFrom(result);
+            }
+            
+            public com.google.protobuf.Descriptors.Descriptor
+                getDescriptorForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.getDescriptor();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange getDefaultInstanceForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.getDefaultInstance();
+            }
+            
+            public boolean isInitialized() {
+              return result.isInitialized();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange build() {
+              if (result != null && !isInitialized()) {
+                throw newUninitializedMessageException(result);
+              }
+              return buildPartial();
+            }
+            
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange buildParsed()
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              if (!isInitialized()) {
+                throw newUninitializedMessageException(
+                  result).asInvalidProtocolBufferException();
+              }
+              return buildPartial();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange buildPartial() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "build() has already been called on this Builder.");
+              }
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange returnMe = result;
+              result = null;
+              return returnMe;
+            }
+            
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange) {
+                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange)other);
+              } else {
+                super.mergeFrom(other);
+                return this;
+              }
+            }
+            
+            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange other) {
+              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.getDefaultInstance()) return this;
+              this.mergeUnknownFields(other.getUnknownFields());
+              return this;
+            }
+            
+            public Builder mergeFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                com.google.protobuf.UnknownFieldSet.newBuilder(
+                  this.getUnknownFields());
+              while (true) {
+                int tag = input.readTag();
+                switch (tag) {
+                  case 0:
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  default: {
+                    if (!parseUnknownField(input, unknownFields,
+                                           extensionRegistry, tag)) {
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    }
+                    break;
+                  }
+                }
+              }
+            }
+            
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+          }
+        }
+        
+        public static final class AddLog extends
+            com.google.protobuf.GeneratedMessage {
+          // Use AddLog.newBuilder() to construct.
+          private AddLog() {}
+          
+          private static final AddLog defaultInstance = new AddLog();
+          public static AddLog getDefaultInstance() {
+            return defaultInstance;
+          }
+          
+          public AddLog getDefaultInstanceForType() {
+            return defaultInstance;
+          }
+          
+          public static final com.google.protobuf.Descriptors.Descriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_descriptor;
+          }
+          
+          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+              internalGetFieldAccessorTable() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_fieldAccessorTable;
+          }
+          
+          public enum LogType
+              implements com.google.protobuf.ProtocolMessageEnum {
+            MAIN(0, 0),
+            MODULE(1, 1),
+            WEB_SERVER(2, 2),
+            ;
+            
+            
+            public final int getNumber() { return value; }
+            
+            public static LogType valueOf(int value) {
+              switch (value) {
+                case 0: return MAIN;
+                case 1: return MODULE;
+                case 2: return WEB_SERVER;
+                default: return null;
+              }
+            }
+            
+            public static com.google.protobuf.Internal.EnumLiteMap<LogType>
+                internalGetValueMap() {
+              return internalValueMap;
+            }
+            private static com.google.protobuf.Internal.EnumLiteMap<LogType>
+                internalValueMap =
+                  new com.google.protobuf.Internal.EnumLiteMap<LogType>() {
+                    public LogType findValueByNumber(int number) {
+                      return LogType.valueOf(number)
+            ;        }
+                  };
+            
+            public final com.google.protobuf.Descriptors.EnumValueDescriptor
+                getValueDescriptor() {
+              return getDescriptor().getValues().get(index);
+            }
+            public final com.google.protobuf.Descriptors.EnumDescriptor
+                getDescriptorForType() {
+              return getDescriptor();
+            }
+            public static final com.google.protobuf.Descriptors.EnumDescriptor
+                getDescriptor() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.getDescriptor().getEnumTypes().get(0);
+            }
+            
+            private static final LogType[] VALUES = {
+              MAIN, MODULE, WEB_SERVER, 
+            };
+            public static LogType valueOf(
+                com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+              if (desc.getType() != getDescriptor()) {
+                throw new java.lang.IllegalArgumentException(
+                  "EnumValueDescriptor is not for this type.");
+              }
+              return VALUES[desc.getIndex()];
+            }
+            private final int index;
+            private final int value;
+            private LogType(int index, int value) {
+              this.index = index;
+              this.value = value;
+            }
+            
+            static {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+            }
+          }
+          
+          public static final class ModuleLog extends
+              com.google.protobuf.GeneratedMessage {
+            // Use ModuleLog.newBuilder() to construct.
+            private ModuleLog() {}
+            
+            private static final ModuleLog defaultInstance = new ModuleLog();
+            public static ModuleLog getDefaultInstance() {
+              return defaultInstance;
+            }
+            
+            public ModuleLog getDefaultInstanceForType() {
+              return defaultInstance;
+            }
+            
+            public static final com.google.protobuf.Descriptors.Descriptor
+                getDescriptor() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ModuleLog_descriptor;
+            }
+            
+            protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+                internalGetFieldAccessorTable() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ModuleLog_fieldAccessorTable;
+            }
+            
+            // required string name = 1;
+            public static final int NAME_FIELD_NUMBER = 1;
+            private boolean hasName;
+            private java.lang.String name_ = "";
+            public boolean hasName() { return hasName; }
+            public java.lang.String getName() { return name_; }
+            
+            // optional bytes icon = 2;
+            public static final int ICON_FIELD_NUMBER = 2;
+            private boolean hasIcon;
+            private com.google.protobuf.ByteString icon_ = com.google.protobuf.ByteString.EMPTY;
+            public boolean hasIcon() { return hasIcon; }
+            public com.google.protobuf.ByteString getIcon() { return icon_; }
+            
+            // optional string sessionKey = 3;
+            public static final int SESSIONKEY_FIELD_NUMBER = 3;
+            private boolean hasSessionKey;
+            private java.lang.String sessionKey_ = "";
+            public boolean hasSessionKey() { return hasSessionKey; }
+            public java.lang.String getSessionKey() { return sessionKey_; }
+            
+            // optional string userAgent = 4;
+            public static final int USERAGENT_FIELD_NUMBER = 4;
+            private boolean hasUserAgent;
+            private java.lang.String userAgent_ = "";
+            public boolean hasUserAgent() { return hasUserAgent; }
+            public java.lang.String getUserAgent() { return userAgent_; }
+            
+            // optional string url = 5;
+            public static final int URL_FIELD_NUMBER = 5;
+            private boolean hasUrl;
+            private java.lang.String url_ = "";
+            public boolean hasUrl() { return hasUrl; }
+            public java.lang.String getUrl() { return url_; }
+            
+            // optional string tabKey = 6;
+            public static final int TABKEY_FIELD_NUMBER = 6;
+            private boolean hasTabKey;
+            private java.lang.String tabKey_ = "";
+            public boolean hasTabKey() { return hasTabKey; }
+            public java.lang.String getTabKey() { return tabKey_; }
+            
+            // optional string remoteHost = 7;
+            public static final int REMOTEHOST_FIELD_NUMBER = 7;
+            private boolean hasRemoteHost;
+            private java.lang.String remoteHost_ = "";
+            public boolean hasRemoteHost() { return hasRemoteHost; }
+            public java.lang.String getRemoteHost() { return remoteHost_; }
+            
+            public final boolean isInitialized() {
+              if (!hasName) return false;
+              return true;
+            }
+            
+            public void writeTo(com.google.protobuf.CodedOutputStream output)
+                                throws java.io.IOException {
+              if (hasName()) {
+                output.writeString(1, getName());
+              }
+              if (hasIcon()) {
+                output.writeBytes(2, getIcon());
+              }
+              if (hasSessionKey()) {
+                output.writeString(3, getSessionKey());
+              }
+              if (hasUserAgent()) {
+                output.writeString(4, getUserAgent());
+              }
+              if (hasUrl()) {
+                output.writeString(5, getUrl());
+              }
+              if (hasTabKey()) {
+                output.writeString(6, getTabKey());
+              }
+              if (hasRemoteHost()) {
+                output.writeString(7, getRemoteHost());
+              }
+              getUnknownFields().writeTo(output);
+            }
+            
+            private int memoizedSerializedSize = -1;
+            public int getSerializedSize() {
+              int size = memoizedSerializedSize;
+              if (size != -1) return size;
+            
+              size = 0;
+              if (hasName()) {
+                size += com.google.protobuf.CodedOutputStream
+                  .computeStringSize(1, getName());
+              }
+              if (hasIcon()) {
+                size += com.google.protobuf.CodedOutputStream
+                  .computeBytesSize(2, getIcon());
+              }
+              if (hasSessionKey()) {
+                size += com.google.protobuf.CodedOutputStream
+                  .computeStringSize(3, getSessionKey());
+              }
+              if (hasUserAgent()) {
+                size += com.google.protobuf.CodedOutputStream
+                  .computeStringSize(4, getUserAgent());
+              }
+              if (hasUrl()) {
+                size += com.google.protobuf.CodedOutputStream
+                  .computeStringSize(5, getUrl());
+              }
+              if (hasTabKey()) {
+                size += com.google.protobuf.CodedOutputStream
+                  .computeStringSize(6, getTabKey());
+              }
+              if (hasRemoteHost()) {
+                size += com.google.protobuf.CodedOutputStream
+                  .computeStringSize(7, getRemoteHost());
+              }
+              size += getUnknownFields().getSerializedSize();
+              memoizedSerializedSize = size;
+              return size;
+            }
+            
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(
+                com.google.protobuf.ByteString data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(
+                com.google.protobuf.ByteString data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(byte[] data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(
+                byte[] data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(java.io.InputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseDelimitedFrom(java.io.InputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeDelimitedFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseDelimitedFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(
+                com.google.protobuf.CodedInputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog parseFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            
+            public static Builder newBuilder() { return Builder.create(); }
+            public Builder newBuilderForType() { return newBuilder(); }
+            public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog prototype) {
+              return newBuilder().mergeFrom(prototype);
+            }
+            public Builder toBuilder() { return newBuilder(this); }
+            
+            public static final class Builder extends
+                com.google.protobuf.GeneratedMessage.Builder<Builder> {
+              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog result;
+              
+              // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.newBuilder()
+              private Builder() {}
+              
+              private static Builder create() {
+                Builder builder = new Builder();
+                builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog();
+                return builder;
+              }
+              
+              protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog internalGetResult() {
+                return result;
+              }
+              
+              public Builder clear() {
+                if (result == null) {
+                  throw new IllegalStateException(
+                    "Cannot call clear() after build().");
+                }
+                result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog();
+                return this;
+              }
+              
+              public Builder clone() {
+                return create().mergeFrom(result);
+              }
+              
+              public com.google.protobuf.Descriptors.Descriptor
+                  getDescriptorForType() {
+                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.getDescriptor();
+              }
+              
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog getDefaultInstanceForType() {
+                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.getDefaultInstance();
+              }
+              
+              public boolean isInitialized() {
+                return result.isInitialized();
+              }
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog build() {
+                if (result != null && !isInitialized()) {
+                  throw newUninitializedMessageException(result);
+                }
+                return buildPartial();
+              }
+              
+              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog buildParsed()
+                  throws com.google.protobuf.InvalidProtocolBufferException {
+                if (!isInitialized()) {
+                  throw newUninitializedMessageException(
+                    result).asInvalidProtocolBufferException();
+                }
+                return buildPartial();
+              }
+              
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog buildPartial() {
+                if (result == null) {
+                  throw new IllegalStateException(
+                    "build() has already been called on this Builder.");
+                }
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog returnMe = result;
+                result = null;
+                return returnMe;
+              }
+              
+              public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog) {
+                  return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog)other);
+                } else {
+                  super.mergeFrom(other);
+                  return this;
+                }
+              }
+              
+              public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog other) {
+                if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.getDefaultInstance()) return this;
+                if (other.hasName()) {
+                  setName(other.getName());
+                }
+                if (other.hasIcon()) {
+                  setIcon(other.getIcon());
+                }
+                if (other.hasSessionKey()) {
+                  setSessionKey(other.getSessionKey());
+                }
+                if (other.hasUserAgent()) {
+                  setUserAgent(other.getUserAgent());
+                }
+                if (other.hasUrl()) {
+                  setUrl(other.getUrl());
+                }
+                if (other.hasTabKey()) {
+                  setTabKey(other.getTabKey());
+                }
+                if (other.hasRemoteHost()) {
+                  setRemoteHost(other.getRemoteHost());
+                }
+                this.mergeUnknownFields(other.getUnknownFields());
+                return this;
+              }
+              
+              public Builder mergeFrom(
+                  com.google.protobuf.CodedInputStream input,
+                  com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                  throws java.io.IOException {
+                com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                  com.google.protobuf.UnknownFieldSet.newBuilder(
+                    this.getUnknownFields());
+                while (true) {
+                  int tag = input.readTag();
+                  switch (tag) {
+                    case 0:
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    default: {
+                      if (!parseUnknownField(input, unknownFields,
+                                             extensionRegistry, tag)) {
+                        this.setUnknownFields(unknownFields.build());
+                        return this;
+                      }
+                      break;
+                    }
+                    case 10: {
+                      setName(input.readString());
+                      break;
+                    }
+                    case 18: {
+                      setIcon(input.readBytes());
+                      break;
+                    }
+                    case 26: {
+                      setSessionKey(input.readString());
+                      break;
+                    }
+                    case 34: {
+                      setUserAgent(input.readString());
+                      break;
+                    }
+                    case 42: {
+                      setUrl(input.readString());
+                      break;
+                    }
+                    case 50: {
+                      setTabKey(input.readString());
+                      break;
+                    }
+                    case 58: {
+                      setRemoteHost(input.readString());
+                      break;
+                    }
+                  }
+                }
+              }
+              
+              
+              // required string name = 1;
+              public boolean hasName() {
+                return result.hasName();
+              }
+              public java.lang.String getName() {
+                return result.getName();
+              }
+              public Builder setName(java.lang.String value) {
+                if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasName = true;
+                result.name_ = value;
+                return this;
+              }
+              public Builder clearName() {
+                result.hasName = false;
+                result.name_ = getDefaultInstance().getName();
+                return this;
+              }
+              
+              // optional bytes icon = 2;
+              public boolean hasIcon() {
+                return result.hasIcon();
+              }
+              public com.google.protobuf.ByteString getIcon() {
+                return result.getIcon();
+              }
+              public Builder setIcon(com.google.protobuf.ByteString value) {
+                if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasIcon = true;
+                result.icon_ = value;
+                return this;
+              }
+              public Builder clearIcon() {
+                result.hasIcon = false;
+                result.icon_ = getDefaultInstance().getIcon();
+                return this;
+              }
+              
+              // optional string sessionKey = 3;
+              public boolean hasSessionKey() {
+                return result.hasSessionKey();
+              }
+              public java.lang.String getSessionKey() {
+                return result.getSessionKey();
+              }
+              public Builder setSessionKey(java.lang.String value) {
+                if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasSessionKey = true;
+                result.sessionKey_ = value;
+                return this;
+              }
+              public Builder clearSessionKey() {
+                result.hasSessionKey = false;
+                result.sessionKey_ = getDefaultInstance().getSessionKey();
+                return this;
+              }
+              
+              // optional string userAgent = 4;
+              public boolean hasUserAgent() {
+                return result.hasUserAgent();
+              }
+              public java.lang.String getUserAgent() {
+                return result.getUserAgent();
+              }
+              public Builder setUserAgent(java.lang.String value) {
+                if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasUserAgent = true;
+                result.userAgent_ = value;
+                return this;
+              }
+              public Builder clearUserAgent() {
+                result.hasUserAgent = false;
+                result.userAgent_ = getDefaultInstance().getUserAgent();
+                return this;
+              }
+              
+              // optional string url = 5;
+              public boolean hasUrl() {
+                return result.hasUrl();
+              }
+              public java.lang.String getUrl() {
+                return result.getUrl();
+              }
+              public Builder setUrl(java.lang.String value) {
+                if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasUrl = true;
+                result.url_ = value;
+                return this;
+              }
+              public Builder clearUrl() {
+                result.hasUrl = false;
+                result.url_ = getDefaultInstance().getUrl();
+                return this;
+              }
+              
+              // optional string tabKey = 6;
+              public boolean hasTabKey() {
+                return result.hasTabKey();
+              }
+              public java.lang.String getTabKey() {
+                return result.getTabKey();
+              }
+              public Builder setTabKey(java.lang.String value) {
+                if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasTabKey = true;
+                result.tabKey_ = value;
+                return this;
+              }
+              public Builder clearTabKey() {
+                result.hasTabKey = false;
+                result.tabKey_ = getDefaultInstance().getTabKey();
+                return this;
+              }
+              
+              // optional string remoteHost = 7;
+              public boolean hasRemoteHost() {
+                return result.hasRemoteHost();
+              }
+              public java.lang.String getRemoteHost() {
+                return result.getRemoteHost();
+              }
+              public Builder setRemoteHost(java.lang.String value) {
+                if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasRemoteHost = true;
+                result.remoteHost_ = value;
+                return this;
+              }
+              public Builder clearRemoteHost() {
+                result.hasRemoteHost = false;
+                result.remoteHost_ = getDefaultInstance().getRemoteHost();
+                return this;
+              }
+            }
+            
+            static {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+            }
+            
+            static {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+            }
+          }
+          
+          public static final class ServerLog extends
+              com.google.protobuf.GeneratedMessage {
+            // Use ServerLog.newBuilder() to construct.
+            private ServerLog() {}
+            
+            private static final ServerLog defaultInstance = new ServerLog();
+            public static ServerLog getDefaultInstance() {
+              return defaultInstance;
+            }
+            
+            public ServerLog getDefaultInstanceForType() {
+              return defaultInstance;
+            }
+            
+            public static final com.google.protobuf.Descriptors.Descriptor
+                getDescriptor() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ServerLog_descriptor;
+            }
+            
+            protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+                internalGetFieldAccessorTable() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ServerLog_fieldAccessorTable;
+            }
+            
+            // required string name = 1;
+            public static final int NAME_FIELD_NUMBER = 1;
+            private boolean hasName;
+            private java.lang.String name_ = "";
+            public boolean hasName() { return hasName; }
+            public java.lang.String getName() { return name_; }
+            
+            // optional bytes icon = 2;
+            public static final int ICON_FIELD_NUMBER = 2;
+            private boolean hasIcon;
+            private com.google.protobuf.ByteString icon_ = com.google.protobuf.ByteString.EMPTY;
+            public boolean hasIcon() { return hasIcon; }
+            public com.google.protobuf.ByteString getIcon() { return icon_; }
+            
+            public final boolean isInitialized() {
+              if (!hasName) return false;
+              return true;
+            }
+            
+            public void writeTo(com.google.protobuf.CodedOutputStream output)
+                                throws java.io.IOException {
+              if (hasName()) {
+                output.writeString(1, getName());
+              }
+              if (hasIcon()) {
+                output.writeBytes(2, getIcon());
+              }
+              getUnknownFields().writeTo(output);
+            }
+            
+            private int memoizedSerializedSize = -1;
+            public int getSerializedSize() {
+              int size = memoizedSerializedSize;
+              if (size != -1) return size;
+            
+              size = 0;
+              if (hasName()) {
+                size += com.google.protobuf.CodedOutputStream
+                  .computeStringSize(1, getName());
+              }
+              if (hasIcon()) {
+                size += com.google.protobuf.CodedOutputStream
+                  .computeBytesSize(2, getIcon());
+              }
+              size += getUnknownFields().getSerializedSize();
+              memoizedSerializedSize = size;
+              return size;
+            }
+            
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(
+                com.google.protobuf.ByteString data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(
+                com.google.protobuf.ByteString data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(byte[] data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(
+                byte[] data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(java.io.InputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseDelimitedFrom(java.io.InputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeDelimitedFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseDelimitedFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(
+                com.google.protobuf.CodedInputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog parseFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            
+            public static Builder newBuilder() { return Builder.create(); }
+            public Builder newBuilderForType() { return newBuilder(); }
+            public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog prototype) {
+              return newBuilder().mergeFrom(prototype);
+            }
+            public Builder toBuilder() { return newBuilder(this); }
+            
+            public static final class Builder extends
+                com.google.protobuf.GeneratedMessage.Builder<Builder> {
+              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog result;
+              
+              // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.newBuilder()
+              private Builder() {}
+              
+              private static Builder create() {
+                Builder builder = new Builder();
+                builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog();
+                return builder;
+              }
+              
+              protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog internalGetResult() {
+                return result;
+              }
+              
+              public Builder clear() {
+                if (result == null) {
+                  throw new IllegalStateException(
+                    "Cannot call clear() after build().");
+                }
+                result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog();
+                return this;
+              }
+              
+              public Builder clone() {
+                return create().mergeFrom(result);
+              }
+              
+              public com.google.protobuf.Descriptors.Descriptor
+                  getDescriptorForType() {
+                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.getDescriptor();
+              }
+              
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog getDefaultInstanceForType() {
+                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.getDefaultInstance();
+              }
+              
+              public boolean isInitialized() {
+                return result.isInitialized();
+              }
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog build() {
+                if (result != null && !isInitialized()) {
+                  throw newUninitializedMessageException(result);
+                }
+                return buildPartial();
+              }
+              
+              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog buildParsed()
+                  throws com.google.protobuf.InvalidProtocolBufferException {
+                if (!isInitialized()) {
+                  throw newUninitializedMessageException(
+                    result).asInvalidProtocolBufferException();
+                }
+                return buildPartial();
+              }
+              
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog buildPartial() {
+                if (result == null) {
+                  throw new IllegalStateException(
+                    "build() has already been called on this Builder.");
+                }
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog returnMe = result;
+                result = null;
+                return returnMe;
+              }
+              
+              public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog) {
+                  return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog)other);
+                } else {
+                  super.mergeFrom(other);
+                  return this;
+                }
+              }
+              
+              public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog other) {
+                if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.getDefaultInstance()) return this;
+                if (other.hasName()) {
+                  setName(other.getName());
+                }
+                if (other.hasIcon()) {
+                  setIcon(other.getIcon());
+                }
+                this.mergeUnknownFields(other.getUnknownFields());
+                return this;
+              }
+              
+              public Builder mergeFrom(
+                  com.google.protobuf.CodedInputStream input,
+                  com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                  throws java.io.IOException {
+                com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                  com.google.protobuf.UnknownFieldSet.newBuilder(
+                    this.getUnknownFields());
+                while (true) {
+                  int tag = input.readTag();
+                  switch (tag) {
+                    case 0:
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    default: {
+                      if (!parseUnknownField(input, unknownFields,
+                                             extensionRegistry, tag)) {
+                        this.setUnknownFields(unknownFields.build());
+                        return this;
+                      }
+                      break;
+                    }
+                    case 10: {
+                      setName(input.readString());
+                      break;
+                    }
+                    case 18: {
+                      setIcon(input.readBytes());
+                      break;
+                    }
+                  }
+                }
+              }
+              
+              
+              // required string name = 1;
+              public boolean hasName() {
+                return result.hasName();
+              }
+              public java.lang.String getName() {
+                return result.getName();
+              }
+              public Builder setName(java.lang.String value) {
+                if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasName = true;
+                result.name_ = value;
+                return this;
+              }
+              public Builder clearName() {
+                result.hasName = false;
+                result.name_ = getDefaultInstance().getName();
+                return this;
+              }
+              
+              // optional bytes icon = 2;
+              public boolean hasIcon() {
+                return result.hasIcon();
+              }
+              public com.google.protobuf.ByteString getIcon() {
+                return result.getIcon();
+              }
+              public Builder setIcon(com.google.protobuf.ByteString value) {
+                if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasIcon = true;
+                result.icon_ = value;
+                return this;
+              }
+              public Builder clearIcon() {
+                result.hasIcon = false;
+                result.icon_ = getDefaultInstance().getIcon();
+                return this;
+              }
+            }
+            
+            static {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+            }
+            
+            static {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+            }
+          }
+          
+          public static final class MainLog extends
+              com.google.protobuf.GeneratedMessage {
+            // Use MainLog.newBuilder() to construct.
+            private MainLog() {}
+            
+            private static final MainLog defaultInstance = new MainLog();
+            public static MainLog getDefaultInstance() {
+              return defaultInstance;
+            }
+            
+            public MainLog getDefaultInstanceForType() {
+              return defaultInstance;
+            }
+            
+            public static final com.google.protobuf.Descriptors.Descriptor
+                getDescriptor() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_MainLog_descriptor;
+            }
+            
+            protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+                internalGetFieldAccessorTable() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_MainLog_fieldAccessorTable;
+            }
+            
+            public final boolean isInitialized() {
+              return true;
+            }
+            
+            public void writeTo(com.google.protobuf.CodedOutputStream output)
+                                throws java.io.IOException {
+              getUnknownFields().writeTo(output);
+            }
+            
+            private int memoizedSerializedSize = -1;
+            public int getSerializedSize() {
+              int size = memoizedSerializedSize;
+              if (size != -1) return size;
+            
+              size = 0;
+              size += getUnknownFields().getSerializedSize();
+              memoizedSerializedSize = size;
+              return size;
+            }
+            
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(
+                com.google.protobuf.ByteString data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(
+                com.google.protobuf.ByteString data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(byte[] data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(
+                byte[] data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(java.io.InputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseDelimitedFrom(java.io.InputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeDelimitedFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseDelimitedFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(
+                com.google.protobuf.CodedInputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog parseFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            
+            public static Builder newBuilder() { return Builder.create(); }
+            public Builder newBuilderForType() { return newBuilder(); }
+            public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog prototype) {
+              return newBuilder().mergeFrom(prototype);
+            }
+            public Builder toBuilder() { return newBuilder(this); }
+            
+            public static final class Builder extends
+                com.google.protobuf.GeneratedMessage.Builder<Builder> {
+              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog result;
+              
+              // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.newBuilder()
+              private Builder() {}
+              
+              private static Builder create() {
+                Builder builder = new Builder();
+                builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog();
+                return builder;
+              }
+              
+              protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog internalGetResult() {
+                return result;
+              }
+              
+              public Builder clear() {
+                if (result == null) {
+                  throw new IllegalStateException(
+                    "Cannot call clear() after build().");
+                }
+                result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog();
+                return this;
+              }
+              
+              public Builder clone() {
+                return create().mergeFrom(result);
+              }
+              
+              public com.google.protobuf.Descriptors.Descriptor
+                  getDescriptorForType() {
+                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.getDescriptor();
+              }
+              
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog getDefaultInstanceForType() {
+                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.getDefaultInstance();
+              }
+              
+              public boolean isInitialized() {
+                return result.isInitialized();
+              }
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog build() {
+                if (result != null && !isInitialized()) {
+                  throw newUninitializedMessageException(result);
+                }
+                return buildPartial();
+              }
+              
+              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog buildParsed()
+                  throws com.google.protobuf.InvalidProtocolBufferException {
+                if (!isInitialized()) {
+                  throw newUninitializedMessageException(
+                    result).asInvalidProtocolBufferException();
+                }
+                return buildPartial();
+              }
+              
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog buildPartial() {
+                if (result == null) {
+                  throw new IllegalStateException(
+                    "build() has already been called on this Builder.");
+                }
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog returnMe = result;
+                result = null;
+                return returnMe;
+              }
+              
+              public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog) {
+                  return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog)other);
+                } else {
+                  super.mergeFrom(other);
+                  return this;
+                }
+              }
+              
+              public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog other) {
+                if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.getDefaultInstance()) return this;
+                this.mergeUnknownFields(other.getUnknownFields());
+                return this;
+              }
+              
+              public Builder mergeFrom(
+                  com.google.protobuf.CodedInputStream input,
+                  com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                  throws java.io.IOException {
+                com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                  com.google.protobuf.UnknownFieldSet.newBuilder(
+                    this.getUnknownFields());
+                while (true) {
+                  int tag = input.readTag();
+                  switch (tag) {
+                    case 0:
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    default: {
+                      if (!parseUnknownField(input, unknownFields,
+                                             extensionRegistry, tag)) {
+                        this.setUnknownFields(unknownFields.build());
+                        return this;
+                      }
+                      break;
+                    }
+                  }
+                }
+              }
+              
+            }
+            
+            static {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+            }
+            
+            static {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+            }
+          }
+          
+          // required .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.LogType type = 1;
+          public static final int TYPE_FIELD_NUMBER = 1;
+          private boolean hasType;
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType type_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType.MAIN;
+          public boolean hasType() { return hasType; }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType getType() { return type_; }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.ModuleLog moduleLog = 2;
+          public static final int MODULELOG_FIELD_NUMBER = 2;
+          private boolean hasModuleLog;
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog moduleLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.getDefaultInstance();
+          public boolean hasModuleLog() { return hasModuleLog; }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog getModuleLog() { return moduleLog_; }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.ServerLog serverLog = 3;
+          public static final int SERVERLOG_FIELD_NUMBER = 3;
+          private boolean hasServerLog;
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog serverLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.getDefaultInstance();
+          public boolean hasServerLog() { return hasServerLog; }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog getServerLog() { return serverLog_; }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.MainLog mainLog = 4;
+          public static final int MAINLOG_FIELD_NUMBER = 4;
+          private boolean hasMainLog;
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog mainLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.getDefaultInstance();
+          public boolean hasMainLog() { return hasMainLog; }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog getMainLog() { return mainLog_; }
+          
+          public final boolean isInitialized() {
+            if (!hasType) return false;
+            if (hasModuleLog()) {
+              if (!getModuleLog().isInitialized()) return false;
+            }
+            if (hasServerLog()) {
+              if (!getServerLog().isInitialized()) return false;
+            }
+            return true;
+          }
+          
+          public void writeTo(com.google.protobuf.CodedOutputStream output)
+                              throws java.io.IOException {
+            if (hasType()) {
+              output.writeEnum(1, getType().getNumber());
+            }
+            if (hasModuleLog()) {
+              output.writeMessage(2, getModuleLog());
+            }
+            if (hasServerLog()) {
+              output.writeMessage(3, getServerLog());
+            }
+            if (hasMainLog()) {
+              output.writeMessage(4, getMainLog());
+            }
+            getUnknownFields().writeTo(output);
+          }
+          
+          private int memoizedSerializedSize = -1;
+          public int getSerializedSize() {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+          
+            size = 0;
+            if (hasType()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeEnumSize(1, getType().getNumber());
+            }
+            if (hasModuleLog()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeMessageSize(2, getModuleLog());
+            }
+            if (hasServerLog()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeMessageSize(3, getServerLog());
+            }
+            if (hasMainLog()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeMessageSize(4, getMainLog());
+            }
+            size += getUnknownFields().getSerializedSize();
+            memoizedSerializedSize = size;
+            return size;
+          }
+          
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(
+              com.google.protobuf.ByteString data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(
+              com.google.protobuf.ByteString data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(byte[] data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(
+              byte[] data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseDelimitedFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseDelimitedFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(
+              com.google.protobuf.CodedInputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog parseFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          
+          public static Builder newBuilder() { return Builder.create(); }
+          public Builder newBuilderForType() { return newBuilder(); }
+          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog prototype) {
+            return newBuilder().mergeFrom(prototype);
+          }
+          public Builder toBuilder() { return newBuilder(this); }
+          
+          public static final class Builder extends
+              com.google.protobuf.GeneratedMessage.Builder<Builder> {
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog result;
+            
+            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.newBuilder()
+            private Builder() {}
+            
+            private static Builder create() {
+              Builder builder = new Builder();
+              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog();
+              return builder;
+            }
+            
+            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog internalGetResult() {
+              return result;
+            }
+            
+            public Builder clear() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "Cannot call clear() after build().");
+              }
+              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog();
+              return this;
+            }
+            
+            public Builder clone() {
+              return create().mergeFrom(result);
+            }
+            
+            public com.google.protobuf.Descriptors.Descriptor
+                getDescriptorForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.getDescriptor();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog getDefaultInstanceForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.getDefaultInstance();
+            }
+            
+            public boolean isInitialized() {
+              return result.isInitialized();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog build() {
+              if (result != null && !isInitialized()) {
+                throw newUninitializedMessageException(result);
+              }
+              return buildPartial();
+            }
+            
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog buildParsed()
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              if (!isInitialized()) {
+                throw newUninitializedMessageException(
+                  result).asInvalidProtocolBufferException();
+              }
+              return buildPartial();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog buildPartial() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "build() has already been called on this Builder.");
+              }
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog returnMe = result;
+              result = null;
+              return returnMe;
+            }
+            
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog) {
+                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog)other);
+              } else {
+                super.mergeFrom(other);
+                return this;
+              }
+            }
+            
+            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog other) {
+              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.getDefaultInstance()) return this;
+              if (other.hasType()) {
+                setType(other.getType());
+              }
+              if (other.hasModuleLog()) {
+                mergeModuleLog(other.getModuleLog());
+              }
+              if (other.hasServerLog()) {
+                mergeServerLog(other.getServerLog());
+              }
+              if (other.hasMainLog()) {
+                mergeMainLog(other.getMainLog());
+              }
+              this.mergeUnknownFields(other.getUnknownFields());
+              return this;
+            }
+            
+            public Builder mergeFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                com.google.protobuf.UnknownFieldSet.newBuilder(
+                  this.getUnknownFields());
+              while (true) {
+                int tag = input.readTag();
+                switch (tag) {
+                  case 0:
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  default: {
+                    if (!parseUnknownField(input, unknownFields,
+                                           extensionRegistry, tag)) {
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    }
+                    break;
+                  }
+                  case 8: {
+                    int rawValue = input.readEnum();
+                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType.valueOf(rawValue);
+                    if (value == null) {
+                      unknownFields.mergeVarintField(1, rawValue);
+                    } else {
+                      setType(value);
+                    }
+                    break;
+                  }
+                  case 18: {
+                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.newBuilder();
+                    if (hasModuleLog()) {
+                      subBuilder.mergeFrom(getModuleLog());
+                    }
+                    input.readMessage(subBuilder, extensionRegistry);
+                    setModuleLog(subBuilder.buildPartial());
+                    break;
+                  }
+                  case 26: {
+                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.newBuilder();
+                    if (hasServerLog()) {
+                      subBuilder.mergeFrom(getServerLog());
+                    }
+                    input.readMessage(subBuilder, extensionRegistry);
+                    setServerLog(subBuilder.buildPartial());
+                    break;
+                  }
+                  case 34: {
+                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.newBuilder();
+                    if (hasMainLog()) {
+                      subBuilder.mergeFrom(getMainLog());
+                    }
+                    input.readMessage(subBuilder, extensionRegistry);
+                    setMainLog(subBuilder.buildPartial());
+                    break;
+                  }
+                }
+              }
+            }
+            
+            
+            // required .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.LogType type = 1;
+            public boolean hasType() {
+              return result.hasType();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType getType() {
+              return result.getType();
+            }
+            public Builder setType(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType value) {
+              if (value == null) {
+                throw new NullPointerException();
+              }
+              result.hasType = true;
+              result.type_ = value;
+              return this;
+            }
+            public Builder clearType() {
+              result.hasType = false;
+              result.type_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.LogType.MAIN;
+              return this;
+            }
+            
+            // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.ModuleLog moduleLog = 2;
+            public boolean hasModuleLog() {
+              return result.hasModuleLog();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog getModuleLog() {
+              return result.getModuleLog();
+            }
+            public Builder setModuleLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog value) {
+              if (value == null) {
+                throw new NullPointerException();
+              }
+              result.hasModuleLog = true;
+              result.moduleLog_ = value;
+              return this;
+            }
+            public Builder setModuleLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.Builder builderForValue) {
+              result.hasModuleLog = true;
+              result.moduleLog_ = builderForValue.build();
+              return this;
+            }
+            public Builder mergeModuleLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog value) {
+              if (result.hasModuleLog() &&
+                  result.moduleLog_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.getDefaultInstance()) {
+                result.moduleLog_ =
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.newBuilder(result.moduleLog_).mergeFrom(value).buildPartial();
+              } else {
+                result.moduleLog_ = value;
+              }
+              result.hasModuleLog = true;
+              return this;
+            }
+            public Builder clearModuleLog() {
+              result.hasModuleLog = false;
+              result.moduleLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.getDefaultInstance();
+              return this;
+            }
+            
+            // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.ServerLog serverLog = 3;
+            public boolean hasServerLog() {
+              return result.hasServerLog();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog getServerLog() {
+              return result.getServerLog();
+            }
+            public Builder setServerLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog value) {
+              if (value == null) {
+                throw new NullPointerException();
+              }
+              result.hasServerLog = true;
+              result.serverLog_ = value;
+              return this;
+            }
+            public Builder setServerLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.Builder builderForValue) {
+              result.hasServerLog = true;
+              result.serverLog_ = builderForValue.build();
+              return this;
+            }
+            public Builder mergeServerLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog value) {
+              if (result.hasServerLog() &&
+                  result.serverLog_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.getDefaultInstance()) {
+                result.serverLog_ =
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.newBuilder(result.serverLog_).mergeFrom(value).buildPartial();
+              } else {
+                result.serverLog_ = value;
+              }
+              result.hasServerLog = true;
+              return this;
+            }
+            public Builder clearServerLog() {
+              result.hasServerLog = false;
+              result.serverLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.getDefaultInstance();
+              return this;
+            }
+            
+            // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog.MainLog mainLog = 4;
+            public boolean hasMainLog() {
+              return result.hasMainLog();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog getMainLog() {
+              return result.getMainLog();
+            }
+            public Builder setMainLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog value) {
+              if (value == null) {
+                throw new NullPointerException();
+              }
+              result.hasMainLog = true;
+              result.mainLog_ = value;
+              return this;
+            }
+            public Builder setMainLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.Builder builderForValue) {
+              result.hasMainLog = true;
+              result.mainLog_ = builderForValue.build();
+              return this;
+            }
+            public Builder mergeMainLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog value) {
+              if (result.hasMainLog() &&
+                  result.mainLog_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.getDefaultInstance()) {
+                result.mainLog_ =
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.newBuilder(result.mainLog_).mergeFrom(value).buildPartial();
+              } else {
+                result.mainLog_ = value;
+              }
+              result.hasMainLog = true;
+              return this;
+            }
+            public Builder clearMainLog() {
+              result.hasMainLog = false;
+              result.mainLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.getDefaultInstance();
+              return this;
+            }
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+          }
+        }
+        
+        public static final class LogData extends
+            com.google.protobuf.GeneratedMessage {
+          // Use LogData.newBuilder() to construct.
+          private LogData() {}
+          
+          private static final LogData defaultInstance = new LogData();
+          public static LogData getDefaultInstance() {
+            return defaultInstance;
+          }
+          
+          public LogData getDefaultInstanceForType() {
+            return defaultInstance;
+          }
+          
+          public static final com.google.protobuf.Descriptors.Descriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_descriptor;
+          }
+          
+          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+              internalGetFieldAccessorTable() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_fieldAccessorTable;
+          }
+          
+          public static final class HelpInfo extends
+              com.google.protobuf.GeneratedMessage {
+            // Use HelpInfo.newBuilder() to construct.
+            private HelpInfo() {}
+            
+            private static final HelpInfo defaultInstance = new HelpInfo();
+            public static HelpInfo getDefaultInstance() {
+              return defaultInstance;
+            }
+            
+            public HelpInfo getDefaultInstanceForType() {
+              return defaultInstance;
+            }
+            
+            public static final com.google.protobuf.Descriptors.Descriptor
+                getDescriptor() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_HelpInfo_descriptor;
+            }
+            
+            protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+                internalGetFieldAccessorTable() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_HelpInfo_fieldAccessorTable;
+            }
+            
+            // optional string url = 1;
+            public static final int URL_FIELD_NUMBER = 1;
+            private boolean hasUrl;
+            private java.lang.String url_ = "";
+            public boolean hasUrl() { return hasUrl; }
+            public java.lang.String getUrl() { return url_; }
+            
+            // optional string text = 2;
+            public static final int TEXT_FIELD_NUMBER = 2;
+            private boolean hasText;
+            private java.lang.String text_ = "";
+            public boolean hasText() { return hasText; }
+            public java.lang.String getText() { return text_; }
+            
+            public final boolean isInitialized() {
+              return true;
+            }
+            
+            public void writeTo(com.google.protobuf.CodedOutputStream output)
+                                throws java.io.IOException {
+              if (hasUrl()) {
+                output.writeString(1, getUrl());
+              }
+              if (hasText()) {
+                output.writeString(2, getText());
+              }
+              getUnknownFields().writeTo(output);
+            }
+            
+            private int memoizedSerializedSize = -1;
+            public int getSerializedSize() {
+              int size = memoizedSerializedSize;
+              if (size != -1) return size;
+            
+              size = 0;
+              if (hasUrl()) {
+                size += com.google.protobuf.CodedOutputStream
+                  .computeStringSize(1, getUrl());
+              }
+              if (hasText()) {
+                size += com.google.protobuf.CodedOutputStream
+                  .computeStringSize(2, getText());
+              }
+              size += getUnknownFields().getSerializedSize();
+              memoizedSerializedSize = size;
+              return size;
+            }
+            
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(
+                com.google.protobuf.ByteString data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(
+                com.google.protobuf.ByteString data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(byte[] data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(
+                byte[] data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(java.io.InputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseDelimitedFrom(java.io.InputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeDelimitedFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseDelimitedFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(
+                com.google.protobuf.CodedInputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo parseFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            
+            public static Builder newBuilder() { return Builder.create(); }
+            public Builder newBuilderForType() { return newBuilder(); }
+            public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo prototype) {
+              return newBuilder().mergeFrom(prototype);
+            }
+            public Builder toBuilder() { return newBuilder(this); }
+            
+            public static final class Builder extends
+                com.google.protobuf.GeneratedMessage.Builder<Builder> {
+              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo result;
+              
+              // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.newBuilder()
+              private Builder() {}
+              
+              private static Builder create() {
+                Builder builder = new Builder();
+                builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo();
+                return builder;
+              }
+              
+              protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo internalGetResult() {
+                return result;
+              }
+              
+              public Builder clear() {
+                if (result == null) {
+                  throw new IllegalStateException(
+                    "Cannot call clear() after build().");
+                }
+                result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo();
+                return this;
+              }
+              
+              public Builder clone() {
+                return create().mergeFrom(result);
+              }
+              
+              public com.google.protobuf.Descriptors.Descriptor
+                  getDescriptorForType() {
+                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.getDescriptor();
+              }
+              
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo getDefaultInstanceForType() {
+                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.getDefaultInstance();
+              }
+              
+              public boolean isInitialized() {
+                return result.isInitialized();
+              }
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo build() {
+                if (result != null && !isInitialized()) {
+                  throw newUninitializedMessageException(result);
+                }
+                return buildPartial();
+              }
+              
+              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo buildParsed()
+                  throws com.google.protobuf.InvalidProtocolBufferException {
+                if (!isInitialized()) {
+                  throw newUninitializedMessageException(
+                    result).asInvalidProtocolBufferException();
+                }
+                return buildPartial();
+              }
+              
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo buildPartial() {
+                if (result == null) {
+                  throw new IllegalStateException(
+                    "build() has already been called on this Builder.");
+                }
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo returnMe = result;
+                result = null;
+                return returnMe;
+              }
+              
+              public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo) {
+                  return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo)other);
+                } else {
+                  super.mergeFrom(other);
+                  return this;
+                }
+              }
+              
+              public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo other) {
+                if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.getDefaultInstance()) return this;
+                if (other.hasUrl()) {
+                  setUrl(other.getUrl());
+                }
+                if (other.hasText()) {
+                  setText(other.getText());
+                }
+                this.mergeUnknownFields(other.getUnknownFields());
+                return this;
+              }
+              
+              public Builder mergeFrom(
+                  com.google.protobuf.CodedInputStream input,
+                  com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                  throws java.io.IOException {
+                com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                  com.google.protobuf.UnknownFieldSet.newBuilder(
+                    this.getUnknownFields());
+                while (true) {
+                  int tag = input.readTag();
+                  switch (tag) {
+                    case 0:
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    default: {
+                      if (!parseUnknownField(input, unknownFields,
+                                             extensionRegistry, tag)) {
+                        this.setUnknownFields(unknownFields.build());
+                        return this;
+                      }
+                      break;
+                    }
+                    case 10: {
+                      setUrl(input.readString());
+                      break;
+                    }
+                    case 18: {
+                      setText(input.readString());
+                      break;
+                    }
+                  }
+                }
+              }
+              
+              
+              // optional string url = 1;
+              public boolean hasUrl() {
+                return result.hasUrl();
+              }
+              public java.lang.String getUrl() {
+                return result.getUrl();
+              }
+              public Builder setUrl(java.lang.String value) {
+                if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasUrl = true;
+                result.url_ = value;
+                return this;
+              }
+              public Builder clearUrl() {
+                result.hasUrl = false;
+                result.url_ = getDefaultInstance().getUrl();
+                return this;
+              }
+              
+              // optional string text = 2;
+              public boolean hasText() {
+                return result.hasText();
+              }
+              public java.lang.String getText() {
+                return result.getText();
+              }
+              public Builder setText(java.lang.String value) {
+                if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasText = true;
+                result.text_ = value;
+                return this;
+              }
+              public Builder clearText() {
+                result.hasText = false;
+                result.text_ = getDefaultInstance().getText();
+                return this;
+              }
+            }
+            
+            static {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+            }
+            
+            static {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+            }
+          }
+          
+          // required string summary = 1;
+          public static final int SUMMARY_FIELD_NUMBER = 1;
+          private boolean hasSummary;
+          private java.lang.String summary_ = "";
+          public boolean hasSummary() { return hasSummary; }
+          public java.lang.String getSummary() { return summary_; }
+          
+          // optional string level = 2;
+          public static final int LEVEL_FIELD_NUMBER = 2;
+          private boolean hasLevel;
+          private java.lang.String level_ = "";
+          public boolean hasLevel() { return hasLevel; }
+          public java.lang.String getLevel() { return level_; }
+          
+          // optional string details = 3;
+          public static final int DETAILS_FIELD_NUMBER = 3;
+          private boolean hasDetails;
+          private java.lang.String details_ = "";
+          public boolean hasDetails() { return hasDetails; }
+          public java.lang.String getDetails() { return details_; }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.LogData.HelpInfo helpInfo = 4;
+          public static final int HELPINFO_FIELD_NUMBER = 4;
+          private boolean hasHelpInfo;
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo helpInfo_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.getDefaultInstance();
+          public boolean hasHelpInfo() { return hasHelpInfo; }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo getHelpInfo() { return helpInfo_; }
+          
+          public final boolean isInitialized() {
+            if (!hasSummary) return false;
+            return true;
+          }
+          
+          public void writeTo(com.google.protobuf.CodedOutputStream output)
+                              throws java.io.IOException {
+            if (hasSummary()) {
+              output.writeString(1, getSummary());
+            }
+            if (hasLevel()) {
+              output.writeString(2, getLevel());
+            }
+            if (hasDetails()) {
+              output.writeString(3, getDetails());
+            }
+            if (hasHelpInfo()) {
+              output.writeMessage(4, getHelpInfo());
+            }
+            getUnknownFields().writeTo(output);
+          }
+          
+          private int memoizedSerializedSize = -1;
+          public int getSerializedSize() {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+          
+            size = 0;
+            if (hasSummary()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeStringSize(1, getSummary());
+            }
+            if (hasLevel()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeStringSize(2, getLevel());
+            }
+            if (hasDetails()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeStringSize(3, getDetails());
+            }
+            if (hasHelpInfo()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeMessageSize(4, getHelpInfo());
+            }
+            size += getUnknownFields().getSerializedSize();
+            memoizedSerializedSize = size;
+            return size;
+          }
+          
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(
+              com.google.protobuf.ByteString data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(
+              com.google.protobuf.ByteString data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(byte[] data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(
+              byte[] data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseDelimitedFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseDelimitedFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(
+              com.google.protobuf.CodedInputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData parseFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          
+          public static Builder newBuilder() { return Builder.create(); }
+          public Builder newBuilderForType() { return newBuilder(); }
+          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData prototype) {
+            return newBuilder().mergeFrom(prototype);
+          }
+          public Builder toBuilder() { return newBuilder(this); }
+          
+          public static final class Builder extends
+              com.google.protobuf.GeneratedMessage.Builder<Builder> {
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData result;
+            
+            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.newBuilder()
+            private Builder() {}
+            
+            private static Builder create() {
+              Builder builder = new Builder();
+              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData();
+              return builder;
+            }
+            
+            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData internalGetResult() {
+              return result;
+            }
+            
+            public Builder clear() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "Cannot call clear() after build().");
+              }
+              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData();
+              return this;
+            }
+            
+            public Builder clone() {
+              return create().mergeFrom(result);
+            }
+            
+            public com.google.protobuf.Descriptors.Descriptor
+                getDescriptorForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDescriptor();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData getDefaultInstanceForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance();
+            }
+            
+            public boolean isInitialized() {
+              return result.isInitialized();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData build() {
+              if (result != null && !isInitialized()) {
+                throw newUninitializedMessageException(result);
+              }
+              return buildPartial();
+            }
+            
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData buildParsed()
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              if (!isInitialized()) {
+                throw newUninitializedMessageException(
+                  result).asInvalidProtocolBufferException();
+              }
+              return buildPartial();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData buildPartial() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "build() has already been called on this Builder.");
+              }
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData returnMe = result;
+              result = null;
+              return returnMe;
+            }
+            
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData) {
+                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData)other);
+              } else {
+                super.mergeFrom(other);
+                return this;
+              }
+            }
+            
+            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData other) {
+              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance()) return this;
+              if (other.hasSummary()) {
+                setSummary(other.getSummary());
+              }
+              if (other.hasLevel()) {
+                setLevel(other.getLevel());
+              }
+              if (other.hasDetails()) {
+                setDetails(other.getDetails());
+              }
+              if (other.hasHelpInfo()) {
+                mergeHelpInfo(other.getHelpInfo());
+              }
+              this.mergeUnknownFields(other.getUnknownFields());
+              return this;
+            }
+            
+            public Builder mergeFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                com.google.protobuf.UnknownFieldSet.newBuilder(
+                  this.getUnknownFields());
+              while (true) {
+                int tag = input.readTag();
+                switch (tag) {
+                  case 0:
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  default: {
+                    if (!parseUnknownField(input, unknownFields,
+                                           extensionRegistry, tag)) {
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    }
+                    break;
+                  }
+                  case 10: {
+                    setSummary(input.readString());
+                    break;
+                  }
+                  case 18: {
+                    setLevel(input.readString());
+                    break;
+                  }
+                  case 26: {
+                    setDetails(input.readString());
+                    break;
+                  }
+                  case 34: {
+                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.newBuilder();
+                    if (hasHelpInfo()) {
+                      subBuilder.mergeFrom(getHelpInfo());
+                    }
+                    input.readMessage(subBuilder, extensionRegistry);
+                    setHelpInfo(subBuilder.buildPartial());
+                    break;
+                  }
+                }
+              }
+            }
+            
+            
+            // required string summary = 1;
+            public boolean hasSummary() {
+              return result.hasSummary();
+            }
+            public java.lang.String getSummary() {
+              return result.getSummary();
+            }
+            public Builder setSummary(java.lang.String value) {
+              if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasSummary = true;
+              result.summary_ = value;
+              return this;
+            }
+            public Builder clearSummary() {
+              result.hasSummary = false;
+              result.summary_ = getDefaultInstance().getSummary();
+              return this;
+            }
+            
+            // optional string level = 2;
+            public boolean hasLevel() {
+              return result.hasLevel();
+            }
+            public java.lang.String getLevel() {
+              return result.getLevel();
+            }
+            public Builder setLevel(java.lang.String value) {
+              if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasLevel = true;
+              result.level_ = value;
+              return this;
+            }
+            public Builder clearLevel() {
+              result.hasLevel = false;
+              result.level_ = getDefaultInstance().getLevel();
+              return this;
+            }
+            
+            // optional string details = 3;
+            public boolean hasDetails() {
+              return result.hasDetails();
+            }
+            public java.lang.String getDetails() {
+              return result.getDetails();
+            }
+            public Builder setDetails(java.lang.String value) {
+              if (value == null) {
+    throw new NullPointerException();
+  }
+  result.hasDetails = true;
+              result.details_ = value;
+              return this;
+            }
+            public Builder clearDetails() {
+              result.hasDetails = false;
+              result.details_ = getDefaultInstance().getDetails();
+              return this;
+            }
+            
+            // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.LogData.HelpInfo helpInfo = 4;
+            public boolean hasHelpInfo() {
+              return result.hasHelpInfo();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo getHelpInfo() {
+              return result.getHelpInfo();
+            }
+            public Builder setHelpInfo(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo value) {
+              if (value == null) {
+                throw new NullPointerException();
+              }
+              result.hasHelpInfo = true;
+              result.helpInfo_ = value;
+              return this;
+            }
+            public Builder setHelpInfo(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.Builder builderForValue) {
+              result.hasHelpInfo = true;
+              result.helpInfo_ = builderForValue.build();
+              return this;
+            }
+            public Builder mergeHelpInfo(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo value) {
+              if (result.hasHelpInfo() &&
+                  result.helpInfo_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.getDefaultInstance()) {
+                result.helpInfo_ =
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.newBuilder(result.helpInfo_).mergeFrom(value).buildPartial();
+              } else {
+                result.helpInfo_ = value;
+              }
+              result.hasHelpInfo = true;
+              return this;
+            }
+            public Builder clearHelpInfo() {
+              result.hasHelpInfo = false;
+              result.helpInfo_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.getDefaultInstance();
+              return this;
+            }
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+          }
+        }
+        
+        public static final class AddLogBranch extends
+            com.google.protobuf.GeneratedMessage {
+          // Use AddLogBranch.newBuilder() to construct.
+          private AddLogBranch() {}
+          
+          private static final AddLogBranch defaultInstance = new AddLogBranch();
+          public static AddLogBranch getDefaultInstance() {
+            return defaultInstance;
+          }
+          
+          public AddLogBranch getDefaultInstanceForType() {
+            return defaultInstance;
+          }
+          
+          public static final com.google.protobuf.Descriptors.Descriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogBranch_descriptor;
+          }
+          
+          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+              internalGetFieldAccessorTable() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogBranch_fieldAccessorTable;
+          }
+          
+          // required uint32 parentLogHandle = 1;
+          public static final int PARENTLOGHANDLE_FIELD_NUMBER = 1;
+          private boolean hasParentLogHandle;
+          private int parentLogHandle_ = 0;
+          public boolean hasParentLogHandle() { return hasParentLogHandle; }
+          public int getParentLogHandle() { return parentLogHandle_; }
+          
+          // required uint32 indexInParent = 2;
+          public static final int INDEXINPARENT_FIELD_NUMBER = 2;
+          private boolean hasIndexInParent;
+          private int indexInParent_ = 0;
+          public boolean hasIndexInParent() { return hasIndexInParent; }
+          public int getIndexInParent() { return indexInParent_; }
+          
+          // required .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.LogData logData = 3;
+          public static final int LOGDATA_FIELD_NUMBER = 3;
+          private boolean hasLogData;
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData logData_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance();
+          public boolean hasLogData() { return hasLogData; }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData getLogData() { return logData_; }
+          
+          public final boolean isInitialized() {
+            if (!hasParentLogHandle) return false;
+            if (!hasIndexInParent) return false;
+            if (!hasLogData) return false;
+            if (!getLogData().isInitialized()) return false;
+            return true;
+          }
+          
+          public void writeTo(com.google.protobuf.CodedOutputStream output)
+                              throws java.io.IOException {
+            if (hasParentLogHandle()) {
+              output.writeUInt32(1, getParentLogHandle());
+            }
+            if (hasIndexInParent()) {
+              output.writeUInt32(2, getIndexInParent());
+            }
+            if (hasLogData()) {
+              output.writeMessage(3, getLogData());
+            }
+            getUnknownFields().writeTo(output);
+          }
+          
+          private int memoizedSerializedSize = -1;
+          public int getSerializedSize() {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+          
+            size = 0;
+            if (hasParentLogHandle()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeUInt32Size(1, getParentLogHandle());
+            }
+            if (hasIndexInParent()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeUInt32Size(2, getIndexInParent());
+            }
+            if (hasLogData()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeMessageSize(3, getLogData());
+            }
+            size += getUnknownFields().getSerializedSize();
+            memoizedSerializedSize = size;
+            return size;
+          }
+          
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(
+              com.google.protobuf.ByteString data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(
+              com.google.protobuf.ByteString data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(byte[] data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(
+              byte[] data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseDelimitedFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseDelimitedFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(
+              com.google.protobuf.CodedInputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch parseFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          
+          public static Builder newBuilder() { return Builder.create(); }
+          public Builder newBuilderForType() { return newBuilder(); }
+          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch prototype) {
+            return newBuilder().mergeFrom(prototype);
+          }
+          public Builder toBuilder() { return newBuilder(this); }
+          
+          public static final class Builder extends
+              com.google.protobuf.GeneratedMessage.Builder<Builder> {
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch result;
+            
+            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.newBuilder()
+            private Builder() {}
+            
+            private static Builder create() {
+              Builder builder = new Builder();
+              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch();
+              return builder;
+            }
+            
+            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch internalGetResult() {
+              return result;
+            }
+            
+            public Builder clear() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "Cannot call clear() after build().");
+              }
+              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch();
+              return this;
+            }
+            
+            public Builder clone() {
+              return create().mergeFrom(result);
+            }
+            
+            public com.google.protobuf.Descriptors.Descriptor
+                getDescriptorForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.getDescriptor();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch getDefaultInstanceForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.getDefaultInstance();
+            }
+            
+            public boolean isInitialized() {
+              return result.isInitialized();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch build() {
+              if (result != null && !isInitialized()) {
+                throw newUninitializedMessageException(result);
+              }
+              return buildPartial();
+            }
+            
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch buildParsed()
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              if (!isInitialized()) {
+                throw newUninitializedMessageException(
+                  result).asInvalidProtocolBufferException();
+              }
+              return buildPartial();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch buildPartial() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "build() has already been called on this Builder.");
+              }
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch returnMe = result;
+              result = null;
+              return returnMe;
+            }
+            
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch) {
+                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch)other);
+              } else {
+                super.mergeFrom(other);
+                return this;
+              }
+            }
+            
+            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch other) {
+              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.getDefaultInstance()) return this;
+              if (other.hasParentLogHandle()) {
+                setParentLogHandle(other.getParentLogHandle());
+              }
+              if (other.hasIndexInParent()) {
+                setIndexInParent(other.getIndexInParent());
+              }
+              if (other.hasLogData()) {
+                mergeLogData(other.getLogData());
+              }
+              this.mergeUnknownFields(other.getUnknownFields());
+              return this;
+            }
+            
+            public Builder mergeFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                com.google.protobuf.UnknownFieldSet.newBuilder(
+                  this.getUnknownFields());
+              while (true) {
+                int tag = input.readTag();
+                switch (tag) {
+                  case 0:
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  default: {
+                    if (!parseUnknownField(input, unknownFields,
+                                           extensionRegistry, tag)) {
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    }
+                    break;
+                  }
+                  case 8: {
+                    setParentLogHandle(input.readUInt32());
+                    break;
+                  }
+                  case 16: {
+                    setIndexInParent(input.readUInt32());
+                    break;
+                  }
+                  case 26: {
+                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.newBuilder();
+                    if (hasLogData()) {
+                      subBuilder.mergeFrom(getLogData());
+                    }
+                    input.readMessage(subBuilder, extensionRegistry);
+                    setLogData(subBuilder.buildPartial());
+                    break;
+                  }
+                }
+              }
+            }
+            
+            
+            // required uint32 parentLogHandle = 1;
+            public boolean hasParentLogHandle() {
+              return result.hasParentLogHandle();
+            }
+            public int getParentLogHandle() {
+              return result.getParentLogHandle();
+            }
+            public Builder setParentLogHandle(int value) {
+              result.hasParentLogHandle = true;
+              result.parentLogHandle_ = value;
+              return this;
+            }
+            public Builder clearParentLogHandle() {
+              result.hasParentLogHandle = false;
+              result.parentLogHandle_ = 0;
+              return this;
+            }
+            
+            // required uint32 indexInParent = 2;
+            public boolean hasIndexInParent() {
+              return result.hasIndexInParent();
+            }
+            public int getIndexInParent() {
+              return result.getIndexInParent();
+            }
+            public Builder setIndexInParent(int value) {
+              result.hasIndexInParent = true;
+              result.indexInParent_ = value;
+              return this;
+            }
+            public Builder clearIndexInParent() {
+              result.hasIndexInParent = false;
+              result.indexInParent_ = 0;
+              return this;
+            }
+            
+            // required .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.LogData logData = 3;
+            public boolean hasLogData() {
+              return result.hasLogData();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData getLogData() {
+              return result.getLogData();
+            }
+            public Builder setLogData(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData value) {
+              if (value == null) {
+                throw new NullPointerException();
+              }
+              result.hasLogData = true;
+              result.logData_ = value;
+              return this;
+            }
+            public Builder setLogData(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.Builder builderForValue) {
+              result.hasLogData = true;
+              result.logData_ = builderForValue.build();
+              return this;
+            }
+            public Builder mergeLogData(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData value) {
+              if (result.hasLogData() &&
+                  result.logData_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance()) {
+                result.logData_ =
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.newBuilder(result.logData_).mergeFrom(value).buildPartial();
+              } else {
+                result.logData_ = value;
+              }
+              result.hasLogData = true;
+              return this;
+            }
+            public Builder clearLogData() {
+              result.hasLogData = false;
+              result.logData_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance();
+              return this;
+            }
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+          }
+        }
+        
+        public static final class AddLogEntry extends
+            com.google.protobuf.GeneratedMessage {
+          // Use AddLogEntry.newBuilder() to construct.
+          private AddLogEntry() {}
+          
+          private static final AddLogEntry defaultInstance = new AddLogEntry();
+          public static AddLogEntry getDefaultInstance() {
+            return defaultInstance;
+          }
+          
+          public AddLogEntry getDefaultInstanceForType() {
+            return defaultInstance;
+          }
+          
+          public static final com.google.protobuf.Descriptors.Descriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogEntry_descriptor;
+          }
+          
+          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+              internalGetFieldAccessorTable() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogEntry_fieldAccessorTable;
+          }
+          
+          // required uint32 logHandle = 1;
+          public static final int LOGHANDLE_FIELD_NUMBER = 1;
+          private boolean hasLogHandle;
+          private int logHandle_ = 0;
+          public boolean hasLogHandle() { return hasLogHandle; }
+          public int getLogHandle() { return logHandle_; }
+          
+          // required uint32 indexInLog = 2;
+          public static final int INDEXINLOG_FIELD_NUMBER = 2;
+          private boolean hasIndexInLog;
+          private int indexInLog_ = 0;
+          public boolean hasIndexInLog() { return hasIndexInLog; }
+          public int getIndexInLog() { return indexInLog_; }
+          
+          // required .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.LogData logData = 3;
+          public static final int LOGDATA_FIELD_NUMBER = 3;
+          private boolean hasLogData;
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData logData_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance();
+          public boolean hasLogData() { return hasLogData; }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData getLogData() { return logData_; }
+          
+          public final boolean isInitialized() {
+            if (!hasLogHandle) return false;
+            if (!hasIndexInLog) return false;
+            if (!hasLogData) return false;
+            if (!getLogData().isInitialized()) return false;
+            return true;
+          }
+          
+          public void writeTo(com.google.protobuf.CodedOutputStream output)
+                              throws java.io.IOException {
+            if (hasLogHandle()) {
+              output.writeUInt32(1, getLogHandle());
+            }
+            if (hasIndexInLog()) {
+              output.writeUInt32(2, getIndexInLog());
+            }
+            if (hasLogData()) {
+              output.writeMessage(3, getLogData());
+            }
+            getUnknownFields().writeTo(output);
+          }
+          
+          private int memoizedSerializedSize = -1;
+          public int getSerializedSize() {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+          
+            size = 0;
+            if (hasLogHandle()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeUInt32Size(1, getLogHandle());
+            }
+            if (hasIndexInLog()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeUInt32Size(2, getIndexInLog());
+            }
+            if (hasLogData()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeMessageSize(3, getLogData());
+            }
+            size += getUnknownFields().getSerializedSize();
+            memoizedSerializedSize = size;
+            return size;
+          }
+          
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(
+              com.google.protobuf.ByteString data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(
+              com.google.protobuf.ByteString data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(byte[] data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(
+              byte[] data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseDelimitedFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseDelimitedFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(
+              com.google.protobuf.CodedInputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry parseFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          
+          public static Builder newBuilder() { return Builder.create(); }
+          public Builder newBuilderForType() { return newBuilder(); }
+          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry prototype) {
+            return newBuilder().mergeFrom(prototype);
+          }
+          public Builder toBuilder() { return newBuilder(this); }
+          
+          public static final class Builder extends
+              com.google.protobuf.GeneratedMessage.Builder<Builder> {
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry result;
+            
+            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.newBuilder()
+            private Builder() {}
+            
+            private static Builder create() {
+              Builder builder = new Builder();
+              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry();
+              return builder;
+            }
+            
+            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry internalGetResult() {
+              return result;
+            }
+            
+            public Builder clear() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "Cannot call clear() after build().");
+              }
+              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry();
+              return this;
+            }
+            
+            public Builder clone() {
+              return create().mergeFrom(result);
+            }
+            
+            public com.google.protobuf.Descriptors.Descriptor
+                getDescriptorForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.getDescriptor();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry getDefaultInstanceForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.getDefaultInstance();
+            }
+            
+            public boolean isInitialized() {
+              return result.isInitialized();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry build() {
+              if (result != null && !isInitialized()) {
+                throw newUninitializedMessageException(result);
+              }
+              return buildPartial();
+            }
+            
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry buildParsed()
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              if (!isInitialized()) {
+                throw newUninitializedMessageException(
+                  result).asInvalidProtocolBufferException();
+              }
+              return buildPartial();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry buildPartial() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "build() has already been called on this Builder.");
+              }
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry returnMe = result;
+              result = null;
+              return returnMe;
+            }
+            
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry) {
+                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry)other);
+              } else {
+                super.mergeFrom(other);
+                return this;
+              }
+            }
+            
+            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry other) {
+              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.getDefaultInstance()) return this;
+              if (other.hasLogHandle()) {
+                setLogHandle(other.getLogHandle());
+              }
+              if (other.hasIndexInLog()) {
+                setIndexInLog(other.getIndexInLog());
+              }
+              if (other.hasLogData()) {
+                mergeLogData(other.getLogData());
+              }
+              this.mergeUnknownFields(other.getUnknownFields());
+              return this;
+            }
+            
+            public Builder mergeFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                com.google.protobuf.UnknownFieldSet.newBuilder(
+                  this.getUnknownFields());
+              while (true) {
+                int tag = input.readTag();
+                switch (tag) {
+                  case 0:
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  default: {
+                    if (!parseUnknownField(input, unknownFields,
+                                           extensionRegistry, tag)) {
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    }
+                    break;
+                  }
+                  case 8: {
+                    setLogHandle(input.readUInt32());
+                    break;
+                  }
+                  case 16: {
+                    setIndexInLog(input.readUInt32());
+                    break;
+                  }
+                  case 26: {
+                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.newBuilder();
+                    if (hasLogData()) {
+                      subBuilder.mergeFrom(getLogData());
+                    }
+                    input.readMessage(subBuilder, extensionRegistry);
+                    setLogData(subBuilder.buildPartial());
+                    break;
+                  }
+                }
+              }
+            }
+            
+            
+            // required uint32 logHandle = 1;
+            public boolean hasLogHandle() {
+              return result.hasLogHandle();
+            }
+            public int getLogHandle() {
+              return result.getLogHandle();
+            }
+            public Builder setLogHandle(int value) {
+              result.hasLogHandle = true;
+              result.logHandle_ = value;
+              return this;
+            }
+            public Builder clearLogHandle() {
+              result.hasLogHandle = false;
+              result.logHandle_ = 0;
+              return this;
+            }
+            
+            // required uint32 indexInLog = 2;
+            public boolean hasIndexInLog() {
+              return result.hasIndexInLog();
+            }
+            public int getIndexInLog() {
+              return result.getIndexInLog();
+            }
+            public Builder setIndexInLog(int value) {
+              result.hasIndexInLog = true;
+              result.indexInLog_ = value;
+              return this;
+            }
+            public Builder clearIndexInLog() {
+              result.hasIndexInLog = false;
+              result.indexInLog_ = 0;
+              return this;
+            }
+            
+            // required .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.LogData logData = 3;
+            public boolean hasLogData() {
+              return result.hasLogData();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData getLogData() {
+              return result.getLogData();
+            }
+            public Builder setLogData(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData value) {
+              if (value == null) {
+                throw new NullPointerException();
+              }
+              result.hasLogData = true;
+              result.logData_ = value;
+              return this;
+            }
+            public Builder setLogData(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.Builder builderForValue) {
+              result.hasLogData = true;
+              result.logData_ = builderForValue.build();
+              return this;
+            }
+            public Builder mergeLogData(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData value) {
+              if (result.hasLogData() &&
+                  result.logData_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance()) {
+                result.logData_ =
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.newBuilder(result.logData_).mergeFrom(value).buildPartial();
+              } else {
+                result.logData_ = value;
+              }
+              result.hasLogData = true;
+              return this;
+            }
+            public Builder clearLogData() {
+              result.hasLogData = false;
+              result.logData_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.getDefaultInstance();
+              return this;
+            }
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+          }
+        }
+        
+        public static final class DisconnectLog extends
+            com.google.protobuf.GeneratedMessage {
+          // Use DisconnectLog.newBuilder() to construct.
+          private DisconnectLog() {}
+          
+          private static final DisconnectLog defaultInstance = new DisconnectLog();
+          public static DisconnectLog getDefaultInstance() {
+            return defaultInstance;
+          }
+          
+          public DisconnectLog getDefaultInstanceForType() {
+            return defaultInstance;
+          }
+          
+          public static final com.google.protobuf.Descriptors.Descriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_DisconnectLog_descriptor;
+          }
+          
+          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+              internalGetFieldAccessorTable() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_DisconnectLog_fieldAccessorTable;
+          }
+          
+          // required uint32 logHandle = 1;
+          public static final int LOGHANDLE_FIELD_NUMBER = 1;
+          private boolean hasLogHandle;
+          private int logHandle_ = 0;
+          public boolean hasLogHandle() { return hasLogHandle; }
+          public int getLogHandle() { return logHandle_; }
+          
+          public final boolean isInitialized() {
+            if (!hasLogHandle) return false;
+            return true;
+          }
+          
+          public void writeTo(com.google.protobuf.CodedOutputStream output)
+                              throws java.io.IOException {
+            if (hasLogHandle()) {
+              output.writeUInt32(1, getLogHandle());
+            }
+            getUnknownFields().writeTo(output);
+          }
+          
+          private int memoizedSerializedSize = -1;
+          public int getSerializedSize() {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+          
+            size = 0;
+            if (hasLogHandle()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeUInt32Size(1, getLogHandle());
+            }
+            size += getUnknownFields().getSerializedSize();
+            memoizedSerializedSize = size;
+            return size;
+          }
+          
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(
+              com.google.protobuf.ByteString data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(
+              com.google.protobuf.ByteString data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(byte[] data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(
+              byte[] data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseDelimitedFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseDelimitedFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(
+              com.google.protobuf.CodedInputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog parseFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          
+          public static Builder newBuilder() { return Builder.create(); }
+          public Builder newBuilderForType() { return newBuilder(); }
+          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog prototype) {
+            return newBuilder().mergeFrom(prototype);
+          }
+          public Builder toBuilder() { return newBuilder(this); }
+          
+          public static final class Builder extends
+              com.google.protobuf.GeneratedMessage.Builder<Builder> {
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog result;
+            
+            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.newBuilder()
+            private Builder() {}
+            
+            private static Builder create() {
+              Builder builder = new Builder();
+              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog();
+              return builder;
+            }
+            
+            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog internalGetResult() {
+              return result;
+            }
+            
+            public Builder clear() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "Cannot call clear() after build().");
+              }
+              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog();
+              return this;
+            }
+            
+            public Builder clone() {
+              return create().mergeFrom(result);
+            }
+            
+            public com.google.protobuf.Descriptors.Descriptor
+                getDescriptorForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.getDescriptor();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog getDefaultInstanceForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.getDefaultInstance();
+            }
+            
+            public boolean isInitialized() {
+              return result.isInitialized();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog build() {
+              if (result != null && !isInitialized()) {
+                throw newUninitializedMessageException(result);
+              }
+              return buildPartial();
+            }
+            
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog buildParsed()
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              if (!isInitialized()) {
+                throw newUninitializedMessageException(
+                  result).asInvalidProtocolBufferException();
+              }
+              return buildPartial();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog buildPartial() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "build() has already been called on this Builder.");
+              }
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog returnMe = result;
+              result = null;
+              return returnMe;
+            }
+            
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog) {
+                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog)other);
+              } else {
+                super.mergeFrom(other);
+                return this;
+              }
+            }
+            
+            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog other) {
+              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.getDefaultInstance()) return this;
+              if (other.hasLogHandle()) {
+                setLogHandle(other.getLogHandle());
+              }
+              this.mergeUnknownFields(other.getUnknownFields());
+              return this;
+            }
+            
+            public Builder mergeFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                com.google.protobuf.UnknownFieldSet.newBuilder(
+                  this.getUnknownFields());
+              while (true) {
+                int tag = input.readTag();
+                switch (tag) {
+                  case 0:
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  default: {
+                    if (!parseUnknownField(input, unknownFields,
+                                           extensionRegistry, tag)) {
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    }
+                    break;
+                  }
+                  case 8: {
+                    setLogHandle(input.readUInt32());
+                    break;
+                  }
+                }
+              }
+            }
+            
+            
+            // required uint32 logHandle = 1;
+            public boolean hasLogHandle() {
+              return result.hasLogHandle();
+            }
+            public int getLogHandle() {
+              return result.getLogHandle();
+            }
+            public Builder setLogHandle(int value) {
+              result.hasLogHandle = true;
+              result.logHandle_ = value;
+              return this;
+            }
+            public Builder clearLogHandle() {
+              result.hasLogHandle = false;
+              result.logHandle_ = 0;
+              return this;
+            }
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+          }
+        }
+        
+        // required .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.RequestType requestType = 1;
+        public static final int REQUESTTYPE_FIELD_NUMBER = 1;
+        private boolean hasRequestType;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType requestType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType.CAPABILITY_EXCHANGE;
+        public boolean hasRequestType() { return hasRequestType; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType getRequestType() { return requestType_; }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.CapabilityExchange capabilityExchange = 2;
+        public static final int CAPABILITYEXCHANGE_FIELD_NUMBER = 2;
+        private boolean hasCapabilityExchange;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.getDefaultInstance();
+        public boolean hasCapabilityExchange() { return hasCapabilityExchange; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange getCapabilityExchange() { return capabilityExchange_; }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog addLog = 3;
+        public static final int ADDLOG_FIELD_NUMBER = 3;
+        private boolean hasAddLog;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog addLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.getDefaultInstance();
+        public boolean hasAddLog() { return hasAddLog; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog getAddLog() { return addLog_; }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLogBranch addLogBranch = 4;
+        public static final int ADDLOGBRANCH_FIELD_NUMBER = 4;
+        private boolean hasAddLogBranch;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch addLogBranch_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.getDefaultInstance();
+        public boolean hasAddLogBranch() { return hasAddLogBranch; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch getAddLogBranch() { return addLogBranch_; }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLogEntry addLogEntry = 5;
+        public static final int ADDLOGENTRY_FIELD_NUMBER = 5;
+        private boolean hasAddLogEntry;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry addLogEntry_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.getDefaultInstance();
+        public boolean hasAddLogEntry() { return hasAddLogEntry; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry getAddLogEntry() { return addLogEntry_; }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.DisconnectLog disconnectLog = 6;
+        public static final int DISCONNECTLOG_FIELD_NUMBER = 6;
+        private boolean hasDisconnectLog;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog disconnectLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.getDefaultInstance();
+        public boolean hasDisconnectLog() { return hasDisconnectLog; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog getDisconnectLog() { return disconnectLog_; }
+        
+        public final boolean isInitialized() {
+          if (!hasRequestType) return false;
+          if (hasAddLog()) {
+            if (!getAddLog().isInitialized()) return false;
+          }
+          if (hasAddLogBranch()) {
+            if (!getAddLogBranch().isInitialized()) return false;
+          }
+          if (hasAddLogEntry()) {
+            if (!getAddLogEntry().isInitialized()) return false;
+          }
+          if (hasDisconnectLog()) {
+            if (!getDisconnectLog().isInitialized()) return false;
+          }
+          return true;
+        }
+        
+        public void writeTo(com.google.protobuf.CodedOutputStream output)
+                            throws java.io.IOException {
+          if (hasRequestType()) {
+            output.writeEnum(1, getRequestType().getNumber());
+          }
+          if (hasCapabilityExchange()) {
+            output.writeMessage(2, getCapabilityExchange());
+          }
+          if (hasAddLog()) {
+            output.writeMessage(3, getAddLog());
+          }
+          if (hasAddLogBranch()) {
+            output.writeMessage(4, getAddLogBranch());
+          }
+          if (hasAddLogEntry()) {
+            output.writeMessage(5, getAddLogEntry());
+          }
+          if (hasDisconnectLog()) {
+            output.writeMessage(6, getDisconnectLog());
+          }
+          getUnknownFields().writeTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public int getSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+        
+          size = 0;
+          if (hasRequestType()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeEnumSize(1, getRequestType().getNumber());
+          }
+          if (hasCapabilityExchange()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeMessageSize(2, getCapabilityExchange());
+          }
+          if (hasAddLog()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeMessageSize(3, getAddLog());
+          }
+          if (hasAddLogBranch()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeMessageSize(4, getAddLogBranch());
+          }
+          if (hasAddLogEntry()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeMessageSize(5, getAddLogEntry());
+          }
+          if (hasDisconnectLog()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeMessageSize(6, getDisconnectLog());
+          }
+          size += getUnknownFields().getSerializedSize();
+          memoizedSerializedSize = size;
+          return size;
+        }
+        
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(
+            com.google.protobuf.ByteString data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(
+            com.google.protobuf.ByteString data,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(byte[] data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(
+            byte[] data,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(java.io.InputStream input)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(
+            java.io.InputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseDelimitedFrom(java.io.InputStream input)
+            throws java.io.IOException {
+          return newBuilder().mergeDelimitedFrom(input).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseDelimitedFrom(
+            java.io.InputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(
+            com.google.protobuf.CodedInputStream input)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest parseFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input, extensionRegistry)
+                   .buildParsed();
+        }
+        
+        public static Builder newBuilder() { return Builder.create(); }
+        public Builder newBuilderForType() { return newBuilder(); }
+        public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest prototype) {
+          return newBuilder().mergeFrom(prototype);
+        }
+        public Builder toBuilder() { return newBuilder(this); }
+        
+        public static final class Builder extends
+            com.google.protobuf.GeneratedMessage.Builder<Builder> {
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest result;
+          
+          // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.newBuilder()
+          private Builder() {}
+          
+          private static Builder create() {
+            Builder builder = new Builder();
+            builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest();
+            return builder;
+          }
+          
+          protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest internalGetResult() {
+            return result;
+          }
+          
+          public Builder clear() {
+            if (result == null) {
+              throw new IllegalStateException(
+                "Cannot call clear() after build().");
+            }
+            result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest();
+            return this;
+          }
+          
+          public Builder clone() {
+            return create().mergeFrom(result);
+          }
+          
+          public com.google.protobuf.Descriptors.Descriptor
+              getDescriptorForType() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.getDescriptor();
+          }
+          
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest getDefaultInstanceForType() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.getDefaultInstance();
+          }
+          
+          public boolean isInitialized() {
+            return result.isInitialized();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest build() {
+            if (result != null && !isInitialized()) {
+              throw newUninitializedMessageException(result);
+            }
+            return buildPartial();
+          }
+          
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest buildParsed()
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            if (!isInitialized()) {
+              throw newUninitializedMessageException(
+                result).asInvalidProtocolBufferException();
+            }
+            return buildPartial();
+          }
+          
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest buildPartial() {
+            if (result == null) {
+              throw new IllegalStateException(
+                "build() has already been called on this Builder.");
+            }
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public Builder mergeFrom(com.google.protobuf.Message other) {
+            if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest) {
+              return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest)other);
+            } else {
+              super.mergeFrom(other);
+              return this;
+            }
+          }
+          
+          public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest other) {
+            if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.getDefaultInstance()) return this;
+            if (other.hasRequestType()) {
+              setRequestType(other.getRequestType());
+            }
+            if (other.hasCapabilityExchange()) {
+              mergeCapabilityExchange(other.getCapabilityExchange());
+            }
+            if (other.hasAddLog()) {
+              mergeAddLog(other.getAddLog());
+            }
+            if (other.hasAddLogBranch()) {
+              mergeAddLogBranch(other.getAddLogBranch());
+            }
+            if (other.hasAddLogEntry()) {
+              mergeAddLogEntry(other.getAddLogEntry());
+            }
+            if (other.hasDisconnectLog()) {
+              mergeDisconnectLog(other.getDisconnectLog());
+            }
+            this.mergeUnknownFields(other.getUnknownFields());
+            return this;
+          }
+          
+          public Builder mergeFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+              com.google.protobuf.UnknownFieldSet.newBuilder(
+                this.getUnknownFields());
+            while (true) {
+              int tag = input.readTag();
+              switch (tag) {
+                case 0:
+                  this.setUnknownFields(unknownFields.build());
+                  return this;
+                default: {
+                  if (!parseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  }
+                  break;
+                }
+                case 8: {
+                  int rawValue = input.readEnum();
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType.valueOf(rawValue);
+                  if (value == null) {
+                    unknownFields.mergeVarintField(1, rawValue);
+                  } else {
+                    setRequestType(value);
+                  }
+                  break;
+                }
+                case 18: {
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.newBuilder();
+                  if (hasCapabilityExchange()) {
+                    subBuilder.mergeFrom(getCapabilityExchange());
+                  }
+                  input.readMessage(subBuilder, extensionRegistry);
+                  setCapabilityExchange(subBuilder.buildPartial());
+                  break;
+                }
+                case 26: {
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.newBuilder();
+                  if (hasAddLog()) {
+                    subBuilder.mergeFrom(getAddLog());
+                  }
+                  input.readMessage(subBuilder, extensionRegistry);
+                  setAddLog(subBuilder.buildPartial());
+                  break;
+                }
+                case 34: {
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.newBuilder();
+                  if (hasAddLogBranch()) {
+                    subBuilder.mergeFrom(getAddLogBranch());
+                  }
+                  input.readMessage(subBuilder, extensionRegistry);
+                  setAddLogBranch(subBuilder.buildPartial());
+                  break;
+                }
+                case 42: {
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.newBuilder();
+                  if (hasAddLogEntry()) {
+                    subBuilder.mergeFrom(getAddLogEntry());
+                  }
+                  input.readMessage(subBuilder, extensionRegistry);
+                  setAddLogEntry(subBuilder.buildPartial());
+                  break;
+                }
+                case 50: {
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.newBuilder();
+                  if (hasDisconnectLog()) {
+                    subBuilder.mergeFrom(getDisconnectLog());
+                  }
+                  input.readMessage(subBuilder, extensionRegistry);
+                  setDisconnectLog(subBuilder.buildPartial());
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // required .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.RequestType requestType = 1;
+          public boolean hasRequestType() {
+            return result.hasRequestType();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType getRequestType() {
+            return result.getRequestType();
+          }
+          public Builder setRequestType(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasRequestType = true;
+            result.requestType_ = value;
+            return this;
+          }
+          public Builder clearRequestType() {
+            result.hasRequestType = false;
+            result.requestType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType.CAPABILITY_EXCHANGE;
+            return this;
+          }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.CapabilityExchange capabilityExchange = 2;
+          public boolean hasCapabilityExchange() {
+            return result.hasCapabilityExchange();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange getCapabilityExchange() {
+            return result.getCapabilityExchange();
+          }
+          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasCapabilityExchange = true;
+            result.capabilityExchange_ = value;
+            return this;
+          }
+          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.Builder builderForValue) {
+            result.hasCapabilityExchange = true;
+            result.capabilityExchange_ = builderForValue.build();
+            return this;
+          }
+          public Builder mergeCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange value) {
+            if (result.hasCapabilityExchange() &&
+                result.capabilityExchange_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.getDefaultInstance()) {
+              result.capabilityExchange_ =
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.newBuilder(result.capabilityExchange_).mergeFrom(value).buildPartial();
+            } else {
+              result.capabilityExchange_ = value;
+            }
+            result.hasCapabilityExchange = true;
+            return this;
+          }
+          public Builder clearCapabilityExchange() {
+            result.hasCapabilityExchange = false;
+            result.capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.getDefaultInstance();
+            return this;
+          }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLog addLog = 3;
+          public boolean hasAddLog() {
+            return result.hasAddLog();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog getAddLog() {
+            return result.getAddLog();
+          }
+          public Builder setAddLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasAddLog = true;
+            result.addLog_ = value;
+            return this;
+          }
+          public Builder setAddLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.Builder builderForValue) {
+            result.hasAddLog = true;
+            result.addLog_ = builderForValue.build();
+            return this;
+          }
+          public Builder mergeAddLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog value) {
+            if (result.hasAddLog() &&
+                result.addLog_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.getDefaultInstance()) {
+              result.addLog_ =
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.newBuilder(result.addLog_).mergeFrom(value).buildPartial();
+            } else {
+              result.addLog_ = value;
+            }
+            result.hasAddLog = true;
+            return this;
+          }
+          public Builder clearAddLog() {
+            result.hasAddLog = false;
+            result.addLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.getDefaultInstance();
+            return this;
+          }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLogBranch addLogBranch = 4;
+          public boolean hasAddLogBranch() {
+            return result.hasAddLogBranch();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch getAddLogBranch() {
+            return result.getAddLogBranch();
+          }
+          public Builder setAddLogBranch(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasAddLogBranch = true;
+            result.addLogBranch_ = value;
+            return this;
+          }
+          public Builder setAddLogBranch(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.Builder builderForValue) {
+            result.hasAddLogBranch = true;
+            result.addLogBranch_ = builderForValue.build();
+            return this;
+          }
+          public Builder mergeAddLogBranch(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch value) {
+            if (result.hasAddLogBranch() &&
+                result.addLogBranch_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.getDefaultInstance()) {
+              result.addLogBranch_ =
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.newBuilder(result.addLogBranch_).mergeFrom(value).buildPartial();
+            } else {
+              result.addLogBranch_ = value;
+            }
+            result.hasAddLogBranch = true;
+            return this;
+          }
+          public Builder clearAddLogBranch() {
+            result.hasAddLogBranch = false;
+            result.addLogBranch_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.getDefaultInstance();
+            return this;
+          }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.AddLogEntry addLogEntry = 5;
+          public boolean hasAddLogEntry() {
+            return result.hasAddLogEntry();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry getAddLogEntry() {
+            return result.getAddLogEntry();
+          }
+          public Builder setAddLogEntry(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasAddLogEntry = true;
+            result.addLogEntry_ = value;
+            return this;
+          }
+          public Builder setAddLogEntry(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.Builder builderForValue) {
+            result.hasAddLogEntry = true;
+            result.addLogEntry_ = builderForValue.build();
+            return this;
+          }
+          public Builder mergeAddLogEntry(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry value) {
+            if (result.hasAddLogEntry() &&
+                result.addLogEntry_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.getDefaultInstance()) {
+              result.addLogEntry_ =
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.newBuilder(result.addLogEntry_).mergeFrom(value).buildPartial();
+            } else {
+              result.addLogEntry_ = value;
+            }
+            result.hasAddLogEntry = true;
+            return this;
+          }
+          public Builder clearAddLogEntry() {
+            result.hasAddLogEntry = false;
+            result.addLogEntry_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.getDefaultInstance();
+            return this;
+          }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.DisconnectLog disconnectLog = 6;
+          public boolean hasDisconnectLog() {
+            return result.hasDisconnectLog();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog getDisconnectLog() {
+            return result.getDisconnectLog();
+          }
+          public Builder setDisconnectLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasDisconnectLog = true;
+            result.disconnectLog_ = value;
+            return this;
+          }
+          public Builder setDisconnectLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.Builder builderForValue) {
+            result.hasDisconnectLog = true;
+            result.disconnectLog_ = builderForValue.build();
+            return this;
+          }
+          public Builder mergeDisconnectLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog value) {
+            if (result.hasDisconnectLog() &&
+                result.disconnectLog_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.getDefaultInstance()) {
+              result.disconnectLog_ =
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.newBuilder(result.disconnectLog_).mergeFrom(value).buildPartial();
+            } else {
+              result.disconnectLog_ = value;
+            }
+            result.hasDisconnectLog = true;
+            return this;
+          }
+          public Builder clearDisconnectLog() {
+            result.hasDisconnectLog = false;
+            result.disconnectLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.getDefaultInstance();
+            return this;
+          }
+        }
+        
+        static {
+          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+        }
+        
+        static {
+          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+        }
+      }
+      
+      public static final class DevModeRequest extends
+          com.google.protobuf.GeneratedMessage {
+        // Use DevModeRequest.newBuilder() to construct.
+        private DevModeRequest() {}
+        
+        private static final DevModeRequest defaultInstance = new DevModeRequest();
+        public static DevModeRequest getDefaultInstance() {
+          return defaultInstance;
+        }
+        
+        public DevModeRequest getDefaultInstanceForType() {
+          return defaultInstance;
+        }
+        
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_fieldAccessorTable;
+        }
+        
+        public enum RequestType
+            implements com.google.protobuf.ProtocolMessageEnum {
+          CAPABILITY_EXCHANGE(0, 0),
+          RESTART_WEB_SERVER(1, 1),
+          ;
+          
+          
+          public final int getNumber() { return value; }
+          
+          public static RequestType valueOf(int value) {
+            switch (value) {
+              case 0: return CAPABILITY_EXCHANGE;
+              case 1: return RESTART_WEB_SERVER;
+              default: return null;
+            }
+          }
+          
+          public static com.google.protobuf.Internal.EnumLiteMap<RequestType>
+              internalGetValueMap() {
+            return internalValueMap;
+          }
+          private static com.google.protobuf.Internal.EnumLiteMap<RequestType>
+              internalValueMap =
+                new com.google.protobuf.Internal.EnumLiteMap<RequestType>() {
+                  public RequestType findValueByNumber(int number) {
+                    return RequestType.valueOf(number)
+          ;        }
+                };
+          
+          public final com.google.protobuf.Descriptors.EnumValueDescriptor
+              getValueDescriptor() {
+            return getDescriptor().getValues().get(index);
+          }
+          public final com.google.protobuf.Descriptors.EnumDescriptor
+              getDescriptorForType() {
+            return getDescriptor();
+          }
+          public static final com.google.protobuf.Descriptors.EnumDescriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.getDescriptor().getEnumTypes().get(0);
+          }
+          
+          private static final RequestType[] VALUES = {
+            CAPABILITY_EXCHANGE, RESTART_WEB_SERVER, 
+          };
+          public static RequestType valueOf(
+              com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+            if (desc.getType() != getDescriptor()) {
+              throw new java.lang.IllegalArgumentException(
+                "EnumValueDescriptor is not for this type.");
+            }
+            return VALUES[desc.getIndex()];
+          }
+          private final int index;
+          private final int value;
+          private RequestType(int index, int value) {
+            this.index = index;
+            this.value = value;
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+        }
+        
+        public static final class CapabilityExchange extends
+            com.google.protobuf.GeneratedMessage {
+          // Use CapabilityExchange.newBuilder() to construct.
+          private CapabilityExchange() {}
+          
+          private static final CapabilityExchange defaultInstance = new CapabilityExchange();
+          public static CapabilityExchange getDefaultInstance() {
+            return defaultInstance;
+          }
+          
+          public CapabilityExchange getDefaultInstanceForType() {
+            return defaultInstance;
+          }
+          
+          public static final com.google.protobuf.Descriptors.Descriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_CapabilityExchange_descriptor;
+          }
+          
+          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+              internalGetFieldAccessorTable() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_CapabilityExchange_fieldAccessorTable;
+          }
+          
+          public final boolean isInitialized() {
+            return true;
+          }
+          
+          public void writeTo(com.google.protobuf.CodedOutputStream output)
+                              throws java.io.IOException {
+            getUnknownFields().writeTo(output);
+          }
+          
+          private int memoizedSerializedSize = -1;
+          public int getSerializedSize() {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+          
+            size = 0;
+            size += getUnknownFields().getSerializedSize();
+            memoizedSerializedSize = size;
+            return size;
+          }
+          
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(
+              com.google.protobuf.ByteString data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(
+              com.google.protobuf.ByteString data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(byte[] data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(
+              byte[] data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseDelimitedFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseDelimitedFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(
+              com.google.protobuf.CodedInputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange parseFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          
+          public static Builder newBuilder() { return Builder.create(); }
+          public Builder newBuilderForType() { return newBuilder(); }
+          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange prototype) {
+            return newBuilder().mergeFrom(prototype);
+          }
+          public Builder toBuilder() { return newBuilder(this); }
+          
+          public static final class Builder extends
+              com.google.protobuf.GeneratedMessage.Builder<Builder> {
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange result;
+            
+            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.newBuilder()
+            private Builder() {}
+            
+            private static Builder create() {
+              Builder builder = new Builder();
+              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange();
+              return builder;
+            }
+            
+            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange internalGetResult() {
+              return result;
+            }
+            
+            public Builder clear() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "Cannot call clear() after build().");
+              }
+              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange();
+              return this;
+            }
+            
+            public Builder clone() {
+              return create().mergeFrom(result);
+            }
+            
+            public com.google.protobuf.Descriptors.Descriptor
+                getDescriptorForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.getDescriptor();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange getDefaultInstanceForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.getDefaultInstance();
+            }
+            
+            public boolean isInitialized() {
+              return result.isInitialized();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange build() {
+              if (result != null && !isInitialized()) {
+                throw newUninitializedMessageException(result);
+              }
+              return buildPartial();
+            }
+            
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange buildParsed()
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              if (!isInitialized()) {
+                throw newUninitializedMessageException(
+                  result).asInvalidProtocolBufferException();
+              }
+              return buildPartial();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange buildPartial() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "build() has already been called on this Builder.");
+              }
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange returnMe = result;
+              result = null;
+              return returnMe;
+            }
+            
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange) {
+                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange)other);
+              } else {
+                super.mergeFrom(other);
+                return this;
+              }
+            }
+            
+            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange other) {
+              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.getDefaultInstance()) return this;
+              this.mergeUnknownFields(other.getUnknownFields());
+              return this;
+            }
+            
+            public Builder mergeFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                com.google.protobuf.UnknownFieldSet.newBuilder(
+                  this.getUnknownFields());
+              while (true) {
+                int tag = input.readTag();
+                switch (tag) {
+                  case 0:
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  default: {
+                    if (!parseUnknownField(input, unknownFields,
+                                           extensionRegistry, tag)) {
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    }
+                    break;
+                  }
+                }
+              }
+            }
+            
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+          }
+        }
+        
+        public static final class RestartWebServer extends
+            com.google.protobuf.GeneratedMessage {
+          // Use RestartWebServer.newBuilder() to construct.
+          private RestartWebServer() {}
+          
+          private static final RestartWebServer defaultInstance = new RestartWebServer();
+          public static RestartWebServer getDefaultInstance() {
+            return defaultInstance;
+          }
+          
+          public RestartWebServer getDefaultInstanceForType() {
+            return defaultInstance;
+          }
+          
+          public static final com.google.protobuf.Descriptors.Descriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_RestartWebServer_descriptor;
+          }
+          
+          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+              internalGetFieldAccessorTable() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_RestartWebServer_fieldAccessorTable;
+          }
+          
+          public final boolean isInitialized() {
+            return true;
+          }
+          
+          public void writeTo(com.google.protobuf.CodedOutputStream output)
+                              throws java.io.IOException {
+            getUnknownFields().writeTo(output);
+          }
+          
+          private int memoizedSerializedSize = -1;
+          public int getSerializedSize() {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+          
+            size = 0;
+            size += getUnknownFields().getSerializedSize();
+            memoizedSerializedSize = size;
+            return size;
+          }
+          
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(
+              com.google.protobuf.ByteString data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(
+              com.google.protobuf.ByteString data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(byte[] data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(
+              byte[] data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseDelimitedFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseDelimitedFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(
+              com.google.protobuf.CodedInputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer parseFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          
+          public static Builder newBuilder() { return Builder.create(); }
+          public Builder newBuilderForType() { return newBuilder(); }
+          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer prototype) {
+            return newBuilder().mergeFrom(prototype);
+          }
+          public Builder toBuilder() { return newBuilder(this); }
+          
+          public static final class Builder extends
+              com.google.protobuf.GeneratedMessage.Builder<Builder> {
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer result;
+            
+            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.newBuilder()
+            private Builder() {}
+            
+            private static Builder create() {
+              Builder builder = new Builder();
+              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer();
+              return builder;
+            }
+            
+            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer internalGetResult() {
+              return result;
+            }
+            
+            public Builder clear() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "Cannot call clear() after build().");
+              }
+              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer();
+              return this;
+            }
+            
+            public Builder clone() {
+              return create().mergeFrom(result);
+            }
+            
+            public com.google.protobuf.Descriptors.Descriptor
+                getDescriptorForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.getDescriptor();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer getDefaultInstanceForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.getDefaultInstance();
+            }
+            
+            public boolean isInitialized() {
+              return result.isInitialized();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer build() {
+              if (result != null && !isInitialized()) {
+                throw newUninitializedMessageException(result);
+              }
+              return buildPartial();
+            }
+            
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer buildParsed()
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              if (!isInitialized()) {
+                throw newUninitializedMessageException(
+                  result).asInvalidProtocolBufferException();
+              }
+              return buildPartial();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer buildPartial() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "build() has already been called on this Builder.");
+              }
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer returnMe = result;
+              result = null;
+              return returnMe;
+            }
+            
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer) {
+                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer)other);
+              } else {
+                super.mergeFrom(other);
+                return this;
+              }
+            }
+            
+            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer other) {
+              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.getDefaultInstance()) return this;
+              this.mergeUnknownFields(other.getUnknownFields());
+              return this;
+            }
+            
+            public Builder mergeFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                com.google.protobuf.UnknownFieldSet.newBuilder(
+                  this.getUnknownFields());
+              while (true) {
+                int tag = input.readTag();
+                switch (tag) {
+                  case 0:
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  default: {
+                    if (!parseUnknownField(input, unknownFields,
+                                           extensionRegistry, tag)) {
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    }
+                    break;
+                  }
+                }
+              }
+            }
+            
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+          }
+        }
+        
+        // required .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.RequestType requestType = 1;
+        public static final int REQUESTTYPE_FIELD_NUMBER = 1;
+        private boolean hasRequestType;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType requestType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType.CAPABILITY_EXCHANGE;
+        public boolean hasRequestType() { return hasRequestType; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType getRequestType() { return requestType_; }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.CapabilityExchange capabilityExchange = 2;
+        public static final int CAPABILITYEXCHANGE_FIELD_NUMBER = 2;
+        private boolean hasCapabilityExchange;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.getDefaultInstance();
+        public boolean hasCapabilityExchange() { return hasCapabilityExchange; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange getCapabilityExchange() { return capabilityExchange_; }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.RestartWebServer restartWebServer = 3;
+        public static final int RESTARTWEBSERVER_FIELD_NUMBER = 3;
+        private boolean hasRestartWebServer;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer restartWebServer_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.getDefaultInstance();
+        public boolean hasRestartWebServer() { return hasRestartWebServer; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer getRestartWebServer() { return restartWebServer_; }
+        
+        public final boolean isInitialized() {
+          if (!hasRequestType) return false;
+          return true;
+        }
+        
+        public void writeTo(com.google.protobuf.CodedOutputStream output)
+                            throws java.io.IOException {
+          if (hasRequestType()) {
+            output.writeEnum(1, getRequestType().getNumber());
+          }
+          if (hasCapabilityExchange()) {
+            output.writeMessage(2, getCapabilityExchange());
+          }
+          if (hasRestartWebServer()) {
+            output.writeMessage(3, getRestartWebServer());
+          }
+          getUnknownFields().writeTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public int getSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+        
+          size = 0;
+          if (hasRequestType()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeEnumSize(1, getRequestType().getNumber());
+          }
+          if (hasCapabilityExchange()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeMessageSize(2, getCapabilityExchange());
+          }
+          if (hasRestartWebServer()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeMessageSize(3, getRestartWebServer());
+          }
+          size += getUnknownFields().getSerializedSize();
+          memoizedSerializedSize = size;
+          return size;
+        }
+        
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(
+            com.google.protobuf.ByteString data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(
+            com.google.protobuf.ByteString data,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(byte[] data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(
+            byte[] data,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(java.io.InputStream input)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(
+            java.io.InputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseDelimitedFrom(java.io.InputStream input)
+            throws java.io.IOException {
+          return newBuilder().mergeDelimitedFrom(input).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseDelimitedFrom(
+            java.io.InputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(
+            com.google.protobuf.CodedInputStream input)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest parseFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input, extensionRegistry)
+                   .buildParsed();
+        }
+        
+        public static Builder newBuilder() { return Builder.create(); }
+        public Builder newBuilderForType() { return newBuilder(); }
+        public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest prototype) {
+          return newBuilder().mergeFrom(prototype);
+        }
+        public Builder toBuilder() { return newBuilder(this); }
+        
+        public static final class Builder extends
+            com.google.protobuf.GeneratedMessage.Builder<Builder> {
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest result;
+          
+          // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.newBuilder()
+          private Builder() {}
+          
+          private static Builder create() {
+            Builder builder = new Builder();
+            builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest();
+            return builder;
+          }
+          
+          protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest internalGetResult() {
+            return result;
+          }
+          
+          public Builder clear() {
+            if (result == null) {
+              throw new IllegalStateException(
+                "Cannot call clear() after build().");
+            }
+            result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest();
+            return this;
+          }
+          
+          public Builder clone() {
+            return create().mergeFrom(result);
+          }
+          
+          public com.google.protobuf.Descriptors.Descriptor
+              getDescriptorForType() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.getDescriptor();
+          }
+          
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest getDefaultInstanceForType() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.getDefaultInstance();
+          }
+          
+          public boolean isInitialized() {
+            return result.isInitialized();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest build() {
+            if (result != null && !isInitialized()) {
+              throw newUninitializedMessageException(result);
+            }
+            return buildPartial();
+          }
+          
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest buildParsed()
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            if (!isInitialized()) {
+              throw newUninitializedMessageException(
+                result).asInvalidProtocolBufferException();
+            }
+            return buildPartial();
+          }
+          
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest buildPartial() {
+            if (result == null) {
+              throw new IllegalStateException(
+                "build() has already been called on this Builder.");
+            }
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public Builder mergeFrom(com.google.protobuf.Message other) {
+            if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest) {
+              return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest)other);
+            } else {
+              super.mergeFrom(other);
+              return this;
+            }
+          }
+          
+          public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest other) {
+            if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.getDefaultInstance()) return this;
+            if (other.hasRequestType()) {
+              setRequestType(other.getRequestType());
+            }
+            if (other.hasCapabilityExchange()) {
+              mergeCapabilityExchange(other.getCapabilityExchange());
+            }
+            if (other.hasRestartWebServer()) {
+              mergeRestartWebServer(other.getRestartWebServer());
+            }
+            this.mergeUnknownFields(other.getUnknownFields());
+            return this;
+          }
+          
+          public Builder mergeFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+              com.google.protobuf.UnknownFieldSet.newBuilder(
+                this.getUnknownFields());
+            while (true) {
+              int tag = input.readTag();
+              switch (tag) {
+                case 0:
+                  this.setUnknownFields(unknownFields.build());
+                  return this;
+                default: {
+                  if (!parseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  }
+                  break;
+                }
+                case 8: {
+                  int rawValue = input.readEnum();
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType.valueOf(rawValue);
+                  if (value == null) {
+                    unknownFields.mergeVarintField(1, rawValue);
+                  } else {
+                    setRequestType(value);
+                  }
+                  break;
+                }
+                case 18: {
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.newBuilder();
+                  if (hasCapabilityExchange()) {
+                    subBuilder.mergeFrom(getCapabilityExchange());
+                  }
+                  input.readMessage(subBuilder, extensionRegistry);
+                  setCapabilityExchange(subBuilder.buildPartial());
+                  break;
+                }
+                case 26: {
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.newBuilder();
+                  if (hasRestartWebServer()) {
+                    subBuilder.mergeFrom(getRestartWebServer());
+                  }
+                  input.readMessage(subBuilder, extensionRegistry);
+                  setRestartWebServer(subBuilder.buildPartial());
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // required .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.RequestType requestType = 1;
+          public boolean hasRequestType() {
+            return result.hasRequestType();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType getRequestType() {
+            return result.getRequestType();
+          }
+          public Builder setRequestType(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasRequestType = true;
+            result.requestType_ = value;
+            return this;
+          }
+          public Builder clearRequestType() {
+            result.hasRequestType = false;
+            result.requestType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType.CAPABILITY_EXCHANGE;
+            return this;
+          }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.CapabilityExchange capabilityExchange = 2;
+          public boolean hasCapabilityExchange() {
+            return result.hasCapabilityExchange();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange getCapabilityExchange() {
+            return result.getCapabilityExchange();
+          }
+          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasCapabilityExchange = true;
+            result.capabilityExchange_ = value;
+            return this;
+          }
+          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.Builder builderForValue) {
+            result.hasCapabilityExchange = true;
+            result.capabilityExchange_ = builderForValue.build();
+            return this;
+          }
+          public Builder mergeCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange value) {
+            if (result.hasCapabilityExchange() &&
+                result.capabilityExchange_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.getDefaultInstance()) {
+              result.capabilityExchange_ =
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.newBuilder(result.capabilityExchange_).mergeFrom(value).buildPartial();
+            } else {
+              result.capabilityExchange_ = value;
+            }
+            result.hasCapabilityExchange = true;
+            return this;
+          }
+          public Builder clearCapabilityExchange() {
+            result.hasCapabilityExchange = false;
+            result.capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.getDefaultInstance();
+            return this;
+          }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.RestartWebServer restartWebServer = 3;
+          public boolean hasRestartWebServer() {
+            return result.hasRestartWebServer();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer getRestartWebServer() {
+            return result.getRestartWebServer();
+          }
+          public Builder setRestartWebServer(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasRestartWebServer = true;
+            result.restartWebServer_ = value;
+            return this;
+          }
+          public Builder setRestartWebServer(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.Builder builderForValue) {
+            result.hasRestartWebServer = true;
+            result.restartWebServer_ = builderForValue.build();
+            return this;
+          }
+          public Builder mergeRestartWebServer(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer value) {
+            if (result.hasRestartWebServer() &&
+                result.restartWebServer_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.getDefaultInstance()) {
+              result.restartWebServer_ =
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.newBuilder(result.restartWebServer_).mergeFrom(value).buildPartial();
+            } else {
+              result.restartWebServer_ = value;
+            }
+            result.hasRestartWebServer = true;
+            return this;
+          }
+          public Builder clearRestartWebServer() {
+            result.hasRestartWebServer = false;
+            result.restartWebServer_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.getDefaultInstance();
+            return this;
+          }
+        }
+        
+        static {
+          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+        }
+        
+        static {
+          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+        }
+      }
+      
+      // required .com.google.gwt.dev.shell.remoteui.Message.Request.ServiceType serviceType = 1;
+      public static final int SERVICETYPE_FIELD_NUMBER = 1;
+      private boolean hasServiceType;
+      private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType serviceType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType.VIEWER;
+      public boolean hasServiceType() { return hasServiceType; }
+      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType getServiceType() { return serviceType_; }
+      
+      // optional uint32 requestId = 2;
+      public static final int REQUESTID_FIELD_NUMBER = 2;
+      private boolean hasRequestId;
+      private int requestId_ = 0;
+      public boolean hasRequestId() { return hasRequestId; }
+      public int getRequestId() { return requestId_; }
+      
+      // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest viewerRequest = 3;
+      public static final int VIEWERREQUEST_FIELD_NUMBER = 3;
+      private boolean hasViewerRequest;
+      private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest viewerRequest_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.getDefaultInstance();
+      public boolean hasViewerRequest() { return hasViewerRequest; }
+      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest getViewerRequest() { return viewerRequest_; }
+      
+      // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest devModeRequest = 4;
+      public static final int DEVMODEREQUEST_FIELD_NUMBER = 4;
+      private boolean hasDevModeRequest;
+      private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest devModeRequest_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.getDefaultInstance();
+      public boolean hasDevModeRequest() { return hasDevModeRequest; }
+      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest getDevModeRequest() { return devModeRequest_; }
+      
+      public final boolean isInitialized() {
+        if (!hasServiceType) return false;
+        if (hasViewerRequest()) {
+          if (!getViewerRequest().isInitialized()) return false;
+        }
+        if (hasDevModeRequest()) {
+          if (!getDevModeRequest().isInitialized()) return false;
+        }
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        if (hasServiceType()) {
+          output.writeEnum(1, getServiceType().getNumber());
+        }
+        if (hasRequestId()) {
+          output.writeUInt32(2, getRequestId());
+        }
+        if (hasViewerRequest()) {
+          output.writeMessage(3, getViewerRequest());
+        }
+        if (hasDevModeRequest()) {
+          output.writeMessage(4, getDevModeRequest());
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (hasServiceType()) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeEnumSize(1, getServiceType().getNumber());
+        }
+        if (hasRequestId()) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeUInt32Size(2, getRequestId());
+        }
+        if (hasViewerRequest()) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(3, getViewerRequest());
+        }
+        if (hasDevModeRequest()) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(4, getDevModeRequest());
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeDelimitedFrom(input).buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder> {
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request result;
+        
+        // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.newBuilder()
+        private Builder() {}
+        
+        private static Builder create() {
+          Builder builder = new Builder();
+          builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request();
+          return builder;
+        }
+        
+        protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request internalGetResult() {
+          return result;
+        }
+        
+        public Builder clear() {
+          if (result == null) {
+            throw new IllegalStateException(
+              "Cannot call clear() after build().");
+          }
+          result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request();
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(result);
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.getDescriptor();
+        }
+        
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request getDefaultInstanceForType() {
+          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.getDefaultInstance();
+        }
+        
+        public boolean isInitialized() {
+          return result.isInitialized();
+        }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request build() {
+          if (result != null && !isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return buildPartial();
+        }
+        
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          if (!isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return buildPartial();
+        }
+        
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request buildPartial() {
+          if (result == null) {
+            throw new IllegalStateException(
+              "build() has already been called on this Builder.");
+          }
+          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request returnMe = result;
+          result = null;
+          return returnMe;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request) {
+            return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request other) {
+          if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.getDefaultInstance()) return this;
+          if (other.hasServiceType()) {
+            setServiceType(other.getServiceType());
+          }
+          if (other.hasRequestId()) {
+            setRequestId(other.getRequestId());
+          }
+          if (other.hasViewerRequest()) {
+            mergeViewerRequest(other.getViewerRequest());
+          }
+          if (other.hasDevModeRequest()) {
+            mergeDevModeRequest(other.getDevModeRequest());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  return this;
+                }
+                break;
+              }
+              case 8: {
+                int rawValue = input.readEnum();
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType.valueOf(rawValue);
+                if (value == null) {
+                  unknownFields.mergeVarintField(1, rawValue);
+                } else {
+                  setServiceType(value);
+                }
+                break;
+              }
+              case 16: {
+                setRequestId(input.readUInt32());
+                break;
+              }
+              case 26: {
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.newBuilder();
+                if (hasViewerRequest()) {
+                  subBuilder.mergeFrom(getViewerRequest());
+                }
+                input.readMessage(subBuilder, extensionRegistry);
+                setViewerRequest(subBuilder.buildPartial());
+                break;
+              }
+              case 34: {
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.newBuilder();
+                if (hasDevModeRequest()) {
+                  subBuilder.mergeFrom(getDevModeRequest());
+                }
+                input.readMessage(subBuilder, extensionRegistry);
+                setDevModeRequest(subBuilder.buildPartial());
+                break;
+              }
+            }
+          }
+        }
+        
+        
+        // required .com.google.gwt.dev.shell.remoteui.Message.Request.ServiceType serviceType = 1;
+        public boolean hasServiceType() {
+          return result.hasServiceType();
+        }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType getServiceType() {
+          return result.getServiceType();
+        }
+        public Builder setServiceType(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType value) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          result.hasServiceType = true;
+          result.serviceType_ = value;
+          return this;
+        }
+        public Builder clearServiceType() {
+          result.hasServiceType = false;
+          result.serviceType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ServiceType.VIEWER;
+          return this;
+        }
+        
+        // optional uint32 requestId = 2;
+        public boolean hasRequestId() {
+          return result.hasRequestId();
+        }
+        public int getRequestId() {
+          return result.getRequestId();
+        }
+        public Builder setRequestId(int value) {
+          result.hasRequestId = true;
+          result.requestId_ = value;
+          return this;
+        }
+        public Builder clearRequestId() {
+          result.hasRequestId = false;
+          result.requestId_ = 0;
+          return this;
+        }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest viewerRequest = 3;
+        public boolean hasViewerRequest() {
+          return result.hasViewerRequest();
+        }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest getViewerRequest() {
+          return result.getViewerRequest();
+        }
+        public Builder setViewerRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest value) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          result.hasViewerRequest = true;
+          result.viewerRequest_ = value;
+          return this;
+        }
+        public Builder setViewerRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Builder builderForValue) {
+          result.hasViewerRequest = true;
+          result.viewerRequest_ = builderForValue.build();
+          return this;
+        }
+        public Builder mergeViewerRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest value) {
+          if (result.hasViewerRequest() &&
+              result.viewerRequest_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.getDefaultInstance()) {
+            result.viewerRequest_ =
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.newBuilder(result.viewerRequest_).mergeFrom(value).buildPartial();
+          } else {
+            result.viewerRequest_ = value;
+          }
+          result.hasViewerRequest = true;
+          return this;
+        }
+        public Builder clearViewerRequest() {
+          result.hasViewerRequest = false;
+          result.viewerRequest_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.getDefaultInstance();
+          return this;
+        }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest devModeRequest = 4;
+        public boolean hasDevModeRequest() {
+          return result.hasDevModeRequest();
+        }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest getDevModeRequest() {
+          return result.getDevModeRequest();
+        }
+        public Builder setDevModeRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest value) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          result.hasDevModeRequest = true;
+          result.devModeRequest_ = value;
+          return this;
+        }
+        public Builder setDevModeRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.Builder builderForValue) {
+          result.hasDevModeRequest = true;
+          result.devModeRequest_ = builderForValue.build();
+          return this;
+        }
+        public Builder mergeDevModeRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest value) {
+          if (result.hasDevModeRequest() &&
+              result.devModeRequest_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.getDefaultInstance()) {
+            result.devModeRequest_ =
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.newBuilder(result.devModeRequest_).mergeFrom(value).buildPartial();
+          } else {
+            result.devModeRequest_ = value;
+          }
+          result.hasDevModeRequest = true;
+          return this;
+        }
+        public Builder clearDevModeRequest() {
+          result.hasDevModeRequest = false;
+          result.devModeRequest_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.getDefaultInstance();
+          return this;
+        }
+      }
+      
+      static {
+        com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+      }
+      
+      static {
+        com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+      }
+    }
+    
+    public static final class Response extends
+        com.google.protobuf.GeneratedMessage {
+      // Use Response.newBuilder() to construct.
+      private Response() {}
+      
+      private static final Response defaultInstance = new Response();
+      public static Response getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public Response getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_fieldAccessorTable;
+      }
+      
+      public static final class ViewerResponse extends
+          com.google.protobuf.GeneratedMessage {
+        // Use ViewerResponse.newBuilder() to construct.
+        private ViewerResponse() {}
+        
+        private static final ViewerResponse defaultInstance = new ViewerResponse();
+        public static ViewerResponse getDefaultInstance() {
+          return defaultInstance;
+        }
+        
+        public ViewerResponse getDefaultInstanceForType() {
+          return defaultInstance;
+        }
+        
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_fieldAccessorTable;
+        }
+        
+        public enum ResponseType
+            implements com.google.protobuf.ProtocolMessageEnum {
+          CAPABILITY_EXCHANGE(0, 0),
+          ADD_LOG(1, 1),
+          ADD_LOG_BRANCH(2, 2),
+          ;
+          
+          
+          public final int getNumber() { return value; }
+          
+          public static ResponseType valueOf(int value) {
+            switch (value) {
+              case 0: return CAPABILITY_EXCHANGE;
+              case 1: return ADD_LOG;
+              case 2: return ADD_LOG_BRANCH;
+              default: return null;
+            }
+          }
+          
+          public static com.google.protobuf.Internal.EnumLiteMap<ResponseType>
+              internalGetValueMap() {
+            return internalValueMap;
+          }
+          private static com.google.protobuf.Internal.EnumLiteMap<ResponseType>
+              internalValueMap =
+                new com.google.protobuf.Internal.EnumLiteMap<ResponseType>() {
+                  public ResponseType findValueByNumber(int number) {
+                    return ResponseType.valueOf(number)
+          ;        }
+                };
+          
+          public final com.google.protobuf.Descriptors.EnumValueDescriptor
+              getValueDescriptor() {
+            return getDescriptor().getValues().get(index);
+          }
+          public final com.google.protobuf.Descriptors.EnumDescriptor
+              getDescriptorForType() {
+            return getDescriptor();
+          }
+          public static final com.google.protobuf.Descriptors.EnumDescriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.getDescriptor().getEnumTypes().get(0);
+          }
+          
+          private static final ResponseType[] VALUES = {
+            CAPABILITY_EXCHANGE, ADD_LOG, ADD_LOG_BRANCH, 
+          };
+          public static ResponseType valueOf(
+              com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+            if (desc.getType() != getDescriptor()) {
+              throw new java.lang.IllegalArgumentException(
+                "EnumValueDescriptor is not for this type.");
+            }
+            return VALUES[desc.getIndex()];
+          }
+          private final int index;
+          private final int value;
+          private ResponseType(int index, int value) {
+            this.index = index;
+            this.value = value;
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+        }
+        
+        public static final class CapabilityExchange extends
+            com.google.protobuf.GeneratedMessage {
+          // Use CapabilityExchange.newBuilder() to construct.
+          private CapabilityExchange() {}
+          
+          private static final CapabilityExchange defaultInstance = new CapabilityExchange();
+          public static CapabilityExchange getDefaultInstance() {
+            return defaultInstance;
+          }
+          
+          public CapabilityExchange getDefaultInstanceForType() {
+            return defaultInstance;
+          }
+          
+          public static final com.google.protobuf.Descriptors.Descriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_descriptor;
+          }
+          
+          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+              internalGetFieldAccessorTable() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_fieldAccessorTable;
+          }
+          
+          public static final class Capability extends
+              com.google.protobuf.GeneratedMessage {
+            // Use Capability.newBuilder() to construct.
+            private Capability() {}
+            
+            private static final Capability defaultInstance = new Capability();
+            public static Capability getDefaultInstance() {
+              return defaultInstance;
+            }
+            
+            public Capability getDefaultInstanceForType() {
+              return defaultInstance;
+            }
+            
+            public static final com.google.protobuf.Descriptors.Descriptor
+                getDescriptor() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_Capability_descriptor;
+            }
+            
+            protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+                internalGetFieldAccessorTable() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_Capability_fieldAccessorTable;
+            }
+            
+            // required .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.RequestType capability = 1;
+            public static final int CAPABILITY_FIELD_NUMBER = 1;
+            private boolean hasCapability;
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType capability_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType.CAPABILITY_EXCHANGE;
+            public boolean hasCapability() { return hasCapability; }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType getCapability() { return capability_; }
+            
+            public final boolean isInitialized() {
+              if (!hasCapability) return false;
+              return true;
+            }
+            
+            public void writeTo(com.google.protobuf.CodedOutputStream output)
+                                throws java.io.IOException {
+              if (hasCapability()) {
+                output.writeEnum(1, getCapability().getNumber());
+              }
+              getUnknownFields().writeTo(output);
+            }
+            
+            private int memoizedSerializedSize = -1;
+            public int getSerializedSize() {
+              int size = memoizedSerializedSize;
+              if (size != -1) return size;
+            
+              size = 0;
+              if (hasCapability()) {
+                size += com.google.protobuf.CodedOutputStream
+                  .computeEnumSize(1, getCapability().getNumber());
+              }
+              size += getUnknownFields().getSerializedSize();
+              memoizedSerializedSize = size;
+              return size;
+            }
+            
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(
+                com.google.protobuf.ByteString data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(
+                com.google.protobuf.ByteString data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(byte[] data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(
+                byte[] data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(java.io.InputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseDelimitedFrom(java.io.InputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeDelimitedFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseDelimitedFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(
+                com.google.protobuf.CodedInputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability parseFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            
+            public static Builder newBuilder() { return Builder.create(); }
+            public Builder newBuilderForType() { return newBuilder(); }
+            public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability prototype) {
+              return newBuilder().mergeFrom(prototype);
+            }
+            public Builder toBuilder() { return newBuilder(this); }
+            
+            public static final class Builder extends
+                com.google.protobuf.GeneratedMessage.Builder<Builder> {
+              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability result;
+              
+              // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.newBuilder()
+              private Builder() {}
+              
+              private static Builder create() {
+                Builder builder = new Builder();
+                builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability();
+                return builder;
+              }
+              
+              protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability internalGetResult() {
+                return result;
+              }
+              
+              public Builder clear() {
+                if (result == null) {
+                  throw new IllegalStateException(
+                    "Cannot call clear() after build().");
+                }
+                result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability();
+                return this;
+              }
+              
+              public Builder clone() {
+                return create().mergeFrom(result);
+              }
+              
+              public com.google.protobuf.Descriptors.Descriptor
+                  getDescriptorForType() {
+                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.getDescriptor();
+              }
+              
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability getDefaultInstanceForType() {
+                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.getDefaultInstance();
+              }
+              
+              public boolean isInitialized() {
+                return result.isInitialized();
+              }
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability build() {
+                if (result != null && !isInitialized()) {
+                  throw newUninitializedMessageException(result);
+                }
+                return buildPartial();
+              }
+              
+              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability buildParsed()
+                  throws com.google.protobuf.InvalidProtocolBufferException {
+                if (!isInitialized()) {
+                  throw newUninitializedMessageException(
+                    result).asInvalidProtocolBufferException();
+                }
+                return buildPartial();
+              }
+              
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability buildPartial() {
+                if (result == null) {
+                  throw new IllegalStateException(
+                    "build() has already been called on this Builder.");
+                }
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability returnMe = result;
+                result = null;
+                return returnMe;
+              }
+              
+              public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability) {
+                  return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability)other);
+                } else {
+                  super.mergeFrom(other);
+                  return this;
+                }
+              }
+              
+              public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability other) {
+                if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.getDefaultInstance()) return this;
+                if (other.hasCapability()) {
+                  setCapability(other.getCapability());
+                }
+                this.mergeUnknownFields(other.getUnknownFields());
+                return this;
+              }
+              
+              public Builder mergeFrom(
+                  com.google.protobuf.CodedInputStream input,
+                  com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                  throws java.io.IOException {
+                com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                  com.google.protobuf.UnknownFieldSet.newBuilder(
+                    this.getUnknownFields());
+                while (true) {
+                  int tag = input.readTag();
+                  switch (tag) {
+                    case 0:
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    default: {
+                      if (!parseUnknownField(input, unknownFields,
+                                             extensionRegistry, tag)) {
+                        this.setUnknownFields(unknownFields.build());
+                        return this;
+                      }
+                      break;
+                    }
+                    case 8: {
+                      int rawValue = input.readEnum();
+                      com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType.valueOf(rawValue);
+                      if (value == null) {
+                        unknownFields.mergeVarintField(1, rawValue);
+                      } else {
+                        setCapability(value);
+                      }
+                      break;
+                    }
+                  }
+                }
+              }
+              
+              
+              // required .com.google.gwt.dev.shell.remoteui.Message.Request.ViewerRequest.RequestType capability = 1;
+              public boolean hasCapability() {
+                return result.hasCapability();
+              }
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType getCapability() {
+                return result.getCapability();
+              }
+              public Builder setCapability(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType value) {
+                if (value == null) {
+                  throw new NullPointerException();
+                }
+                result.hasCapability = true;
+                result.capability_ = value;
+                return this;
+              }
+              public Builder clearCapability() {
+                result.hasCapability = false;
+                result.capability_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType.CAPABILITY_EXCHANGE;
+                return this;
+              }
+            }
+            
+            static {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+            }
+            
+            static {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+            }
+          }
+          
+          // repeated .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.CapabilityExchange.Capability capabilities = 2;
+          public static final int CAPABILITIES_FIELD_NUMBER = 2;
+          private java.util.List<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability> capabilities_ =
+            java.util.Collections.emptyList();
+          public java.util.List<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability> getCapabilitiesList() {
+            return capabilities_;
+          }
+          public int getCapabilitiesCount() { return capabilities_.size(); }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability getCapabilities(int index) {
+            return capabilities_.get(index);
+          }
+          
+          public final boolean isInitialized() {
+            for (com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability element : getCapabilitiesList()) {
+              if (!element.isInitialized()) return false;
+            }
+            return true;
+          }
+          
+          public void writeTo(com.google.protobuf.CodedOutputStream output)
+                              throws java.io.IOException {
+            for (com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability element : getCapabilitiesList()) {
+              output.writeMessage(2, element);
+            }
+            getUnknownFields().writeTo(output);
+          }
+          
+          private int memoizedSerializedSize = -1;
+          public int getSerializedSize() {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+          
+            size = 0;
+            for (com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability element : getCapabilitiesList()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeMessageSize(2, element);
+            }
+            size += getUnknownFields().getSerializedSize();
+            memoizedSerializedSize = size;
+            return size;
+          }
+          
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(
+              com.google.protobuf.ByteString data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(
+              com.google.protobuf.ByteString data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(byte[] data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(
+              byte[] data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseDelimitedFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseDelimitedFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(
+              com.google.protobuf.CodedInputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange parseFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          
+          public static Builder newBuilder() { return Builder.create(); }
+          public Builder newBuilderForType() { return newBuilder(); }
+          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange prototype) {
+            return newBuilder().mergeFrom(prototype);
+          }
+          public Builder toBuilder() { return newBuilder(this); }
+          
+          public static final class Builder extends
+              com.google.protobuf.GeneratedMessage.Builder<Builder> {
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange result;
+            
+            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.newBuilder()
+            private Builder() {}
+            
+            private static Builder create() {
+              Builder builder = new Builder();
+              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange();
+              return builder;
+            }
+            
+            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange internalGetResult() {
+              return result;
+            }
+            
+            public Builder clear() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "Cannot call clear() after build().");
+              }
+              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange();
+              return this;
+            }
+            
+            public Builder clone() {
+              return create().mergeFrom(result);
+            }
+            
+            public com.google.protobuf.Descriptors.Descriptor
+                getDescriptorForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.getDescriptor();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange getDefaultInstanceForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.getDefaultInstance();
+            }
+            
+            public boolean isInitialized() {
+              return result.isInitialized();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange build() {
+              if (result != null && !isInitialized()) {
+                throw newUninitializedMessageException(result);
+              }
+              return buildPartial();
+            }
+            
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange buildParsed()
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              if (!isInitialized()) {
+                throw newUninitializedMessageException(
+                  result).asInvalidProtocolBufferException();
+              }
+              return buildPartial();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange buildPartial() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "build() has already been called on this Builder.");
+              }
+              if (result.capabilities_ != java.util.Collections.EMPTY_LIST) {
+                result.capabilities_ =
+                  java.util.Collections.unmodifiableList(result.capabilities_);
+              }
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange returnMe = result;
+              result = null;
+              return returnMe;
+            }
+            
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange) {
+                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange)other);
+              } else {
+                super.mergeFrom(other);
+                return this;
+              }
+            }
+            
+            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange other) {
+              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.getDefaultInstance()) return this;
+              if (!other.capabilities_.isEmpty()) {
+                if (result.capabilities_.isEmpty()) {
+                  result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability>();
+                }
+                result.capabilities_.addAll(other.capabilities_);
+              }
+              this.mergeUnknownFields(other.getUnknownFields());
+              return this;
+            }
+            
+            public Builder mergeFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                com.google.protobuf.UnknownFieldSet.newBuilder(
+                  this.getUnknownFields());
+              while (true) {
+                int tag = input.readTag();
+                switch (tag) {
+                  case 0:
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  default: {
+                    if (!parseUnknownField(input, unknownFields,
+                                           extensionRegistry, tag)) {
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    }
+                    break;
+                  }
+                  case 18: {
+                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.newBuilder();
+                    input.readMessage(subBuilder, extensionRegistry);
+                    addCapabilities(subBuilder.buildPartial());
+                    break;
+                  }
+                }
+              }
+            }
+            
+            
+            // repeated .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.CapabilityExchange.Capability capabilities = 2;
+            public java.util.List<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability> getCapabilitiesList() {
+              return java.util.Collections.unmodifiableList(result.capabilities_);
+            }
+            public int getCapabilitiesCount() {
+              return result.getCapabilitiesCount();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability getCapabilities(int index) {
+              return result.getCapabilities(index);
+            }
+            public Builder setCapabilities(int index, com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability value) {
+              if (value == null) {
+                throw new NullPointerException();
+              }
+              result.capabilities_.set(index, value);
+              return this;
+            }
+            public Builder setCapabilities(int index, com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.Builder builderForValue) {
+              result.capabilities_.set(index, builderForValue.build());
+              return this;
+            }
+            public Builder addCapabilities(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability value) {
+              if (value == null) {
+                throw new NullPointerException();
+              }
+              if (result.capabilities_.isEmpty()) {
+                result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability>();
+              }
+              result.capabilities_.add(value);
+              return this;
+            }
+            public Builder addCapabilities(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.Builder builderForValue) {
+              if (result.capabilities_.isEmpty()) {
+                result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability>();
+              }
+              result.capabilities_.add(builderForValue.build());
+              return this;
+            }
+            public Builder addAllCapabilities(
+                java.lang.Iterable<? extends com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability> values) {
+              if (result.capabilities_.isEmpty()) {
+                result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability>();
+              }
+              super.addAll(values, result.capabilities_);
+              return this;
+            }
+            public Builder clearCapabilities() {
+              result.capabilities_ = java.util.Collections.emptyList();
+              return this;
+            }
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+          }
+        }
+        
+        public static final class AddLog extends
+            com.google.protobuf.GeneratedMessage {
+          // Use AddLog.newBuilder() to construct.
+          private AddLog() {}
+          
+          private static final AddLog defaultInstance = new AddLog();
+          public static AddLog getDefaultInstance() {
+            return defaultInstance;
+          }
+          
+          public AddLog getDefaultInstanceForType() {
+            return defaultInstance;
+          }
+          
+          public static final com.google.protobuf.Descriptors.Descriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLog_descriptor;
+          }
+          
+          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+              internalGetFieldAccessorTable() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLog_fieldAccessorTable;
+          }
+          
+          // required uint32 logHandle = 1;
+          public static final int LOGHANDLE_FIELD_NUMBER = 1;
+          private boolean hasLogHandle;
+          private int logHandle_ = 0;
+          public boolean hasLogHandle() { return hasLogHandle; }
+          public int getLogHandle() { return logHandle_; }
+          
+          public final boolean isInitialized() {
+            if (!hasLogHandle) return false;
+            return true;
+          }
+          
+          public void writeTo(com.google.protobuf.CodedOutputStream output)
+                              throws java.io.IOException {
+            if (hasLogHandle()) {
+              output.writeUInt32(1, getLogHandle());
+            }
+            getUnknownFields().writeTo(output);
+          }
+          
+          private int memoizedSerializedSize = -1;
+          public int getSerializedSize() {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+          
+            size = 0;
+            if (hasLogHandle()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeUInt32Size(1, getLogHandle());
+            }
+            size += getUnknownFields().getSerializedSize();
+            memoizedSerializedSize = size;
+            return size;
+          }
+          
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(
+              com.google.protobuf.ByteString data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(
+              com.google.protobuf.ByteString data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(byte[] data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(
+              byte[] data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseDelimitedFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseDelimitedFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(
+              com.google.protobuf.CodedInputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog parseFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          
+          public static Builder newBuilder() { return Builder.create(); }
+          public Builder newBuilderForType() { return newBuilder(); }
+          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog prototype) {
+            return newBuilder().mergeFrom(prototype);
+          }
+          public Builder toBuilder() { return newBuilder(this); }
+          
+          public static final class Builder extends
+              com.google.protobuf.GeneratedMessage.Builder<Builder> {
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog result;
+            
+            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.newBuilder()
+            private Builder() {}
+            
+            private static Builder create() {
+              Builder builder = new Builder();
+              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog();
+              return builder;
+            }
+            
+            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog internalGetResult() {
+              return result;
+            }
+            
+            public Builder clear() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "Cannot call clear() after build().");
+              }
+              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog();
+              return this;
+            }
+            
+            public Builder clone() {
+              return create().mergeFrom(result);
+            }
+            
+            public com.google.protobuf.Descriptors.Descriptor
+                getDescriptorForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.getDescriptor();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog getDefaultInstanceForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.getDefaultInstance();
+            }
+            
+            public boolean isInitialized() {
+              return result.isInitialized();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog build() {
+              if (result != null && !isInitialized()) {
+                throw newUninitializedMessageException(result);
+              }
+              return buildPartial();
+            }
+            
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog buildParsed()
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              if (!isInitialized()) {
+                throw newUninitializedMessageException(
+                  result).asInvalidProtocolBufferException();
+              }
+              return buildPartial();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog buildPartial() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "build() has already been called on this Builder.");
+              }
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog returnMe = result;
+              result = null;
+              return returnMe;
+            }
+            
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog) {
+                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog)other);
+              } else {
+                super.mergeFrom(other);
+                return this;
+              }
+            }
+            
+            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog other) {
+              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.getDefaultInstance()) return this;
+              if (other.hasLogHandle()) {
+                setLogHandle(other.getLogHandle());
+              }
+              this.mergeUnknownFields(other.getUnknownFields());
+              return this;
+            }
+            
+            public Builder mergeFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                com.google.protobuf.UnknownFieldSet.newBuilder(
+                  this.getUnknownFields());
+              while (true) {
+                int tag = input.readTag();
+                switch (tag) {
+                  case 0:
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  default: {
+                    if (!parseUnknownField(input, unknownFields,
+                                           extensionRegistry, tag)) {
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    }
+                    break;
+                  }
+                  case 8: {
+                    setLogHandle(input.readUInt32());
+                    break;
+                  }
+                }
+              }
+            }
+            
+            
+            // required uint32 logHandle = 1;
+            public boolean hasLogHandle() {
+              return result.hasLogHandle();
+            }
+            public int getLogHandle() {
+              return result.getLogHandle();
+            }
+            public Builder setLogHandle(int value) {
+              result.hasLogHandle = true;
+              result.logHandle_ = value;
+              return this;
+            }
+            public Builder clearLogHandle() {
+              result.hasLogHandle = false;
+              result.logHandle_ = 0;
+              return this;
+            }
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+          }
+        }
+        
+        public static final class AddLogBranch extends
+            com.google.protobuf.GeneratedMessage {
+          // Use AddLogBranch.newBuilder() to construct.
+          private AddLogBranch() {}
+          
+          private static final AddLogBranch defaultInstance = new AddLogBranch();
+          public static AddLogBranch getDefaultInstance() {
+            return defaultInstance;
+          }
+          
+          public AddLogBranch getDefaultInstanceForType() {
+            return defaultInstance;
+          }
+          
+          public static final com.google.protobuf.Descriptors.Descriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLogBranch_descriptor;
+          }
+          
+          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+              internalGetFieldAccessorTable() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLogBranch_fieldAccessorTable;
+          }
+          
+          // required uint32 logHandle = 1;
+          public static final int LOGHANDLE_FIELD_NUMBER = 1;
+          private boolean hasLogHandle;
+          private int logHandle_ = 0;
+          public boolean hasLogHandle() { return hasLogHandle; }
+          public int getLogHandle() { return logHandle_; }
+          
+          public final boolean isInitialized() {
+            if (!hasLogHandle) return false;
+            return true;
+          }
+          
+          public void writeTo(com.google.protobuf.CodedOutputStream output)
+                              throws java.io.IOException {
+            if (hasLogHandle()) {
+              output.writeUInt32(1, getLogHandle());
+            }
+            getUnknownFields().writeTo(output);
+          }
+          
+          private int memoizedSerializedSize = -1;
+          public int getSerializedSize() {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+          
+            size = 0;
+            if (hasLogHandle()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeUInt32Size(1, getLogHandle());
+            }
+            size += getUnknownFields().getSerializedSize();
+            memoizedSerializedSize = size;
+            return size;
+          }
+          
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(
+              com.google.protobuf.ByteString data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(
+              com.google.protobuf.ByteString data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(byte[] data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(
+              byte[] data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseDelimitedFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseDelimitedFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(
+              com.google.protobuf.CodedInputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch parseFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          
+          public static Builder newBuilder() { return Builder.create(); }
+          public Builder newBuilderForType() { return newBuilder(); }
+          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch prototype) {
+            return newBuilder().mergeFrom(prototype);
+          }
+          public Builder toBuilder() { return newBuilder(this); }
+          
+          public static final class Builder extends
+              com.google.protobuf.GeneratedMessage.Builder<Builder> {
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch result;
+            
+            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.newBuilder()
+            private Builder() {}
+            
+            private static Builder create() {
+              Builder builder = new Builder();
+              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch();
+              return builder;
+            }
+            
+            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch internalGetResult() {
+              return result;
+            }
+            
+            public Builder clear() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "Cannot call clear() after build().");
+              }
+              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch();
+              return this;
+            }
+            
+            public Builder clone() {
+              return create().mergeFrom(result);
+            }
+            
+            public com.google.protobuf.Descriptors.Descriptor
+                getDescriptorForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.getDescriptor();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch getDefaultInstanceForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.getDefaultInstance();
+            }
+            
+            public boolean isInitialized() {
+              return result.isInitialized();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch build() {
+              if (result != null && !isInitialized()) {
+                throw newUninitializedMessageException(result);
+              }
+              return buildPartial();
+            }
+            
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch buildParsed()
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              if (!isInitialized()) {
+                throw newUninitializedMessageException(
+                  result).asInvalidProtocolBufferException();
+              }
+              return buildPartial();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch buildPartial() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "build() has already been called on this Builder.");
+              }
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch returnMe = result;
+              result = null;
+              return returnMe;
+            }
+            
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch) {
+                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch)other);
+              } else {
+                super.mergeFrom(other);
+                return this;
+              }
+            }
+            
+            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch other) {
+              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.getDefaultInstance()) return this;
+              if (other.hasLogHandle()) {
+                setLogHandle(other.getLogHandle());
+              }
+              this.mergeUnknownFields(other.getUnknownFields());
+              return this;
+            }
+            
+            public Builder mergeFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                com.google.protobuf.UnknownFieldSet.newBuilder(
+                  this.getUnknownFields());
+              while (true) {
+                int tag = input.readTag();
+                switch (tag) {
+                  case 0:
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  default: {
+                    if (!parseUnknownField(input, unknownFields,
+                                           extensionRegistry, tag)) {
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    }
+                    break;
+                  }
+                  case 8: {
+                    setLogHandle(input.readUInt32());
+                    break;
+                  }
+                }
+              }
+            }
+            
+            
+            // required uint32 logHandle = 1;
+            public boolean hasLogHandle() {
+              return result.hasLogHandle();
+            }
+            public int getLogHandle() {
+              return result.getLogHandle();
+            }
+            public Builder setLogHandle(int value) {
+              result.hasLogHandle = true;
+              result.logHandle_ = value;
+              return this;
+            }
+            public Builder clearLogHandle() {
+              result.hasLogHandle = false;
+              result.logHandle_ = 0;
+              return this;
+            }
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+          }
+        }
+        
+        // required .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.ResponseType responseType = 1;
+        public static final int RESPONSETYPE_FIELD_NUMBER = 1;
+        private boolean hasResponseType;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType responseType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType.CAPABILITY_EXCHANGE;
+        public boolean hasResponseType() { return hasResponseType; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType getResponseType() { return responseType_; }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.CapabilityExchange capabilityExchange = 2;
+        public static final int CAPABILITYEXCHANGE_FIELD_NUMBER = 2;
+        private boolean hasCapabilityExchange;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.getDefaultInstance();
+        public boolean hasCapabilityExchange() { return hasCapabilityExchange; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange getCapabilityExchange() { return capabilityExchange_; }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.AddLog addLog = 3;
+        public static final int ADDLOG_FIELD_NUMBER = 3;
+        private boolean hasAddLog;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog addLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.getDefaultInstance();
+        public boolean hasAddLog() { return hasAddLog; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog getAddLog() { return addLog_; }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.AddLogBranch addLogBranch = 4;
+        public static final int ADDLOGBRANCH_FIELD_NUMBER = 4;
+        private boolean hasAddLogBranch;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch addLogBranch_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.getDefaultInstance();
+        public boolean hasAddLogBranch() { return hasAddLogBranch; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch getAddLogBranch() { return addLogBranch_; }
+        
+        public final boolean isInitialized() {
+          if (!hasResponseType) return false;
+          if (hasCapabilityExchange()) {
+            if (!getCapabilityExchange().isInitialized()) return false;
+          }
+          if (hasAddLog()) {
+            if (!getAddLog().isInitialized()) return false;
+          }
+          if (hasAddLogBranch()) {
+            if (!getAddLogBranch().isInitialized()) return false;
+          }
+          return true;
+        }
+        
+        public void writeTo(com.google.protobuf.CodedOutputStream output)
+                            throws java.io.IOException {
+          if (hasResponseType()) {
+            output.writeEnum(1, getResponseType().getNumber());
+          }
+          if (hasCapabilityExchange()) {
+            output.writeMessage(2, getCapabilityExchange());
+          }
+          if (hasAddLog()) {
+            output.writeMessage(3, getAddLog());
+          }
+          if (hasAddLogBranch()) {
+            output.writeMessage(4, getAddLogBranch());
+          }
+          getUnknownFields().writeTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public int getSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+        
+          size = 0;
+          if (hasResponseType()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeEnumSize(1, getResponseType().getNumber());
+          }
+          if (hasCapabilityExchange()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeMessageSize(2, getCapabilityExchange());
+          }
+          if (hasAddLog()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeMessageSize(3, getAddLog());
+          }
+          if (hasAddLogBranch()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeMessageSize(4, getAddLogBranch());
+          }
+          size += getUnknownFields().getSerializedSize();
+          memoizedSerializedSize = size;
+          return size;
+        }
+        
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(
+            com.google.protobuf.ByteString data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(
+            com.google.protobuf.ByteString data,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(byte[] data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(
+            byte[] data,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(java.io.InputStream input)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(
+            java.io.InputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseDelimitedFrom(java.io.InputStream input)
+            throws java.io.IOException {
+          return newBuilder().mergeDelimitedFrom(input).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseDelimitedFrom(
+            java.io.InputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(
+            com.google.protobuf.CodedInputStream input)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse parseFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input, extensionRegistry)
+                   .buildParsed();
+        }
+        
+        public static Builder newBuilder() { return Builder.create(); }
+        public Builder newBuilderForType() { return newBuilder(); }
+        public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse prototype) {
+          return newBuilder().mergeFrom(prototype);
+        }
+        public Builder toBuilder() { return newBuilder(this); }
+        
+        public static final class Builder extends
+            com.google.protobuf.GeneratedMessage.Builder<Builder> {
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse result;
+          
+          // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.newBuilder()
+          private Builder() {}
+          
+          private static Builder create() {
+            Builder builder = new Builder();
+            builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse();
+            return builder;
+          }
+          
+          protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse internalGetResult() {
+            return result;
+          }
+          
+          public Builder clear() {
+            if (result == null) {
+              throw new IllegalStateException(
+                "Cannot call clear() after build().");
+            }
+            result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse();
+            return this;
+          }
+          
+          public Builder clone() {
+            return create().mergeFrom(result);
+          }
+          
+          public com.google.protobuf.Descriptors.Descriptor
+              getDescriptorForType() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.getDescriptor();
+          }
+          
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse getDefaultInstanceForType() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.getDefaultInstance();
+          }
+          
+          public boolean isInitialized() {
+            return result.isInitialized();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse build() {
+            if (result != null && !isInitialized()) {
+              throw newUninitializedMessageException(result);
+            }
+            return buildPartial();
+          }
+          
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse buildParsed()
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            if (!isInitialized()) {
+              throw newUninitializedMessageException(
+                result).asInvalidProtocolBufferException();
+            }
+            return buildPartial();
+          }
+          
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse buildPartial() {
+            if (result == null) {
+              throw new IllegalStateException(
+                "build() has already been called on this Builder.");
+            }
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public Builder mergeFrom(com.google.protobuf.Message other) {
+            if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse) {
+              return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse)other);
+            } else {
+              super.mergeFrom(other);
+              return this;
+            }
+          }
+          
+          public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse other) {
+            if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.getDefaultInstance()) return this;
+            if (other.hasResponseType()) {
+              setResponseType(other.getResponseType());
+            }
+            if (other.hasCapabilityExchange()) {
+              mergeCapabilityExchange(other.getCapabilityExchange());
+            }
+            if (other.hasAddLog()) {
+              mergeAddLog(other.getAddLog());
+            }
+            if (other.hasAddLogBranch()) {
+              mergeAddLogBranch(other.getAddLogBranch());
+            }
+            this.mergeUnknownFields(other.getUnknownFields());
+            return this;
+          }
+          
+          public Builder mergeFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+              com.google.protobuf.UnknownFieldSet.newBuilder(
+                this.getUnknownFields());
+            while (true) {
+              int tag = input.readTag();
+              switch (tag) {
+                case 0:
+                  this.setUnknownFields(unknownFields.build());
+                  return this;
+                default: {
+                  if (!parseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  }
+                  break;
+                }
+                case 8: {
+                  int rawValue = input.readEnum();
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType.valueOf(rawValue);
+                  if (value == null) {
+                    unknownFields.mergeVarintField(1, rawValue);
+                  } else {
+                    setResponseType(value);
+                  }
+                  break;
+                }
+                case 18: {
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.newBuilder();
+                  if (hasCapabilityExchange()) {
+                    subBuilder.mergeFrom(getCapabilityExchange());
+                  }
+                  input.readMessage(subBuilder, extensionRegistry);
+                  setCapabilityExchange(subBuilder.buildPartial());
+                  break;
+                }
+                case 26: {
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.newBuilder();
+                  if (hasAddLog()) {
+                    subBuilder.mergeFrom(getAddLog());
+                  }
+                  input.readMessage(subBuilder, extensionRegistry);
+                  setAddLog(subBuilder.buildPartial());
+                  break;
+                }
+                case 34: {
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.newBuilder();
+                  if (hasAddLogBranch()) {
+                    subBuilder.mergeFrom(getAddLogBranch());
+                  }
+                  input.readMessage(subBuilder, extensionRegistry);
+                  setAddLogBranch(subBuilder.buildPartial());
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // required .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.ResponseType responseType = 1;
+          public boolean hasResponseType() {
+            return result.hasResponseType();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType getResponseType() {
+            return result.getResponseType();
+          }
+          public Builder setResponseType(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasResponseType = true;
+            result.responseType_ = value;
+            return this;
+          }
+          public Builder clearResponseType() {
+            result.hasResponseType = false;
+            result.responseType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.ResponseType.CAPABILITY_EXCHANGE;
+            return this;
+          }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.CapabilityExchange capabilityExchange = 2;
+          public boolean hasCapabilityExchange() {
+            return result.hasCapabilityExchange();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange getCapabilityExchange() {
+            return result.getCapabilityExchange();
+          }
+          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasCapabilityExchange = true;
+            result.capabilityExchange_ = value;
+            return this;
+          }
+          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Builder builderForValue) {
+            result.hasCapabilityExchange = true;
+            result.capabilityExchange_ = builderForValue.build();
+            return this;
+          }
+          public Builder mergeCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange value) {
+            if (result.hasCapabilityExchange() &&
+                result.capabilityExchange_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.getDefaultInstance()) {
+              result.capabilityExchange_ =
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.newBuilder(result.capabilityExchange_).mergeFrom(value).buildPartial();
+            } else {
+              result.capabilityExchange_ = value;
+            }
+            result.hasCapabilityExchange = true;
+            return this;
+          }
+          public Builder clearCapabilityExchange() {
+            result.hasCapabilityExchange = false;
+            result.capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.getDefaultInstance();
+            return this;
+          }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.AddLog addLog = 3;
+          public boolean hasAddLog() {
+            return result.hasAddLog();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog getAddLog() {
+            return result.getAddLog();
+          }
+          public Builder setAddLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasAddLog = true;
+            result.addLog_ = value;
+            return this;
+          }
+          public Builder setAddLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.Builder builderForValue) {
+            result.hasAddLog = true;
+            result.addLog_ = builderForValue.build();
+            return this;
+          }
+          public Builder mergeAddLog(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog value) {
+            if (result.hasAddLog() &&
+                result.addLog_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.getDefaultInstance()) {
+              result.addLog_ =
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.newBuilder(result.addLog_).mergeFrom(value).buildPartial();
+            } else {
+              result.addLog_ = value;
+            }
+            result.hasAddLog = true;
+            return this;
+          }
+          public Builder clearAddLog() {
+            result.hasAddLog = false;
+            result.addLog_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.getDefaultInstance();
+            return this;
+          }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse.AddLogBranch addLogBranch = 4;
+          public boolean hasAddLogBranch() {
+            return result.hasAddLogBranch();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch getAddLogBranch() {
+            return result.getAddLogBranch();
+          }
+          public Builder setAddLogBranch(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasAddLogBranch = true;
+            result.addLogBranch_ = value;
+            return this;
+          }
+          public Builder setAddLogBranch(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.Builder builderForValue) {
+            result.hasAddLogBranch = true;
+            result.addLogBranch_ = builderForValue.build();
+            return this;
+          }
+          public Builder mergeAddLogBranch(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch value) {
+            if (result.hasAddLogBranch() &&
+                result.addLogBranch_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.getDefaultInstance()) {
+              result.addLogBranch_ =
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.newBuilder(result.addLogBranch_).mergeFrom(value).buildPartial();
+            } else {
+              result.addLogBranch_ = value;
+            }
+            result.hasAddLogBranch = true;
+            return this;
+          }
+          public Builder clearAddLogBranch() {
+            result.hasAddLogBranch = false;
+            result.addLogBranch_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.getDefaultInstance();
+            return this;
+          }
+        }
+        
+        static {
+          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+        }
+        
+        static {
+          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+        }
+      }
+      
+      public static final class DevModeResponse extends
+          com.google.protobuf.GeneratedMessage {
+        // Use DevModeResponse.newBuilder() to construct.
+        private DevModeResponse() {}
+        
+        private static final DevModeResponse defaultInstance = new DevModeResponse();
+        public static DevModeResponse getDefaultInstance() {
+          return defaultInstance;
+        }
+        
+        public DevModeResponse getDefaultInstanceForType() {
+          return defaultInstance;
+        }
+        
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_fieldAccessorTable;
+        }
+        
+        public enum ResponseType
+            implements com.google.protobuf.ProtocolMessageEnum {
+          CAPABILITY_EXCHANGE(0, 0),
+          RESTART_WEB_SERVER(1, 1),
+          ;
+          
+          
+          public final int getNumber() { return value; }
+          
+          public static ResponseType valueOf(int value) {
+            switch (value) {
+              case 0: return CAPABILITY_EXCHANGE;
+              case 1: return RESTART_WEB_SERVER;
+              default: return null;
+            }
+          }
+          
+          public static com.google.protobuf.Internal.EnumLiteMap<ResponseType>
+              internalGetValueMap() {
+            return internalValueMap;
+          }
+          private static com.google.protobuf.Internal.EnumLiteMap<ResponseType>
+              internalValueMap =
+                new com.google.protobuf.Internal.EnumLiteMap<ResponseType>() {
+                  public ResponseType findValueByNumber(int number) {
+                    return ResponseType.valueOf(number)
+          ;        }
+                };
+          
+          public final com.google.protobuf.Descriptors.EnumValueDescriptor
+              getValueDescriptor() {
+            return getDescriptor().getValues().get(index);
+          }
+          public final com.google.protobuf.Descriptors.EnumDescriptor
+              getDescriptorForType() {
+            return getDescriptor();
+          }
+          public static final com.google.protobuf.Descriptors.EnumDescriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.getDescriptor().getEnumTypes().get(0);
+          }
+          
+          private static final ResponseType[] VALUES = {
+            CAPABILITY_EXCHANGE, RESTART_WEB_SERVER, 
+          };
+          public static ResponseType valueOf(
+              com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+            if (desc.getType() != getDescriptor()) {
+              throw new java.lang.IllegalArgumentException(
+                "EnumValueDescriptor is not for this type.");
+            }
+            return VALUES[desc.getIndex()];
+          }
+          private final int index;
+          private final int value;
+          private ResponseType(int index, int value) {
+            this.index = index;
+            this.value = value;
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+        }
+        
+        public static final class CapabilityExchange extends
+            com.google.protobuf.GeneratedMessage {
+          // Use CapabilityExchange.newBuilder() to construct.
+          private CapabilityExchange() {}
+          
+          private static final CapabilityExchange defaultInstance = new CapabilityExchange();
+          public static CapabilityExchange getDefaultInstance() {
+            return defaultInstance;
+          }
+          
+          public CapabilityExchange getDefaultInstanceForType() {
+            return defaultInstance;
+          }
+          
+          public static final com.google.protobuf.Descriptors.Descriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_descriptor;
+          }
+          
+          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+              internalGetFieldAccessorTable() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_fieldAccessorTable;
+          }
+          
+          public static final class Capability extends
+              com.google.protobuf.GeneratedMessage {
+            // Use Capability.newBuilder() to construct.
+            private Capability() {}
+            
+            private static final Capability defaultInstance = new Capability();
+            public static Capability getDefaultInstance() {
+              return defaultInstance;
+            }
+            
+            public Capability getDefaultInstanceForType() {
+              return defaultInstance;
+            }
+            
+            public static final com.google.protobuf.Descriptors.Descriptor
+                getDescriptor() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_Capability_descriptor;
+            }
+            
+            protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+                internalGetFieldAccessorTable() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_Capability_fieldAccessorTable;
+            }
+            
+            // required .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.RequestType capability = 1;
+            public static final int CAPABILITY_FIELD_NUMBER = 1;
+            private boolean hasCapability;
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType capability_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType.CAPABILITY_EXCHANGE;
+            public boolean hasCapability() { return hasCapability; }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType getCapability() { return capability_; }
+            
+            public final boolean isInitialized() {
+              if (!hasCapability) return false;
+              return true;
+            }
+            
+            public void writeTo(com.google.protobuf.CodedOutputStream output)
+                                throws java.io.IOException {
+              if (hasCapability()) {
+                output.writeEnum(1, getCapability().getNumber());
+              }
+              getUnknownFields().writeTo(output);
+            }
+            
+            private int memoizedSerializedSize = -1;
+            public int getSerializedSize() {
+              int size = memoizedSerializedSize;
+              if (size != -1) return size;
+            
+              size = 0;
+              if (hasCapability()) {
+                size += com.google.protobuf.CodedOutputStream
+                  .computeEnumSize(1, getCapability().getNumber());
+              }
+              size += getUnknownFields().getSerializedSize();
+              memoizedSerializedSize = size;
+              return size;
+            }
+            
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(
+                com.google.protobuf.ByteString data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(
+                com.google.protobuf.ByteString data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(byte[] data)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(
+                byte[] data,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              return newBuilder().mergeFrom(data, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(java.io.InputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseDelimitedFrom(java.io.InputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeDelimitedFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseDelimitedFrom(
+                java.io.InputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(
+                com.google.protobuf.CodedInputStream input)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input).buildParsed();
+            }
+            public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability parseFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              return newBuilder().mergeFrom(input, extensionRegistry)
+                       .buildParsed();
+            }
+            
+            public static Builder newBuilder() { return Builder.create(); }
+            public Builder newBuilderForType() { return newBuilder(); }
+            public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability prototype) {
+              return newBuilder().mergeFrom(prototype);
+            }
+            public Builder toBuilder() { return newBuilder(this); }
+            
+            public static final class Builder extends
+                com.google.protobuf.GeneratedMessage.Builder<Builder> {
+              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability result;
+              
+              // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.newBuilder()
+              private Builder() {}
+              
+              private static Builder create() {
+                Builder builder = new Builder();
+                builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability();
+                return builder;
+              }
+              
+              protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability internalGetResult() {
+                return result;
+              }
+              
+              public Builder clear() {
+                if (result == null) {
+                  throw new IllegalStateException(
+                    "Cannot call clear() after build().");
+                }
+                result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability();
+                return this;
+              }
+              
+              public Builder clone() {
+                return create().mergeFrom(result);
+              }
+              
+              public com.google.protobuf.Descriptors.Descriptor
+                  getDescriptorForType() {
+                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.getDescriptor();
+              }
+              
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability getDefaultInstanceForType() {
+                return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.getDefaultInstance();
+              }
+              
+              public boolean isInitialized() {
+                return result.isInitialized();
+              }
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability build() {
+                if (result != null && !isInitialized()) {
+                  throw newUninitializedMessageException(result);
+                }
+                return buildPartial();
+              }
+              
+              private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability buildParsed()
+                  throws com.google.protobuf.InvalidProtocolBufferException {
+                if (!isInitialized()) {
+                  throw newUninitializedMessageException(
+                    result).asInvalidProtocolBufferException();
+                }
+                return buildPartial();
+              }
+              
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability buildPartial() {
+                if (result == null) {
+                  throw new IllegalStateException(
+                    "build() has already been called on this Builder.");
+                }
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability returnMe = result;
+                result = null;
+                return returnMe;
+              }
+              
+              public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability) {
+                  return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability)other);
+                } else {
+                  super.mergeFrom(other);
+                  return this;
+                }
+              }
+              
+              public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability other) {
+                if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.getDefaultInstance()) return this;
+                if (other.hasCapability()) {
+                  setCapability(other.getCapability());
+                }
+                this.mergeUnknownFields(other.getUnknownFields());
+                return this;
+              }
+              
+              public Builder mergeFrom(
+                  com.google.protobuf.CodedInputStream input,
+                  com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                  throws java.io.IOException {
+                com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                  com.google.protobuf.UnknownFieldSet.newBuilder(
+                    this.getUnknownFields());
+                while (true) {
+                  int tag = input.readTag();
+                  switch (tag) {
+                    case 0:
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    default: {
+                      if (!parseUnknownField(input, unknownFields,
+                                             extensionRegistry, tag)) {
+                        this.setUnknownFields(unknownFields.build());
+                        return this;
+                      }
+                      break;
+                    }
+                    case 8: {
+                      int rawValue = input.readEnum();
+                      com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType.valueOf(rawValue);
+                      if (value == null) {
+                        unknownFields.mergeVarintField(1, rawValue);
+                      } else {
+                        setCapability(value);
+                      }
+                      break;
+                    }
+                  }
+                }
+              }
+              
+              
+              // required .com.google.gwt.dev.shell.remoteui.Message.Request.DevModeRequest.RequestType capability = 1;
+              public boolean hasCapability() {
+                return result.hasCapability();
+              }
+              public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType getCapability() {
+                return result.getCapability();
+              }
+              public Builder setCapability(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType value) {
+                if (value == null) {
+                  throw new NullPointerException();
+                }
+                result.hasCapability = true;
+                result.capability_ = value;
+                return this;
+              }
+              public Builder clearCapability() {
+                result.hasCapability = false;
+                result.capability_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType.CAPABILITY_EXCHANGE;
+                return this;
+              }
+            }
+            
+            static {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+            }
+            
+            static {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+            }
+          }
+          
+          // repeated .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.CapabilityExchange.Capability capabilities = 2;
+          public static final int CAPABILITIES_FIELD_NUMBER = 2;
+          private java.util.List<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability> capabilities_ =
+            java.util.Collections.emptyList();
+          public java.util.List<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability> getCapabilitiesList() {
+            return capabilities_;
+          }
+          public int getCapabilitiesCount() { return capabilities_.size(); }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability getCapabilities(int index) {
+            return capabilities_.get(index);
+          }
+          
+          public final boolean isInitialized() {
+            for (com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability element : getCapabilitiesList()) {
+              if (!element.isInitialized()) return false;
+            }
+            return true;
+          }
+          
+          public void writeTo(com.google.protobuf.CodedOutputStream output)
+                              throws java.io.IOException {
+            for (com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability element : getCapabilitiesList()) {
+              output.writeMessage(2, element);
+            }
+            getUnknownFields().writeTo(output);
+          }
+          
+          private int memoizedSerializedSize = -1;
+          public int getSerializedSize() {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+          
+            size = 0;
+            for (com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability element : getCapabilitiesList()) {
+              size += com.google.protobuf.CodedOutputStream
+                .computeMessageSize(2, element);
+            }
+            size += getUnknownFields().getSerializedSize();
+            memoizedSerializedSize = size;
+            return size;
+          }
+          
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(
+              com.google.protobuf.ByteString data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(
+              com.google.protobuf.ByteString data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(byte[] data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(
+              byte[] data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseDelimitedFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseDelimitedFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(
+              com.google.protobuf.CodedInputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange parseFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          
+          public static Builder newBuilder() { return Builder.create(); }
+          public Builder newBuilderForType() { return newBuilder(); }
+          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange prototype) {
+            return newBuilder().mergeFrom(prototype);
+          }
+          public Builder toBuilder() { return newBuilder(this); }
+          
+          public static final class Builder extends
+              com.google.protobuf.GeneratedMessage.Builder<Builder> {
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange result;
+            
+            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.newBuilder()
+            private Builder() {}
+            
+            private static Builder create() {
+              Builder builder = new Builder();
+              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange();
+              return builder;
+            }
+            
+            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange internalGetResult() {
+              return result;
+            }
+            
+            public Builder clear() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "Cannot call clear() after build().");
+              }
+              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange();
+              return this;
+            }
+            
+            public Builder clone() {
+              return create().mergeFrom(result);
+            }
+            
+            public com.google.protobuf.Descriptors.Descriptor
+                getDescriptorForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.getDescriptor();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange getDefaultInstanceForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.getDefaultInstance();
+            }
+            
+            public boolean isInitialized() {
+              return result.isInitialized();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange build() {
+              if (result != null && !isInitialized()) {
+                throw newUninitializedMessageException(result);
+              }
+              return buildPartial();
+            }
+            
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange buildParsed()
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              if (!isInitialized()) {
+                throw newUninitializedMessageException(
+                  result).asInvalidProtocolBufferException();
+              }
+              return buildPartial();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange buildPartial() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "build() has already been called on this Builder.");
+              }
+              if (result.capabilities_ != java.util.Collections.EMPTY_LIST) {
+                result.capabilities_ =
+                  java.util.Collections.unmodifiableList(result.capabilities_);
+              }
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange returnMe = result;
+              result = null;
+              return returnMe;
+            }
+            
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange) {
+                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange)other);
+              } else {
+                super.mergeFrom(other);
+                return this;
+              }
+            }
+            
+            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange other) {
+              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.getDefaultInstance()) return this;
+              if (!other.capabilities_.isEmpty()) {
+                if (result.capabilities_.isEmpty()) {
+                  result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability>();
+                }
+                result.capabilities_.addAll(other.capabilities_);
+              }
+              this.mergeUnknownFields(other.getUnknownFields());
+              return this;
+            }
+            
+            public Builder mergeFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                com.google.protobuf.UnknownFieldSet.newBuilder(
+                  this.getUnknownFields());
+              while (true) {
+                int tag = input.readTag();
+                switch (tag) {
+                  case 0:
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  default: {
+                    if (!parseUnknownField(input, unknownFields,
+                                           extensionRegistry, tag)) {
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    }
+                    break;
+                  }
+                  case 18: {
+                    com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.newBuilder();
+                    input.readMessage(subBuilder, extensionRegistry);
+                    addCapabilities(subBuilder.buildPartial());
+                    break;
+                  }
+                }
+              }
+            }
+            
+            
+            // repeated .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.CapabilityExchange.Capability capabilities = 2;
+            public java.util.List<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability> getCapabilitiesList() {
+              return java.util.Collections.unmodifiableList(result.capabilities_);
+            }
+            public int getCapabilitiesCount() {
+              return result.getCapabilitiesCount();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability getCapabilities(int index) {
+              return result.getCapabilities(index);
+            }
+            public Builder setCapabilities(int index, com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability value) {
+              if (value == null) {
+                throw new NullPointerException();
+              }
+              result.capabilities_.set(index, value);
+              return this;
+            }
+            public Builder setCapabilities(int index, com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.Builder builderForValue) {
+              result.capabilities_.set(index, builderForValue.build());
+              return this;
+            }
+            public Builder addCapabilities(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability value) {
+              if (value == null) {
+                throw new NullPointerException();
+              }
+              if (result.capabilities_.isEmpty()) {
+                result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability>();
+              }
+              result.capabilities_.add(value);
+              return this;
+            }
+            public Builder addCapabilities(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.Builder builderForValue) {
+              if (result.capabilities_.isEmpty()) {
+                result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability>();
+              }
+              result.capabilities_.add(builderForValue.build());
+              return this;
+            }
+            public Builder addAllCapabilities(
+                java.lang.Iterable<? extends com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability> values) {
+              if (result.capabilities_.isEmpty()) {
+                result.capabilities_ = new java.util.ArrayList<com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability>();
+              }
+              super.addAll(values, result.capabilities_);
+              return this;
+            }
+            public Builder clearCapabilities() {
+              result.capabilities_ = java.util.Collections.emptyList();
+              return this;
+            }
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+          }
+        }
+        
+        public static final class RestartWebServer extends
+            com.google.protobuf.GeneratedMessage {
+          // Use RestartWebServer.newBuilder() to construct.
+          private RestartWebServer() {}
+          
+          private static final RestartWebServer defaultInstance = new RestartWebServer();
+          public static RestartWebServer getDefaultInstance() {
+            return defaultInstance;
+          }
+          
+          public RestartWebServer getDefaultInstanceForType() {
+            return defaultInstance;
+          }
+          
+          public static final com.google.protobuf.Descriptors.Descriptor
+              getDescriptor() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_RestartWebServer_descriptor;
+          }
+          
+          protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+              internalGetFieldAccessorTable() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_RestartWebServer_fieldAccessorTable;
+          }
+          
+          public final boolean isInitialized() {
+            return true;
+          }
+          
+          public void writeTo(com.google.protobuf.CodedOutputStream output)
+                              throws java.io.IOException {
+            getUnknownFields().writeTo(output);
+          }
+          
+          private int memoizedSerializedSize = -1;
+          public int getSerializedSize() {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+          
+            size = 0;
+            size += getUnknownFields().getSerializedSize();
+            memoizedSerializedSize = size;
+            return size;
+          }
+          
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(
+              com.google.protobuf.ByteString data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(
+              com.google.protobuf.ByteString data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(byte[] data)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(
+              byte[] data,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            return newBuilder().mergeFrom(data, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseDelimitedFrom(java.io.InputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseDelimitedFrom(
+              java.io.InputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(
+              com.google.protobuf.CodedInputStream input)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input).buildParsed();
+          }
+          public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer parseFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            return newBuilder().mergeFrom(input, extensionRegistry)
+                     .buildParsed();
+          }
+          
+          public static Builder newBuilder() { return Builder.create(); }
+          public Builder newBuilderForType() { return newBuilder(); }
+          public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer prototype) {
+            return newBuilder().mergeFrom(prototype);
+          }
+          public Builder toBuilder() { return newBuilder(this); }
+          
+          public static final class Builder extends
+              com.google.protobuf.GeneratedMessage.Builder<Builder> {
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer result;
+            
+            // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.newBuilder()
+            private Builder() {}
+            
+            private static Builder create() {
+              Builder builder = new Builder();
+              builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer();
+              return builder;
+            }
+            
+            protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer internalGetResult() {
+              return result;
+            }
+            
+            public Builder clear() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "Cannot call clear() after build().");
+              }
+              result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer();
+              return this;
+            }
+            
+            public Builder clone() {
+              return create().mergeFrom(result);
+            }
+            
+            public com.google.protobuf.Descriptors.Descriptor
+                getDescriptorForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.getDescriptor();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer getDefaultInstanceForType() {
+              return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.getDefaultInstance();
+            }
+            
+            public boolean isInitialized() {
+              return result.isInitialized();
+            }
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer build() {
+              if (result != null && !isInitialized()) {
+                throw newUninitializedMessageException(result);
+              }
+              return buildPartial();
+            }
+            
+            private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer buildParsed()
+                throws com.google.protobuf.InvalidProtocolBufferException {
+              if (!isInitialized()) {
+                throw newUninitializedMessageException(
+                  result).asInvalidProtocolBufferException();
+              }
+              return buildPartial();
+            }
+            
+            public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer buildPartial() {
+              if (result == null) {
+                throw new IllegalStateException(
+                  "build() has already been called on this Builder.");
+              }
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer returnMe = result;
+              result = null;
+              return returnMe;
+            }
+            
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+              if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer) {
+                return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer)other);
+              } else {
+                super.mergeFrom(other);
+                return this;
+              }
+            }
+            
+            public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer other) {
+              if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.getDefaultInstance()) return this;
+              this.mergeUnknownFields(other.getUnknownFields());
+              return this;
+            }
+            
+            public Builder mergeFrom(
+                com.google.protobuf.CodedInputStream input,
+                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+                throws java.io.IOException {
+              com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+                com.google.protobuf.UnknownFieldSet.newBuilder(
+                  this.getUnknownFields());
+              while (true) {
+                int tag = input.readTag();
+                switch (tag) {
+                  case 0:
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  default: {
+                    if (!parseUnknownField(input, unknownFields,
+                                           extensionRegistry, tag)) {
+                      this.setUnknownFields(unknownFields.build());
+                      return this;
+                    }
+                    break;
+                  }
+                }
+              }
+            }
+            
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+          }
+          
+          static {
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+          }
+        }
+        
+        // required .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.ResponseType responseType = 1;
+        public static final int RESPONSETYPE_FIELD_NUMBER = 1;
+        private boolean hasResponseType;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType responseType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType.CAPABILITY_EXCHANGE;
+        public boolean hasResponseType() { return hasResponseType; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType getResponseType() { return responseType_; }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.CapabilityExchange capabilityExchange = 2;
+        public static final int CAPABILITYEXCHANGE_FIELD_NUMBER = 2;
+        private boolean hasCapabilityExchange;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.getDefaultInstance();
+        public boolean hasCapabilityExchange() { return hasCapabilityExchange; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange getCapabilityExchange() { return capabilityExchange_; }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.RestartWebServer restartWebServer = 3;
+        public static final int RESTARTWEBSERVER_FIELD_NUMBER = 3;
+        private boolean hasRestartWebServer;
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer restartWebServer_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.getDefaultInstance();
+        public boolean hasRestartWebServer() { return hasRestartWebServer; }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer getRestartWebServer() { return restartWebServer_; }
+        
+        public final boolean isInitialized() {
+          if (!hasResponseType) return false;
+          if (hasCapabilityExchange()) {
+            if (!getCapabilityExchange().isInitialized()) return false;
+          }
+          return true;
+        }
+        
+        public void writeTo(com.google.protobuf.CodedOutputStream output)
+                            throws java.io.IOException {
+          if (hasResponseType()) {
+            output.writeEnum(1, getResponseType().getNumber());
+          }
+          if (hasCapabilityExchange()) {
+            output.writeMessage(2, getCapabilityExchange());
+          }
+          if (hasRestartWebServer()) {
+            output.writeMessage(3, getRestartWebServer());
+          }
+          getUnknownFields().writeTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public int getSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+        
+          size = 0;
+          if (hasResponseType()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeEnumSize(1, getResponseType().getNumber());
+          }
+          if (hasCapabilityExchange()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeMessageSize(2, getCapabilityExchange());
+          }
+          if (hasRestartWebServer()) {
+            size += com.google.protobuf.CodedOutputStream
+              .computeMessageSize(3, getRestartWebServer());
+          }
+          size += getUnknownFields().getSerializedSize();
+          memoizedSerializedSize = size;
+          return size;
+        }
+        
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(
+            com.google.protobuf.ByteString data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(
+            com.google.protobuf.ByteString data,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(byte[] data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(
+            byte[] data,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          return newBuilder().mergeFrom(data, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(java.io.InputStream input)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(
+            java.io.InputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseDelimitedFrom(java.io.InputStream input)
+            throws java.io.IOException {
+          return newBuilder().mergeDelimitedFrom(input).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseDelimitedFrom(
+            java.io.InputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                   .buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(
+            com.google.protobuf.CodedInputStream input)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input).buildParsed();
+        }
+        public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse parseFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          return newBuilder().mergeFrom(input, extensionRegistry)
+                   .buildParsed();
+        }
+        
+        public static Builder newBuilder() { return Builder.create(); }
+        public Builder newBuilderForType() { return newBuilder(); }
+        public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse prototype) {
+          return newBuilder().mergeFrom(prototype);
+        }
+        public Builder toBuilder() { return newBuilder(this); }
+        
+        public static final class Builder extends
+            com.google.protobuf.GeneratedMessage.Builder<Builder> {
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse result;
+          
+          // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.newBuilder()
+          private Builder() {}
+          
+          private static Builder create() {
+            Builder builder = new Builder();
+            builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse();
+            return builder;
+          }
+          
+          protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse internalGetResult() {
+            return result;
+          }
+          
+          public Builder clear() {
+            if (result == null) {
+              throw new IllegalStateException(
+                "Cannot call clear() after build().");
+            }
+            result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse();
+            return this;
+          }
+          
+          public Builder clone() {
+            return create().mergeFrom(result);
+          }
+          
+          public com.google.protobuf.Descriptors.Descriptor
+              getDescriptorForType() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.getDescriptor();
+          }
+          
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse getDefaultInstanceForType() {
+            return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.getDefaultInstance();
+          }
+          
+          public boolean isInitialized() {
+            return result.isInitialized();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse build() {
+            if (result != null && !isInitialized()) {
+              throw newUninitializedMessageException(result);
+            }
+            return buildPartial();
+          }
+          
+          private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse buildParsed()
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            if (!isInitialized()) {
+              throw newUninitializedMessageException(
+                result).asInvalidProtocolBufferException();
+            }
+            return buildPartial();
+          }
+          
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse buildPartial() {
+            if (result == null) {
+              throw new IllegalStateException(
+                "build() has already been called on this Builder.");
+            }
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public Builder mergeFrom(com.google.protobuf.Message other) {
+            if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse) {
+              return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse)other);
+            } else {
+              super.mergeFrom(other);
+              return this;
+            }
+          }
+          
+          public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse other) {
+            if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.getDefaultInstance()) return this;
+            if (other.hasResponseType()) {
+              setResponseType(other.getResponseType());
+            }
+            if (other.hasCapabilityExchange()) {
+              mergeCapabilityExchange(other.getCapabilityExchange());
+            }
+            if (other.hasRestartWebServer()) {
+              mergeRestartWebServer(other.getRestartWebServer());
+            }
+            this.mergeUnknownFields(other.getUnknownFields());
+            return this;
+          }
+          
+          public Builder mergeFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws java.io.IOException {
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+              com.google.protobuf.UnknownFieldSet.newBuilder(
+                this.getUnknownFields());
+            while (true) {
+              int tag = input.readTag();
+              switch (tag) {
+                case 0:
+                  this.setUnknownFields(unknownFields.build());
+                  return this;
+                default: {
+                  if (!parseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.setUnknownFields(unknownFields.build());
+                    return this;
+                  }
+                  break;
+                }
+                case 8: {
+                  int rawValue = input.readEnum();
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType.valueOf(rawValue);
+                  if (value == null) {
+                    unknownFields.mergeVarintField(1, rawValue);
+                  } else {
+                    setResponseType(value);
+                  }
+                  break;
+                }
+                case 18: {
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.newBuilder();
+                  if (hasCapabilityExchange()) {
+                    subBuilder.mergeFrom(getCapabilityExchange());
+                  }
+                  input.readMessage(subBuilder, extensionRegistry);
+                  setCapabilityExchange(subBuilder.buildPartial());
+                  break;
+                }
+                case 26: {
+                  com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.newBuilder();
+                  if (hasRestartWebServer()) {
+                    subBuilder.mergeFrom(getRestartWebServer());
+                  }
+                  input.readMessage(subBuilder, extensionRegistry);
+                  setRestartWebServer(subBuilder.buildPartial());
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // required .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.ResponseType responseType = 1;
+          public boolean hasResponseType() {
+            return result.hasResponseType();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType getResponseType() {
+            return result.getResponseType();
+          }
+          public Builder setResponseType(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasResponseType = true;
+            result.responseType_ = value;
+            return this;
+          }
+          public Builder clearResponseType() {
+            result.hasResponseType = false;
+            result.responseType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.ResponseType.CAPABILITY_EXCHANGE;
+            return this;
+          }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.CapabilityExchange capabilityExchange = 2;
+          public boolean hasCapabilityExchange() {
+            return result.hasCapabilityExchange();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange getCapabilityExchange() {
+            return result.getCapabilityExchange();
+          }
+          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasCapabilityExchange = true;
+            result.capabilityExchange_ = value;
+            return this;
+          }
+          public Builder setCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Builder builderForValue) {
+            result.hasCapabilityExchange = true;
+            result.capabilityExchange_ = builderForValue.build();
+            return this;
+          }
+          public Builder mergeCapabilityExchange(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange value) {
+            if (result.hasCapabilityExchange() &&
+                result.capabilityExchange_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.getDefaultInstance()) {
+              result.capabilityExchange_ =
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.newBuilder(result.capabilityExchange_).mergeFrom(value).buildPartial();
+            } else {
+              result.capabilityExchange_ = value;
+            }
+            result.hasCapabilityExchange = true;
+            return this;
+          }
+          public Builder clearCapabilityExchange() {
+            result.hasCapabilityExchange = false;
+            result.capabilityExchange_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.getDefaultInstance();
+            return this;
+          }
+          
+          // optional .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse.RestartWebServer restartWebServer = 3;
+          public boolean hasRestartWebServer() {
+            return result.hasRestartWebServer();
+          }
+          public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer getRestartWebServer() {
+            return result.getRestartWebServer();
+          }
+          public Builder setRestartWebServer(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer value) {
+            if (value == null) {
+              throw new NullPointerException();
+            }
+            result.hasRestartWebServer = true;
+            result.restartWebServer_ = value;
+            return this;
+          }
+          public Builder setRestartWebServer(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.Builder builderForValue) {
+            result.hasRestartWebServer = true;
+            result.restartWebServer_ = builderForValue.build();
+            return this;
+          }
+          public Builder mergeRestartWebServer(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer value) {
+            if (result.hasRestartWebServer() &&
+                result.restartWebServer_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.getDefaultInstance()) {
+              result.restartWebServer_ =
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.newBuilder(result.restartWebServer_).mergeFrom(value).buildPartial();
+            } else {
+              result.restartWebServer_ = value;
+            }
+            result.hasRestartWebServer = true;
+            return this;
+          }
+          public Builder clearRestartWebServer() {
+            result.hasRestartWebServer = false;
+            result.restartWebServer_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.getDefaultInstance();
+            return this;
+          }
+        }
+        
+        static {
+          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+        }
+        
+        static {
+          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+        }
+      }
+      
+      // required uint32 requestId = 1;
+      public static final int REQUESTID_FIELD_NUMBER = 1;
+      private boolean hasRequestId;
+      private int requestId_ = 0;
+      public boolean hasRequestId() { return hasRequestId; }
+      public int getRequestId() { return requestId_; }
+      
+      // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse viewerResponse = 2;
+      public static final int VIEWERRESPONSE_FIELD_NUMBER = 2;
+      private boolean hasViewerResponse;
+      private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse viewerResponse_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.getDefaultInstance();
+      public boolean hasViewerResponse() { return hasViewerResponse; }
+      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse getViewerResponse() { return viewerResponse_; }
+      
+      // optional .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse devModeResponse = 3;
+      public static final int DEVMODERESPONSE_FIELD_NUMBER = 3;
+      private boolean hasDevModeResponse;
+      private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse devModeResponse_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.getDefaultInstance();
+      public boolean hasDevModeResponse() { return hasDevModeResponse; }
+      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse getDevModeResponse() { return devModeResponse_; }
+      
+      public final boolean isInitialized() {
+        if (!hasRequestId) return false;
+        if (hasViewerResponse()) {
+          if (!getViewerResponse().isInitialized()) return false;
+        }
+        if (hasDevModeResponse()) {
+          if (!getDevModeResponse().isInitialized()) return false;
+        }
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        if (hasRequestId()) {
+          output.writeUInt32(1, getRequestId());
+        }
+        if (hasViewerResponse()) {
+          output.writeMessage(2, getViewerResponse());
+        }
+        if (hasDevModeResponse()) {
+          output.writeMessage(3, getDevModeResponse());
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (hasRequestId()) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeUInt32Size(1, getRequestId());
+        }
+        if (hasViewerResponse()) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(2, getViewerResponse());
+        }
+        if (hasDevModeResponse()) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeMessageSize(3, getDevModeResponse());
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeDelimitedFrom(input).buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder> {
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response result;
+        
+        // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.newBuilder()
+        private Builder() {}
+        
+        private static Builder create() {
+          Builder builder = new Builder();
+          builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response();
+          return builder;
+        }
+        
+        protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response internalGetResult() {
+          return result;
+        }
+        
+        public Builder clear() {
+          if (result == null) {
+            throw new IllegalStateException(
+              "Cannot call clear() after build().");
+          }
+          result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response();
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(result);
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.getDescriptor();
+        }
+        
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response getDefaultInstanceForType() {
+          return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.getDefaultInstance();
+        }
+        
+        public boolean isInitialized() {
+          return result.isInitialized();
+        }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response build() {
+          if (result != null && !isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return buildPartial();
+        }
+        
+        private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          if (!isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return buildPartial();
+        }
+        
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response buildPartial() {
+          if (result == null) {
+            throw new IllegalStateException(
+              "build() has already been called on this Builder.");
+          }
+          com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response returnMe = result;
+          result = null;
+          return returnMe;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response) {
+            return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response other) {
+          if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.getDefaultInstance()) return this;
+          if (other.hasRequestId()) {
+            setRequestId(other.getRequestId());
+          }
+          if (other.hasViewerResponse()) {
+            mergeViewerResponse(other.getViewerResponse());
+          }
+          if (other.hasDevModeResponse()) {
+            mergeDevModeResponse(other.getDevModeResponse());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  return this;
+                }
+                break;
+              }
+              case 8: {
+                setRequestId(input.readUInt32());
+                break;
+              }
+              case 18: {
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.newBuilder();
+                if (hasViewerResponse()) {
+                  subBuilder.mergeFrom(getViewerResponse());
+                }
+                input.readMessage(subBuilder, extensionRegistry);
+                setViewerResponse(subBuilder.buildPartial());
+                break;
+              }
+              case 26: {
+                com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.newBuilder();
+                if (hasDevModeResponse()) {
+                  subBuilder.mergeFrom(getDevModeResponse());
+                }
+                input.readMessage(subBuilder, extensionRegistry);
+                setDevModeResponse(subBuilder.buildPartial());
+                break;
+              }
+            }
+          }
+        }
+        
+        
+        // required uint32 requestId = 1;
+        public boolean hasRequestId() {
+          return result.hasRequestId();
+        }
+        public int getRequestId() {
+          return result.getRequestId();
+        }
+        public Builder setRequestId(int value) {
+          result.hasRequestId = true;
+          result.requestId_ = value;
+          return this;
+        }
+        public Builder clearRequestId() {
+          result.hasRequestId = false;
+          result.requestId_ = 0;
+          return this;
+        }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.ViewerResponse viewerResponse = 2;
+        public boolean hasViewerResponse() {
+          return result.hasViewerResponse();
+        }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse getViewerResponse() {
+          return result.getViewerResponse();
+        }
+        public Builder setViewerResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse value) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          result.hasViewerResponse = true;
+          result.viewerResponse_ = value;
+          return this;
+        }
+        public Builder setViewerResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.Builder builderForValue) {
+          result.hasViewerResponse = true;
+          result.viewerResponse_ = builderForValue.build();
+          return this;
+        }
+        public Builder mergeViewerResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse value) {
+          if (result.hasViewerResponse() &&
+              result.viewerResponse_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.getDefaultInstance()) {
+            result.viewerResponse_ =
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.newBuilder(result.viewerResponse_).mergeFrom(value).buildPartial();
+          } else {
+            result.viewerResponse_ = value;
+          }
+          result.hasViewerResponse = true;
+          return this;
+        }
+        public Builder clearViewerResponse() {
+          result.hasViewerResponse = false;
+          result.viewerResponse_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.getDefaultInstance();
+          return this;
+        }
+        
+        // optional .com.google.gwt.dev.shell.remoteui.Message.Response.DevModeResponse devModeResponse = 3;
+        public boolean hasDevModeResponse() {
+          return result.hasDevModeResponse();
+        }
+        public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse getDevModeResponse() {
+          return result.getDevModeResponse();
+        }
+        public Builder setDevModeResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse value) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          result.hasDevModeResponse = true;
+          result.devModeResponse_ = value;
+          return this;
+        }
+        public Builder setDevModeResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.Builder builderForValue) {
+          result.hasDevModeResponse = true;
+          result.devModeResponse_ = builderForValue.build();
+          return this;
+        }
+        public Builder mergeDevModeResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse value) {
+          if (result.hasDevModeResponse() &&
+              result.devModeResponse_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.getDefaultInstance()) {
+            result.devModeResponse_ =
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.newBuilder(result.devModeResponse_).mergeFrom(value).buildPartial();
+          } else {
+            result.devModeResponse_ = value;
+          }
+          result.hasDevModeResponse = true;
+          return this;
+        }
+        public Builder clearDevModeResponse() {
+          result.hasDevModeResponse = false;
+          result.devModeResponse_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.getDefaultInstance();
+          return this;
+        }
+      }
+      
+      static {
+        com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+      }
+      
+      static {
+        com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+      }
+    }
+    
+    // required .com.google.gwt.dev.shell.remoteui.Message.MessageType messageType = 1;
+    public static final int MESSAGETYPE_FIELD_NUMBER = 1;
+    private boolean hasMessageType;
+    private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType messageType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType.REQUEST;
+    public boolean hasMessageType() { return hasMessageType; }
+    public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType getMessageType() { return messageType_; }
+    
+    // optional .com.google.gwt.dev.shell.remoteui.Message.Request request = 2;
+    public static final int REQUEST_FIELD_NUMBER = 2;
+    private boolean hasRequest;
+    private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request request_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.getDefaultInstance();
+    public boolean hasRequest() { return hasRequest; }
+    public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request getRequest() { return request_; }
+    
+    // optional .com.google.gwt.dev.shell.remoteui.Message.Response response = 3;
+    public static final int RESPONSE_FIELD_NUMBER = 3;
+    private boolean hasResponse;
+    private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response response_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.getDefaultInstance();
+    public boolean hasResponse() { return hasResponse; }
+    public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response getResponse() { return response_; }
+    
+    public final boolean isInitialized() {
+      if (!hasMessageType) return false;
+      if (hasRequest()) {
+        if (!getRequest().isInitialized()) return false;
+      }
+      if (hasResponse()) {
+        if (!getResponse().isInitialized()) return false;
+      }
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (hasMessageType()) {
+        output.writeEnum(1, getMessageType().getNumber());
+      }
+      if (hasRequest()) {
+        output.writeMessage(2, getRequest());
+      }
+      if (hasResponse()) {
+        output.writeMessage(3, getResponse());
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (hasMessageType()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(1, getMessageType().getNumber());
+      }
+      if (hasRequest()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getRequest());
+      }
+      if (hasResponse()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, getResponse());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeDelimitedFrom(input).buildParsed();
+    }
+    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeDelimitedFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder> {
+      private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message result;
+      
+      // Construct using com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.newBuilder()
+      private Builder() {}
+      
+      private static Builder create() {
+        Builder builder = new Builder();
+        builder.result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message();
+        return builder;
+      }
+      
+      protected com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message internalGetResult() {
+        return result;
+      }
+      
+      public Builder clear() {
+        if (result == null) {
+          throw new IllegalStateException(
+            "Cannot call clear() after build().");
+        }
+        result = new com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message();
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(result);
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.getDescriptor();
+      }
+      
+      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message getDefaultInstanceForType() {
+        return com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.getDefaultInstance();
+      }
+      
+      public boolean isInitialized() {
+        return result.isInitialized();
+      }
+      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message build() {
+        if (result != null && !isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return buildPartial();
+      }
+      
+      private com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        if (!isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return buildPartial();
+      }
+      
+      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message buildPartial() {
+        if (result == null) {
+          throw new IllegalStateException(
+            "build() has already been called on this Builder.");
+        }
+        com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message) {
+          return mergeFrom((com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message other) {
+        if (other == com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.getDefaultInstance()) return this;
+        if (other.hasMessageType()) {
+          setMessageType(other.getMessageType());
+        }
+        if (other.hasRequest()) {
+          mergeRequest(other.getRequest());
+        }
+        if (other.hasResponse()) {
+          mergeResponse(other.getResponse());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              int rawValue = input.readEnum();
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType value = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType.valueOf(rawValue);
+              if (value == null) {
+                unknownFields.mergeVarintField(1, rawValue);
+              } else {
+                setMessageType(value);
+              }
+              break;
+            }
+            case 18: {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.newBuilder();
+              if (hasRequest()) {
+                subBuilder.mergeFrom(getRequest());
+              }
+              input.readMessage(subBuilder, extensionRegistry);
+              setRequest(subBuilder.buildPartial());
+              break;
+            }
+            case 26: {
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.Builder subBuilder = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.newBuilder();
+              if (hasResponse()) {
+                subBuilder.mergeFrom(getResponse());
+              }
+              input.readMessage(subBuilder, extensionRegistry);
+              setResponse(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // required .com.google.gwt.dev.shell.remoteui.Message.MessageType messageType = 1;
+      public boolean hasMessageType() {
+        return result.hasMessageType();
+      }
+      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType getMessageType() {
+        return result.getMessageType();
+      }
+      public Builder setMessageType(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        result.hasMessageType = true;
+        result.messageType_ = value;
+        return this;
+      }
+      public Builder clearMessageType() {
+        result.hasMessageType = false;
+        result.messageType_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.MessageType.REQUEST;
+        return this;
+      }
+      
+      // optional .com.google.gwt.dev.shell.remoteui.Message.Request request = 2;
+      public boolean hasRequest() {
+        return result.hasRequest();
+      }
+      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request getRequest() {
+        return result.getRequest();
+      }
+      public Builder setRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        result.hasRequest = true;
+        result.request_ = value;
+        return this;
+      }
+      public Builder setRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.Builder builderForValue) {
+        result.hasRequest = true;
+        result.request_ = builderForValue.build();
+        return this;
+      }
+      public Builder mergeRequest(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request value) {
+        if (result.hasRequest() &&
+            result.request_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.getDefaultInstance()) {
+          result.request_ =
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.newBuilder(result.request_).mergeFrom(value).buildPartial();
+        } else {
+          result.request_ = value;
+        }
+        result.hasRequest = true;
+        return this;
+      }
+      public Builder clearRequest() {
+        result.hasRequest = false;
+        result.request_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.getDefaultInstance();
+        return this;
+      }
+      
+      // optional .com.google.gwt.dev.shell.remoteui.Message.Response response = 3;
+      public boolean hasResponse() {
+        return result.hasResponse();
+      }
+      public com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response getResponse() {
+        return result.getResponse();
+      }
+      public Builder setResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        result.hasResponse = true;
+        result.response_ = value;
+        return this;
+      }
+      public Builder setResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.Builder builderForValue) {
+        result.hasResponse = true;
+        result.response_ = builderForValue.build();
+        return this;
+      }
+      public Builder mergeResponse(com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response value) {
+        if (result.hasResponse() &&
+            result.response_ != com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.getDefaultInstance()) {
+          result.response_ =
+            com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.newBuilder(result.response_).mergeFrom(value).buildPartial();
+        } else {
+          result.response_ = value;
+        }
+        result.hasResponse = true;
+        return this;
+      }
+      public Builder clearResponse() {
+        result.hasResponse = false;
+        result.response_ = com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.getDefaultInstance();
+        return this;
+      }
+    }
+    
+    static {
+      com.google.gwt.dev.shell.remoteui.RemoteMessageProto.getDescriptor();
+    }
+    
+    static {
+      com.google.gwt.dev.shell.remoteui.RemoteMessageProto.internalForceInit();
+    }
+  }
+  
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_CapabilityExchange_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_CapabilityExchange_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ModuleLog_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ModuleLog_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ServerLog_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ServerLog_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_MainLog_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_MainLog_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_HelpInfo_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_HelpInfo_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogBranch_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogBranch_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogEntry_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogEntry_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_DisconnectLog_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_DisconnectLog_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_CapabilityExchange_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_CapabilityExchange_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_RestartWebServer_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_RestartWebServer_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_Capability_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_Capability_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLog_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLog_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLogBranch_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLogBranch_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_Capability_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_Capability_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_RestartWebServer_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_RestartWebServer_fieldAccessorTable;
+  
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n5com/google/gwt/dev/shell/remoteui/remo" +
+      "temessage.proto\022!com.google.gwt.dev.shel" +
+      "l.remoteui\"\363$\n\007Message\022K\n\013messageType\030\001 " +
+      "\002(\01626.com.google.gwt.dev.shell.remoteui." +
+      "Message.MessageType\022C\n\007request\030\002 \001(\01322.c" +
+      "om.google.gwt.dev.shell.remoteui.Message" +
+      ".Request\022E\n\010response\030\003 \001(\01323.com.google." +
+      "gwt.dev.shell.remoteui.Message.Response\032" +
+      "\234\025\n\007Request\022S\n\013serviceType\030\001 \002(\0162>.com.g" +
+      "oogle.gwt.dev.shell.remoteui.Message.Req",
+      "uest.ServiceType\022\021\n\trequestId\030\002 \001(\r\022W\n\rv" +
+      "iewerRequest\030\003 \001(\0132@.com.google.gwt.dev." +
+      "shell.remoteui.Message.Request.ViewerReq" +
+      "uest\022Y\n\016devModeRequest\030\004 \001(\0132A.com.googl" +
+      "e.gwt.dev.shell.remoteui.Message.Request" +
+      ".DevModeRequest\032\212\017\n\rViewerRequest\022a\n\013req" +
+      "uestType\030\001 \002(\0162L.com.google.gwt.dev.shel" +
+      "l.remoteui.Message.Request.ViewerRequest" +
+      ".RequestType\022o\n\022capabilityExchange\030\002 \001(\013" +
+      "2S.com.google.gwt.dev.shell.remoteui.Mes",
+      "sage.Request.ViewerRequest.CapabilityExc" +
+      "hange\022W\n\006addLog\030\003 \001(\0132G.com.google.gwt.d" +
+      "ev.shell.remoteui.Message.Request.Viewer" +
+      "Request.AddLog\022c\n\014addLogBranch\030\004 \001(\0132M.c" +
+      "om.google.gwt.dev.shell.remoteui.Message" +
+      ".Request.ViewerRequest.AddLogBranch\022a\n\013a" +
+      "ddLogEntry\030\005 \001(\0132L.com.google.gwt.dev.sh" +
+      "ell.remoteui.Message.Request.ViewerReque" +
+      "st.AddLogEntry\022e\n\rdisconnectLog\030\006 \001(\0132N." +
+      "com.google.gwt.dev.shell.remoteui.Messag",
+      "e.Request.ViewerRequest.DisconnectLog\032\024\n" +
+      "\022CapabilityExchange\032\373\004\n\006AddLog\022]\n\004type\030\001" +
+      " \002(\0162O.com.google.gwt.dev.shell.remoteui" +
+      ".Message.Request.ViewerRequest.AddLog.Lo" +
+      "gType\022d\n\tmoduleLog\030\002 \001(\0132Q.com.google.gw" +
+      "t.dev.shell.remoteui.Message.Request.Vie" +
+      "werRequest.AddLog.ModuleLog\022d\n\tserverLog" +
+      "\030\003 \001(\0132Q.com.google.gwt.dev.shell.remote" +
+      "ui.Message.Request.ViewerRequest.AddLog." +
+      "ServerLog\022`\n\007mainLog\030\004 \001(\0132O.com.google.",
+      "gwt.dev.shell.remoteui.Message.Request.V" +
+      "iewerRequest.AddLog.MainLog\032\177\n\tModuleLog" +
+      "\022\014\n\004name\030\001 \002(\t\022\014\n\004icon\030\002 \001(\014\022\022\n\nsessionK" +
+      "ey\030\003 \001(\t\022\021\n\tuserAgent\030\004 \001(\t\022\013\n\003url\030\005 \001(\t" +
+      "\022\016\n\006tabKey\030\006 \001(\t\022\022\n\nremoteHost\030\007 \001(\t\032\'\n\t" +
+      "ServerLog\022\014\n\004name\030\001 \002(\t\022\014\n\004icon\030\002 \001(\014\032\t\n" +
+      "\007MainLog\"/\n\007LogType\022\010\n\004MAIN\020\000\022\n\n\006MODULE\020" +
+      "\001\022\016\n\nWEB_SERVER\020\002\032\306\001\n\007LogData\022\017\n\007summary" +
+      "\030\001 \002(\t\022\r\n\005level\030\002 \001(\t\022\017\n\007details\030\003 \001(\t\022c" +
+      "\n\010helpInfo\030\004 \001(\0132Q.com.google.gwt.dev.sh",
+      "ell.remoteui.Message.Request.ViewerReque" +
+      "st.LogData.HelpInfo\032%\n\010HelpInfo\022\013\n\003url\030\001" +
+      " \001(\t\022\014\n\004text\030\002 \001(\t\032\231\001\n\014AddLogBranch\022\027\n\017p" +
+      "arentLogHandle\030\001 \002(\r\022\025\n\rindexInParent\030\002 " +
+      "\002(\r\022Y\n\007logData\030\003 \002(\0132H.com.google.gwt.de" +
+      "v.shell.remoteui.Message.Request.ViewerR" +
+      "equest.LogData\032\217\001\n\013AddLogEntry\022\021\n\tlogHan" +
+      "dle\030\001 \002(\r\022\022\n\nindexInLog\030\002 \002(\r\022Y\n\007logData" +
+      "\030\003 \002(\0132H.com.google.gwt.dev.shell.remote" +
+      "ui.Message.Request.ViewerRequest.LogData",
+      "\032\"\n\rDisconnectLog\022\021\n\tlogHandle\030\001 \002(\r\"n\n\013" +
+      "RequestType\022\027\n\023CAPABILITY_EXCHANGE\020\000\022\013\n\007" +
+      "ADD_LOG\020\001\022\022\n\016ADD_LOG_BRANCH\020\002\022\021\n\rADD_LOG" +
+      "_ENTRY\020\003\022\022\n\016DISCONNECT_LOG\020\004\032\276\003\n\016DevMode" +
+      "Request\022b\n\013requestType\030\001 \002(\0162M.com.googl" +
+      "e.gwt.dev.shell.remoteui.Message.Request" +
+      ".DevModeRequest.RequestType\022p\n\022capabilit" +
+      "yExchange\030\002 \001(\0132T.com.google.gwt.dev.she" +
+      "ll.remoteui.Message.Request.DevModeReque" +
+      "st.CapabilityExchange\022l\n\020restartWebServe",
+      "r\030\003 \001(\0132R.com.google.gwt.dev.shell.remot" +
+      "eui.Message.Request.DevModeRequest.Resta" +
+      "rtWebServer\032\024\n\022CapabilityExchange\032\022\n\020Res" +
+      "tartWebServer\">\n\013RequestType\022\027\n\023CAPABILI" +
+      "TY_EXCHANGE\020\000\022\026\n\022RESTART_WEB_SERVER\020\001\"\'\n" +
+      "\013ServiceType\022\n\n\006VIEWER\020\000\022\014\n\010DEV_MODE\020\001\032\305" +
+      "\r\n\010Response\022\021\n\trequestId\030\001 \002(\r\022Z\n\016viewer" +
+      "Response\030\002 \001(\0132B.com.google.gwt.dev.shel" +
+      "l.remoteui.Message.Response.ViewerRespon" +
+      "se\022\\\n\017devModeResponse\030\003 \001(\0132C.com.google",
+      ".gwt.dev.shell.remoteui.Message.Response" +
+      ".DevModeResponse\032\265\006\n\016ViewerResponse\022e\n\014r" +
+      "esponseType\030\001 \002(\0162O.com.google.gwt.dev.s" +
+      "hell.remoteui.Message.Response.ViewerRes" +
+      "ponse.ResponseType\022q\n\022capabilityExchange" +
+      "\030\002 \001(\0132U.com.google.gwt.dev.shell.remote" +
+      "ui.Message.Response.ViewerResponse.Capab" +
+      "ilityExchange\022Y\n\006addLog\030\003 \001(\0132I.com.goog" +
+      "le.gwt.dev.shell.remoteui.Message.Respon" +
+      "se.ViewerResponse.AddLog\022e\n\014addLogBranch",
+      "\030\004 \001(\0132O.com.google.gwt.dev.shell.remote" +
+      "ui.Message.Response.ViewerResponse.AddLo" +
+      "gBranch\032\374\001\n\022CapabilityExchange\022v\n\014capabi" +
+      "lities\030\002 \003(\0132`.com.google.gwt.dev.shell." +
+      "remoteui.Message.Response.ViewerResponse" +
+      ".CapabilityExchange.Capability\032n\n\nCapabi" +
+      "lity\022`\n\ncapability\030\001 \002(\0162L.com.google.gw" +
+      "t.dev.shell.remoteui.Message.Request.Vie" +
+      "werRequest.RequestType\032\033\n\006AddLog\022\021\n\tlogH" +
+      "andle\030\001 \002(\r\032!\n\014AddLogBranch\022\021\n\tlogHandle",
+      "\030\001 \002(\r\"H\n\014ResponseType\022\027\n\023CAPABILITY_EXC" +
+      "HANGE\020\000\022\013\n\007ADD_LOG\020\001\022\022\n\016ADD_LOG_BRANCH\020\002" +
+      "\032\263\005\n\017DevModeResponse\022f\n\014responseType\030\001 \002" +
+      "(\0162P.com.google.gwt.dev.shell.remoteui.M" +
+      "essage.Response.DevModeResponse.Response" +
+      "Type\022r\n\022capabilityExchange\030\002 \001(\0132V.com.g" +
+      "oogle.gwt.dev.shell.remoteui.Message.Res" +
+      "ponse.DevModeResponse.CapabilityExchange" +
+      "\022n\n\020restartWebServer\030\003 \001(\0132T.com.google." +
+      "gwt.dev.shell.remoteui.Message.Response.",
+      "DevModeResponse.RestartWebServer\032\376\001\n\022Cap" +
+      "abilityExchange\022w\n\014capabilities\030\002 \003(\0132a." +
+      "com.google.gwt.dev.shell.remoteui.Messag" +
+      "e.Response.DevModeResponse.CapabilityExc" +
+      "hange.Capability\032o\n\nCapability\022a\n\ncapabi" +
+      "lity\030\001 \002(\0162M.com.google.gwt.dev.shell.re" +
+      "moteui.Message.Request.DevModeRequest.Re" +
+      "questType\032\022\n\020RestartWebServer\"?\n\014Respons" +
+      "eType\022\027\n\023CAPABILITY_EXCHANGE\020\000\022\026\n\022RESTAR" +
+      "T_WEB_SERVER\020\001\"(\n\013MessageType\022\013\n\007REQUEST",
+      "\020\000\022\014\n\010RESPONSE\020\001B\024B\022RemoteMessageProto"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_descriptor,
+              new java.lang.String[] { "MessageType", "Request", "Response", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_descriptor.getNestedTypes().get(0);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_descriptor,
+              new java.lang.String[] { "ServiceType", "RequestId", "ViewerRequest", "DevModeRequest", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_descriptor.getNestedTypes().get(0);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor,
+              new java.lang.String[] { "RequestType", "CapabilityExchange", "AddLog", "AddLogBranch", "AddLogEntry", "DisconnectLog", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_CapabilityExchange_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor.getNestedTypes().get(0);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_CapabilityExchange_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_CapabilityExchange_descriptor,
+              new java.lang.String[] { },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.CapabilityExchange.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor.getNestedTypes().get(1);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_descriptor,
+              new java.lang.String[] { "Type", "ModuleLog", "ServerLog", "MainLog", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ModuleLog_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_descriptor.getNestedTypes().get(0);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ModuleLog_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ModuleLog_descriptor,
+              new java.lang.String[] { "Name", "Icon", "SessionKey", "UserAgent", "Url", "TabKey", "RemoteHost", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ModuleLog.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ServerLog_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_descriptor.getNestedTypes().get(1);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ServerLog_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_ServerLog_descriptor,
+              new java.lang.String[] { "Name", "Icon", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.ServerLog.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_MainLog_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_descriptor.getNestedTypes().get(2);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_MainLog_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLog_MainLog_descriptor,
+              new java.lang.String[] { },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLog.MainLog.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor.getNestedTypes().get(2);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_descriptor,
+              new java.lang.String[] { "Summary", "Level", "Details", "HelpInfo", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_HelpInfo_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_descriptor.getNestedTypes().get(0);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_HelpInfo_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_LogData_HelpInfo_descriptor,
+              new java.lang.String[] { "Url", "Text", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData.HelpInfo.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogBranch_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor.getNestedTypes().get(3);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogBranch_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogBranch_descriptor,
+              new java.lang.String[] { "ParentLogHandle", "IndexInParent", "LogData", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogBranch.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogEntry_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor.getNestedTypes().get(4);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogEntry_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_AddLogEntry_descriptor,
+              new java.lang.String[] { "LogHandle", "IndexInLog", "LogData", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.AddLogEntry.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_DisconnectLog_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_descriptor.getNestedTypes().get(5);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_DisconnectLog_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_ViewerRequest_DisconnectLog_descriptor,
+              new java.lang.String[] { "LogHandle", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.DisconnectLog.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_descriptor.getNestedTypes().get(1);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_descriptor,
+              new java.lang.String[] { "RequestType", "CapabilityExchange", "RestartWebServer", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_CapabilityExchange_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_descriptor.getNestedTypes().get(0);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_CapabilityExchange_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_CapabilityExchange_descriptor,
+              new java.lang.String[] { },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.CapabilityExchange.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_RestartWebServer_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_descriptor.getNestedTypes().get(1);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_RestartWebServer_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Request_DevModeRequest_RestartWebServer_descriptor,
+              new java.lang.String[] { },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RestartWebServer.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_descriptor.getNestedTypes().get(1);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_descriptor,
+              new java.lang.String[] { "RequestId", "ViewerResponse", "DevModeResponse", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_descriptor.getNestedTypes().get(0);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_descriptor,
+              new java.lang.String[] { "ResponseType", "CapabilityExchange", "AddLog", "AddLogBranch", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_descriptor.getNestedTypes().get(0);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_descriptor,
+              new java.lang.String[] { "Capabilities", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_Capability_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_descriptor.getNestedTypes().get(0);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_Capability_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_CapabilityExchange_Capability_descriptor,
+              new java.lang.String[] { "Capability", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLog_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_descriptor.getNestedTypes().get(1);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLog_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLog_descriptor,
+              new java.lang.String[] { "LogHandle", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLog.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLogBranch_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_descriptor.getNestedTypes().get(2);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLogBranch_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_ViewerResponse_AddLogBranch_descriptor,
+              new java.lang.String[] { "LogHandle", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.AddLogBranch.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_descriptor.getNestedTypes().get(1);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_descriptor,
+              new java.lang.String[] { "ResponseType", "CapabilityExchange", "RestartWebServer", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_descriptor.getNestedTypes().get(0);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_descriptor,
+              new java.lang.String[] { "Capabilities", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_Capability_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_descriptor.getNestedTypes().get(0);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_Capability_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_CapabilityExchange_Capability_descriptor,
+              new java.lang.String[] { "Capability", },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange.Capability.Builder.class);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_RestartWebServer_descriptor =
+            internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_descriptor.getNestedTypes().get(1);
+          internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_RestartWebServer_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_com_google_gwt_dev_shell_remoteui_Message_Response_DevModeResponse_RestartWebServer_descriptor,
+              new java.lang.String[] { },
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.class,
+              com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.RestartWebServer.Builder.class);
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+  
+  public static void internalForceInit() {}
+}
diff --git a/dev/core/src/com/google/gwt/dev/shell/remoteui/RemoteUI.java b/dev/core/src/com/google/gwt/dev/shell/remoteui/RemoteUI.java
new file mode 100644
index 0000000..0192843
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/remoteui/RemoteUI.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2009 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.dev.shell.remoteui;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.TreeLogger.Type;
+import com.google.gwt.dev.ui.DevModeUI;
+import com.google.gwt.dev.ui.RestartServerCallback;
+import com.google.gwt.dev.ui.RestartServerEvent;
+
+import java.io.IOException;
+import java.net.Socket;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * TODO: Implement me.
+ */
+public class RemoteUI extends DevModeUI {
+
+  private final List<ModuleHandle> modules = new ArrayList<ModuleHandle>();
+  private final Object modulesLock = new Object();
+
+  private final DevModeServiceRequestProcessor devModeRequestProcessor;
+  private final MessageTransport transport;
+  private ViewerServiceTreeLogger webServerLogger = null;
+  private ViewerServiceTreeLogger mainLogger = null;
+  private ViewerServiceClient viewerServiceClient = null;
+
+  public RemoteUI(String host, int port) {
+    try {
+      Socket socket = new Socket(host, port);
+      devModeRequestProcessor = new DevModeServiceRequestProcessor(this);
+      transport = new MessageTransport(socket.getInputStream(),
+          socket.getOutputStream(), devModeRequestProcessor);
+    } catch (UnknownHostException e) {
+      throw new RuntimeException(e);
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  @Override
+  public TreeLogger getTopLogger() {
+    if (mainLogger != null) {
+      return mainLogger;
+    }
+
+    mainLogger = new ViewerServiceTreeLogger(viewerServiceClient);
+    int topLoggerHandle = viewerServiceClient.addMainLog();
+    mainLogger.setLogHandle(topLoggerHandle);
+    mainLogger.setMaxDetail(getLogLevel());
+    return mainLogger;
+  }
+
+  @Override
+  public TreeLogger getWebServerLogger(String serverName, byte[] serverIcon) {
+    if (webServerLogger != null) {
+      return webServerLogger;
+    }
+
+    webServerLogger = new ViewerServiceTreeLogger(viewerServiceClient);
+    int webServerLoggerHandle = viewerServiceClient.addServerLog(serverName,
+        serverIcon);
+    webServerLogger.setLogHandle(webServerLoggerHandle);
+    webServerLogger.setMaxDetail(getLogLevel());
+    return webServerLogger;
+  }
+
+  @Override
+  public void initialize(Type logLevel) {
+    super.initialize(logLevel);
+    viewerServiceClient = new ViewerServiceClient(transport);
+    viewerServiceClient.checkCapabilities();
+  }
+
+  @Override
+  public ModuleHandle loadModule(String userAgent, String remoteSocket,
+      String url, String tabKey, String moduleName, String sessionKey,
+      String agentTag, byte[] agentIcon, Type logLevel) {
+
+    int logHandle;
+    logHandle = viewerServiceClient.addModuleLog(remoteSocket, url, tabKey,
+        moduleName, sessionKey, agentTag, agentIcon);
+    final ViewerServiceTreeLogger moduleLogger = new ViewerServiceTreeLogger(
+        viewerServiceClient);
+    moduleLogger.setLogHandle(logHandle);
+    moduleLogger.setMaxDetail(getLogLevel());
+    ModuleHandle handle = new ModuleHandle() {
+      public TreeLogger getLogger() {
+        return moduleLogger;
+      }
+    };
+    synchronized (modulesLock) {
+      modules.add(handle);
+    }
+    // Copied from SwingUI.loadModule
+    TreeLogger branch = moduleLogger.branch(TreeLogger.INFO, "Loading module "
+        + moduleName);
+    if (url != null) {
+      branch.log(TreeLogger.INFO, "Top URL: " + url);
+    }
+
+    branch.log(TreeLogger.INFO, "User agent: " + userAgent);
+    branch.log(TreeLogger.TRACE, "Remote socket: " + remoteSocket);
+    if (tabKey != null) {
+      branch.log(TreeLogger.DEBUG, "Tab key: " + tabKey);
+    }
+    if (sessionKey != null) {
+      branch.log(TreeLogger.DEBUG, "Session key: " + sessionKey);
+    }
+
+    return handle;
+  }
+
+  public void restartWebServer() {
+    if (supportsRestartWebServer() && webServerLogger != null) {
+      ((RestartServerCallback) getCallback(RestartServerEvent.getType())).onRestartServer(webServerLogger);
+    }
+  }
+
+  public boolean supportsRestartWebServer() {
+    return hasCallback(RestartServerEvent.getType());
+  }
+
+  @Override
+  public void unloadModule(ModuleHandle module) {
+    synchronized (modulesLock) {
+      if (!modules.contains(module)) {
+        return;
+      }
+    }
+
+    ViewerServiceTreeLogger moduleLogger = (ViewerServiceTreeLogger) (module.getLogger());
+
+    try {
+      viewerServiceClient.disconnectLog(moduleLogger.getLogHandle());
+    } finally {
+      synchronized (modulesLock) {
+        modules.remove(module);
+      }
+    }
+  }
+}
diff --git a/dev/core/src/com/google/gwt/dev/shell/remoteui/RequestProcessor.java b/dev/core/src/com/google/gwt/dev/shell/remoteui/RequestProcessor.java
new file mode 100644
index 0000000..3f5c750
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/remoteui/RequestProcessor.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2009 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.dev.shell.remoteui;
+
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response;
+
+/**
+ * Handles in-bound client requests.
+ */
+public interface RequestProcessor {
+
+  /**
+   * Execute the given client request.
+   * 
+   * @param request The request to execute.
+   * 
+   * @return the response resulting from executing the request
+   * 
+   * @throws Exception if a problem occurred while executing the request
+   */
+  Response execute(Request request) throws Exception;
+}
\ No newline at end of file
diff --git a/dev/core/src/com/google/gwt/dev/shell/remoteui/ViewerServiceClient.java b/dev/core/src/com/google/gwt/dev/shell/remoteui/ViewerServiceClient.java
new file mode 100644
index 0000000..136d166
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/remoteui/ViewerServiceClient.java
@@ -0,0 +1,333 @@
+/*
+ * Copyright 2009 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.dev.shell.remoteui;
+
+import com.google.gwt.core.ext.TreeLogger.HelpInfo;
+import com.google.gwt.core.ext.TreeLogger.Type;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.LogData;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.ViewerRequest.RequestType;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.ViewerResponse.CapabilityExchange.Capability;
+import com.google.gwt.dev.util.log.AbstractTreeLogger;
+import com.google.protobuf.ByteString;
+
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+/**
+ * Used for making requests to a remote ViewerService server.
+ * 
+ * TODO: If this becomes part of the public API, we'll need to provide a level
+ * of indirection in front of the protobuf classes; We're going to be rebasing
+ * the protobuf library, and we don't want to expose the rebased API as public.
+ */
+public class ViewerServiceClient {
+
+  private final MessageTransport transport;
+
+  /**
+   * Create a new instance.
+   * 
+   * @param processor A MessageProcessor that is used to communicate with the
+   *          ViewerService server.
+   */
+  public ViewerServiceClient(MessageTransport processor) {
+    this.transport = processor;
+  }
+
+  /**
+   * Add an entry that also serves as a log branch.
+   * 
+   * @param type The severity of the log message.
+   * @param msg The message.
+   * @param caught An exception associated with the message
+   * @param helpInfo A URL or message which directs the user to helpful
+   *          information related to the log message
+   * @param parentLogHandle The log handle of the parent of this log
+   *          entry/branch
+   * @param indexInParent The index of this entry/branch within the parent
+   *          logger
+   * @return the log handle of the newly-created branch logger
+   */
+  public int addLogBranch(Type type, String msg, Throwable caught,
+      HelpInfo helpInfo, int parentLogHandle, int indexInParent) {
+
+    LogData.Builder logDataBuilder = generateLogData(type, msg, caught,
+        helpInfo);
+
+    ViewerRequest.AddLogBranch.Builder addlogBranchBuilder = ViewerRequest.AddLogBranch.newBuilder();
+    addlogBranchBuilder.setParentLogHandle(parentLogHandle);
+    addlogBranchBuilder.setIndexInParent(indexInParent);
+    addlogBranchBuilder.setLogData(logDataBuilder);
+
+    ViewerRequest.Builder viewerRequestBuilder = ViewerRequest.newBuilder();
+    viewerRequestBuilder.setRequestType(ViewerRequest.RequestType.ADD_LOG_BRANCH);
+    viewerRequestBuilder.setAddLogBranch(addlogBranchBuilder);
+
+    Request requestMessage = buildRequestMessageFromViewerRequest(
+        viewerRequestBuilder).build();
+
+    Future<Response> responseFuture = transport.executeRequestAsync(requestMessage);
+
+    return waitForResponse(responseFuture).getViewerResponse().getAddLogBranch().getLogHandle();
+  }
+
+  /**
+   * Add a log entry.
+   * 
+   * @param type The severity of the log message.
+   * @param msg The message.
+   * @param caught An exception associated with the message
+   * @param helpInfo A URL or message which directs the user to helpful
+   *          information related to the log message
+   * @param logHandle The log handle of the parent of this log entry/branch
+   * @param indexOfLogentryWithinParentLogger The index of this entry within the
+   *          parent logger
+   */
+  public void addLogEntry(int indexOfLogEntryWithinParentLogger, Type type,
+      String msg, Throwable caught, HelpInfo helpInfo, int logHandle) {
+    LogData.Builder logDataBuilder = generateLogData(type, msg, caught,
+        helpInfo);
+
+    ViewerRequest.AddLogEntry.Builder addLogEntryBuilder = ViewerRequest.AddLogEntry.newBuilder();
+    addLogEntryBuilder.setLogHandle(logHandle);
+    addLogEntryBuilder.setIndexInLog(indexOfLogEntryWithinParentLogger);
+    addLogEntryBuilder.setLogData(logDataBuilder);
+
+    ViewerRequest.Builder viewerRequestBuilder = ViewerRequest.newBuilder();
+    viewerRequestBuilder.setRequestType(ViewerRequest.RequestType.ADD_LOG_ENTRY);
+    viewerRequestBuilder.setAddLogEntry(addLogEntryBuilder);
+
+    Request requestMessage = buildRequestMessageFromViewerRequest(
+        viewerRequestBuilder).build();
+
+    Future<Response> responseFuture = transport.executeRequestAsync(requestMessage);
+    waitForResponse(responseFuture);
+  }
+
+  /**
+   * Add a new MAIN logger. Typically, this method should only be called once
+   * (as there is only one MAIN logger).
+   * 
+   * @return the log handle for the newly-created MAIN logger
+   */
+  public int addMainLog() {
+    ViewerRequest.AddLog.MainLog.Builder mainLogBuilder = ViewerRequest.AddLog.MainLog.newBuilder();
+
+    ViewerRequest.AddLog.Builder addLogBuilder = ViewerRequest.AddLog.newBuilder();
+    addLogBuilder.setType(ViewerRequest.AddLog.LogType.MAIN);
+    addLogBuilder.setMainLog(mainLogBuilder);
+
+    return createLogger(addLogBuilder);
+  }
+
+  /**
+   * Add a new Module logger. This method should not be called multiple times
+   * with the exact same arguments (as there should only be one logger
+   * associated with that set of arguments).
+   * 
+   * @param remoteSocket name of remote socket endpoint in host:port format
+   * @param url URL of top-level window
+   * @param tabKey stable browser tab identifier, or the empty string if no such
+   *          identifier is available
+   * @param moduleName the name of the module loaded
+   * @param sessionKey a unique session key
+   * @param agentTag short-form user agent identifier, suitable for use in a
+   *          label for this connection
+   * @param agentIcon icon to use for the user agent (fits inside 24x24) or null
+   *          if unavailable
+   * @return the log handle for the newly-created Module logger
+   */
+  public int addModuleLog(String remoteSocket, String url, String tabKey,
+      String moduleName, String sessionKey, String agentTag, byte[] agentIcon) {
+    ViewerRequest.AddLog.ModuleLog.Builder moduleLogBuilder = ViewerRequest.AddLog.ModuleLog.newBuilder();
+    moduleLogBuilder.setName(moduleName);
+    moduleLogBuilder.setUserAgent(agentTag);
+
+    if (url != null) {
+      moduleLogBuilder.setUrl(url);
+    }
+
+    moduleLogBuilder.setRemoteHost(remoteSocket);
+    moduleLogBuilder.setSessionKey(sessionKey);
+
+    if (tabKey != null) {
+      moduleLogBuilder.setTabKey(tabKey);
+    }
+
+    if (agentIcon != null) {
+      moduleLogBuilder = moduleLogBuilder.setIcon(ByteString.copyFrom(agentIcon));
+    }
+
+    ViewerRequest.AddLog.Builder addLogBuilder = ViewerRequest.AddLog.newBuilder();
+    addLogBuilder.setType(ViewerRequest.AddLog.LogType.MODULE);
+    addLogBuilder.setModuleLog(moduleLogBuilder);
+
+    return createLogger(addLogBuilder);
+  }
+
+  /**
+   * Add a new Web Server logger. Typically, this method should only be called
+   * once, as there is only one Web Server tunning at a time.
+   * 
+   * @param serverName short name of the web server or null if only the icon
+   *          should be used
+   * @param serverIcon byte array containing an icon (fitting into 24x24) to use
+   *          for the server, or null if only the name should be used
+   * @return the log handle for the newly-created Module logger
+   */
+  public int addServerLog(String serverName, byte[] serverIcon) {
+    ViewerRequest.AddLog.ServerLog.Builder serverLogBuilder = ViewerRequest.AddLog.ServerLog.newBuilder();
+    serverLogBuilder.setName(serverName);
+
+    if (serverIcon != null) {
+      serverLogBuilder = serverLogBuilder.setIcon(ByteString.copyFrom(serverIcon));
+    }
+
+    ViewerRequest.AddLog.Builder addLogBuilder = ViewerRequest.AddLog.newBuilder();
+    addLogBuilder.setType(ViewerRequest.AddLog.LogType.WEB_SERVER);
+    addLogBuilder.setServerLog(serverLogBuilder);
+
+    return createLogger(addLogBuilder);
+  }
+
+  /**
+   * Check the capabilities of the ViewerService. Ensures that the ViewerService
+   * supports: adding a log, adding a log branch, adding a log entry, and
+   * disconnecting a log.
+   * 
+   * TODO: Should we be checking the specific capability of the the
+   * ViewerService to support logs of type MAIN, SERVER, and MODULE? Right now,
+   * we assume that if they can support the addition of logs, they can handle
+   * the addition of any types of logs that we throw at them.
+   */
+  public void checkCapabilities() {
+    ViewerRequest.CapabilityExchange.Builder capabilityExchangeBuilder = ViewerRequest.CapabilityExchange.newBuilder();
+    ViewerRequest.Builder viewerRequestBuilder = ViewerRequest.newBuilder();
+    viewerRequestBuilder.setRequestType(ViewerRequest.RequestType.CAPABILITY_EXCHANGE);
+    viewerRequestBuilder.setCapabilityExchange(capabilityExchangeBuilder);
+
+    Request.Builder request = buildRequestMessageFromViewerRequest(viewerRequestBuilder);
+
+    Future<Response> responseFuture = transport.executeRequestAsync(request.build());
+    Response response = waitForResponse(responseFuture);
+
+    ViewerResponse.CapabilityExchange capabilityExchangeResponse = response.getViewerResponse().getCapabilityExchange();
+    List<Capability> capabilityList = capabilityExchangeResponse.getCapabilitiesList();
+
+    // Check for the add log ability
+    checkCapability(capabilityList, RequestType.ADD_LOG);
+
+    // Check for the add log branch ability
+    checkCapability(capabilityList, RequestType.ADD_LOG_BRANCH);
+
+    // Check for the add log branch ability
+    checkCapability(capabilityList, RequestType.ADD_LOG_BRANCH);
+
+    // Check for the disconnect log capability
+    checkCapability(capabilityList, RequestType.DISCONNECT_LOG);
+  }
+
+  /**
+   * Disconnect the log. Indicate to the log that the process which was logging
+   * messages to it is now dead, and no more messages will be logged to it.
+   * 
+   * Note that the log handle should refer to a top-level log, not a branch log.
+   * 
+   * @param logHandle the handle of the top-level log to disconnect
+   */
+  public void disconnectLog(int logHandle) {
+    ViewerRequest.DisconnectLog.Builder disconnectLogbuilder = ViewerRequest.DisconnectLog.newBuilder();
+    disconnectLogbuilder.setLogHandle(logHandle);
+
+    ViewerRequest.Builder viewerRequestBuilder = ViewerRequest.newBuilder();
+    viewerRequestBuilder.setRequestType(RequestType.DISCONNECT_LOG);
+    viewerRequestBuilder.setDisconnectLog(disconnectLogbuilder);
+
+    Request.Builder request = buildRequestMessageFromViewerRequest(viewerRequestBuilder);
+    Future<Response> responseFuture = transport.executeRequestAsync(request.build());
+    waitForResponse(responseFuture);
+  }
+
+  private Request.Builder buildRequestMessageFromViewerRequest(
+      ViewerRequest.Builder viewerRequestBuilder) {
+    return Request.newBuilder().setServiceType(Request.ServiceType.VIEWER).setViewerRequest(
+        viewerRequestBuilder);
+  }
+
+  private void checkCapability(List<Capability> viewerCapabilityList,
+      RequestType capabilityWeNeed) {
+    for (Capability c : viewerCapabilityList) {
+      if (c.getCapability() == capabilityWeNeed) {
+        return;
+      }
+    }
+    throw new RuntimeException("ViewerService does not support "
+        + capabilityWeNeed.toString());
+  }
+
+  private int createLogger(ViewerRequest.AddLog.Builder addLogBuilder) {
+    ViewerRequest.Builder viewerRequestBuilder = ViewerRequest.newBuilder();
+    viewerRequestBuilder.setRequestType(ViewerRequest.RequestType.ADD_LOG);
+    viewerRequestBuilder.setAddLog(addLogBuilder);
+
+    Request.Builder request = buildRequestMessageFromViewerRequest(viewerRequestBuilder);
+
+    Future<Response> responseFuture = transport.executeRequestAsync(request.build());
+    return waitForResponse(responseFuture).getViewerResponse().getAddLog().getLogHandle();
+  }
+
+  private LogData.Builder generateLogData(Type type, String msg,
+      Throwable caught, HelpInfo helpInfo) {
+    LogData.Builder logBuilder = LogData.newBuilder().setSummary(msg);
+
+    logBuilder = logBuilder.setLevel(type.getLabel());
+
+    if (caught != null) {
+      logBuilder = logBuilder.setDetails(AbstractTreeLogger.getStackTraceAsString(caught));
+    }
+
+    if (helpInfo != null) {
+      LogData.HelpInfo.Builder helpInfoBuilder = LogData.HelpInfo.newBuilder();
+
+      if (helpInfo.getURL() != null) {
+        helpInfoBuilder = helpInfoBuilder.setUrl(helpInfo.getURL().toExternalForm());
+      }
+
+      if (helpInfo.getAnchorText() != null) {
+        helpInfoBuilder.setText(helpInfo.getAnchorText());
+      }
+
+      logBuilder = logBuilder.setHelpInfo(helpInfoBuilder);
+    }
+
+    return logBuilder;
+  }
+
+  private Response waitForResponse(Future<Response> future) {
+    try {
+      return future.get();
+    } catch (ExecutionException e) {
+      throw new RuntimeException(e);
+    } catch (InterruptedException e) {
+      throw new RuntimeException(e);
+    }
+  }
+}
diff --git a/dev/core/src/com/google/gwt/dev/shell/remoteui/ViewerServiceTreeLogger.java b/dev/core/src/com/google/gwt/dev/shell/remoteui/ViewerServiceTreeLogger.java
new file mode 100644
index 0000000..734d41a
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/remoteui/ViewerServiceTreeLogger.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2009 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.dev.shell.remoteui;
+
+import com.google.gwt.dev.util.log.AbstractTreeLogger;
+
+/**
+ * A tree logger that creates log entries using a ViewerService.
+ */
+public final class ViewerServiceTreeLogger extends AbstractTreeLogger {
+
+  private int logHandle = -1;
+  private final ViewerServiceClient viewerServiceClient;
+
+  /**
+   * Creates a new instance with the given Viewer Service requestor.
+   * 
+   * @param viewerServiceClient An object that can be used to make requests to a
+   *          viewer service server.
+   */
+  public ViewerServiceTreeLogger(ViewerServiceClient viewerServiceClient) {
+    this.viewerServiceClient = viewerServiceClient;
+  }
+
+  /**
+   * Creates a new logger for a branch. Note that the logger's handle has not
+   * been set as yet; it will only be set once the branch is committed.
+   */
+  @Override
+  public AbstractTreeLogger doBranch() {
+    ViewerServiceTreeLogger childLogger = new ViewerServiceTreeLogger(
+        viewerServiceClient);
+    return childLogger;
+  }
+
+  /**
+   * Commits the branch, and sets the log handle of the branch logger.
+   */
+  @Override
+  public void doCommitBranch(AbstractTreeLogger childBeingCommitted, Type type,
+      String msg, Throwable caught, HelpInfo helpInfo) {
+    int branchLogHandle = viewerServiceClient.addLogBranch(type, msg, caught,
+        helpInfo, getLogHandle(), childBeingCommitted.getBranchedIndex());
+    ((ViewerServiceTreeLogger) childBeingCommitted).setLogHandle(branchLogHandle);
+  }
+
+  @Override
+  public void doLog(int indexOfLogEntryWithinParentLogger, Type type,
+      String msg, Throwable caught, HelpInfo helpInfo) {
+    viewerServiceClient.addLogEntry(indexOfLogEntryWithinParentLogger, type,
+        msg, caught, helpInfo, getLogHandle());
+  }
+
+  /**
+   * Get the handle of this logger. The handle is generated by the viewer
+   * service when this logger is first created. If this logger was created as a
+   * branch of another logger, then the handle will not be available until the
+   * branch has been committed.
+   * 
+   * @return the handle for this logger, or -1 if it has not been set
+   */
+  public int getLogHandle() {
+    return logHandle;
+  }
+
+  public void setLogHandle(int logHandle) {
+    this.logHandle = logHandle;
+  }
+}
diff --git a/dev/core/src/com/google/gwt/dev/shell/remoteui/remotemessage.proto b/dev/core/src/com/google/gwt/dev/shell/remoteui/remotemessage.proto
new file mode 100644
index 0000000..cb880c7
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/remoteui/remotemessage.proto
@@ -0,0 +1,246 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.dev.shell.remoteui;
+
+option java_outer_classname = "RemoteMessageProto";
+
+// Outer envelope for all messages
+message Message {
+  
+  // Two types of messages - either a request, or a response
+  enum MessageType {
+    REQUEST = 0;
+    RESPONSE = 1;
+  }
+    
+  // A request message. This is the root type for all request messages
+  message Request {
+  
+    // Every request must be addressed to a service. The two types of 
+    // services are the ViewerService, and the DevModeService. The ViewerService
+    // accepts commands for a Viewer. The DevModeService accepts requests for
+    // the Development Mode Server.
+    enum ServiceType {
+      VIEWER = 0;
+      DEV_MODE = 1;
+    }
+          
+    // The root type for all requests for the ViewerService
+    message ViewerRequest {
+    
+      // The different types of requests for a ViewerService
+      enum RequestType {
+        CAPABILITY_EXCHANGE = 0;
+        ADD_LOG = 1;
+        ADD_LOG_BRANCH = 2;
+        ADD_LOG_ENTRY = 3;
+        DISCONNECT_LOG = 4;        
+      }
+      
+      // Request the capabilities of the ViewerService. No additional
+      // information is needed at this time.
+      message CapabilityExchange {
+      }
+      
+      // Add a log message to the view
+      message AddLog {
+
+        // The type of log - either a web server log, a module log, or 
+        // the main log      
+        enum LogType {    
+          MAIN = 0;
+          MODULE = 1;
+          WEB_SERVER = 2;
+        }
+    
+        // Information needed for creating a Module Log
+        message ModuleLog {
+          required string name = 1;   
+          optional bytes icon = 2;
+          optional string sessionKey = 3;
+          optional string userAgent = 4;
+          optional string url = 5;
+          optional string tabKey = 6;
+          optional string remoteHost = 7;                
+        }
+        
+        // Information needed for creating a Server Log
+        message ServerLog {
+          required string name = 1;   
+          optional bytes icon = 2;
+        }
+        
+        // Information needed for creating the Main Log. At this time, no
+        // additional information is needed.
+        message MainLog {
+        }
+        
+        required LogType type = 1;
+        optional ModuleLog moduleLog = 2;
+        optional ServerLog serverLog = 3;
+        optional MainLog mainLog = 4;
+      }
+      
+      // The data for a log entry
+      message LogData {
+      
+        // The HelpInfo portion of the log entry       
+        message HelpInfo {
+          optional string url = 1;
+          optional string text = 2;
+        }
+  
+       required string summary = 1;
+       optional string level = 2;  // TODO: Maybe use an enum here
+       optional string details = 3;
+       optional HelpInfo helpInfo = 4;
+      }
+      
+      // Add a new log branch to an existing log
+      message AddLogBranch {
+        required uint32 parentLogHandle = 1;
+        required uint32 indexInParent = 2;
+        required LogData logData = 3;
+      }
+      
+      // Add a log entry to a log
+      message AddLogEntry {
+        required uint32 logHandle = 1;
+        required uint32 indexInLog = 2;
+        required LogData logData = 3;
+      }
+      
+      // Disconnect the given log (i.e. process for which information was
+      // being logged is dead)
+      message DisconnectLog {
+        required uint32 logHandle = 1;
+      }
+      
+      required RequestType requestType = 1;
+      optional CapabilityExchange capabilityExchange = 2;
+      optional AddLog addLog = 3;
+      optional AddLogBranch addLogBranch = 4;
+      optional AddLogEntry addLogEntry = 5;
+      optional DisconnectLog disconnectLog = 6;                 
+    }
+  
+    // The root type for all requests for the DevModeService
+    message DevModeRequest {
+      
+      // The different types of requests for the DevModeService
+      enum RequestType {
+        CAPABILITY_EXCHANGE = 0;
+        RESTART_WEB_SERVER = 1;
+      }
+      
+      // Request the capabilities of the DevModeService. No additional
+      // information is needed at this time.
+      message CapabilityExchange {
+      }
+      
+      // Restart the web server. No additional information is needed at this time.
+      message RestartWebServer {
+      }
+               
+      required RequestType requestType = 1;
+      optional CapabilityExchange capabilityExchange = 2;
+      optional RestartWebServer restartWebServer = 3;      
+    }
+    
+    required ServiceType serviceType = 1;
+    optional uint32 requestId = 2;
+    optional ViewerRequest viewerRequest = 3;
+    optional DevModeRequest devModeRequest = 4;
+  }
+
+  // A response message for a request. This is the root type for all response 
+  // messages. 
+  message Response {
+ 
+    // The root type for all response messages from the ViewerService
+    message ViewerResponse {
+    
+      // The different types of response messages that can come from the
+      // ViewerService
+      enum ResponseType {
+        CAPABILITY_EXCHANGE = 0;
+        ADD_LOG = 1;
+        ADD_LOG_BRANCH = 2;        
+      }
+      
+      // Response for the capabilities of the ViewerService
+      message CapabilityExchange {
+        message Capability {
+          required Message.Request.ViewerRequest.RequestType capability = 1;
+        }
+        
+        repeated Capability capabilities = 2; 
+      }
+      
+      // Response to an AddLog request
+      message AddLog {
+        required uint32 logHandle = 1;
+      }
+      
+      // Response to an AddLogBranch request
+      message AddLogBranch {
+        required uint32 logHandle = 1;
+      }
+      
+      required ResponseType responseType = 1;
+      optional CapabilityExchange capabilityExchange = 2;
+      optional AddLog addLog = 3;
+      optional AddLogBranch addLogBranch = 4;      
+    }
+  
+    // The root type for all response messages from the DevModeService
+    message DevModeResponse {
+      
+      // The different types of response messages from the DevModeService
+      enum ResponseType {
+        CAPABILITY_EXCHANGE = 0;
+        RESTART_WEB_SERVER = 1;
+      }
+      
+      // Response for the capabilities of the DevModeService
+      message CapabilityExchange {
+        message Capability {
+          required Message.Request.DevModeRequest.RequestType capability = 1;
+        }
+        
+        repeated Capability capabilities = 2;  
+      }
+      
+      // Response to a RestartWebServer request. Right now, there is no information
+      // that needs to be passed back (TODO: Provide a success code?)
+      message RestartWebServer {
+      }
+      
+      required ResponseType responseType = 1;
+      optional CapabilityExchange capabilityExchange = 2;      
+      optional RestartWebServer restartWebServer = 3;     
+    }
+ 
+    required uint32 requestId = 1;
+    optional ViewerResponse viewerResponse = 2;
+    optional DevModeResponse devModeResponse = 3;
+  }
+  
+  required MessageType messageType = 1;
+  optional Request request = 2;
+  optional Response response = 3;
+ 
+}
diff --git a/dev/core/test/com/google/gwt/dev/shell/remoteui/MessageTransportTest.java b/dev/core/test/com/google/gwt/dev/shell/remoteui/MessageTransportTest.java
new file mode 100644
index 0000000..3cf8803
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/shell/remoteui/MessageTransportTest.java
@@ -0,0 +1,360 @@
+package com.google.gwt.dev.shell.remoteui;
+
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request;
+import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response;
+
+import junit.framework.TestCase;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+public class MessageTransportTest extends TestCase {
+
+  private static class MockNetwork {
+    private final Socket clientSocket;
+    private final Socket serverSocket;
+
+    private final ServerSocket listenSocket;
+
+    public MockNetwork(Socket clientSocket, Socket serverSocket,
+        ServerSocket listenSocket) {
+      this.clientSocket = clientSocket;
+      this.serverSocket = serverSocket;
+      this.listenSocket = listenSocket;
+    }
+
+    public Socket getClientSocket() {
+      return clientSocket;
+    }
+
+    public Socket getServerSocket() {
+      return serverSocket;
+    }
+
+    public void shutdown() {
+      try {
+        clientSocket.close();
+      } catch (IOException e) {
+        // Ignore
+      }
+
+      try {
+        serverSocket.close();
+      } catch (IOException e) {
+        // Ignore
+      }
+
+      try {
+        listenSocket.close();
+      } catch (IOException e) {
+        // Ignore
+      }
+    }
+  }
+
+  private static MockNetwork createMockNetwork() throws IOException,
+      InterruptedException, ExecutionException {
+    final ServerSocket listenSocket = new ServerSocket(0);
+    ExecutorService executorService = Executors.newFixedThreadPool(1);
+    Future<Socket> future = executorService.submit(new Callable<Socket>() {
+      public Socket call() throws Exception {
+        return listenSocket.accept();
+      }
+    });
+
+    Socket clientSocket = new Socket("localhost", listenSocket.getLocalPort());
+    Socket serverSocket = future.get();
+
+    return new MockNetwork(clientSocket, serverSocket, listenSocket);
+  }
+
+  /**
+   * Tests that a client request is successfully received by the
+   * RequestProcessor, and the response generated by the RequestProcessor is
+   * successfully received by the client.
+   * 
+   * @throws IOException
+   * @throws ExecutionException
+   * @throws InterruptedException
+   */
+  public void testClientRequestReceived() throws IOException,
+      InterruptedException, ExecutionException {
+    MockNetwork network = createMockNetwork();
+
+    Message.Request.Builder clientRequestBuilder = Message.Request.newBuilder();
+    clientRequestBuilder.setRequestId(25);
+    clientRequestBuilder.setServiceType(Message.Request.ServiceType.DEV_MODE);
+    final Message.Request clientRequest = clientRequestBuilder.build();
+
+    Message.Response.Builder clientResponseBuilder = Message.Response.newBuilder();
+    clientResponseBuilder.setRequestId(25);
+    final Message.Response clientResponse = clientResponseBuilder.build();
+
+    RequestProcessor requestProcessor = new RequestProcessor() {
+      public Response execute(Request request) throws Exception {
+        assertEquals(clientRequest, request);
+        return clientResponse;
+      }
+    };
+
+    MessageTransport messageTransport = new MessageTransport(
+        network.getClientSocket().getInputStream(),
+        network.getClientSocket().getOutputStream(), requestProcessor);
+
+    Message.Builder clientRequestMsgBuilder = Message.newBuilder();
+    clientRequestMsgBuilder.setMessageType(Message.MessageType.REQUEST);
+    clientRequestMsgBuilder.setRequest(clientRequest);
+    Message clientRequestMsg = clientRequestMsgBuilder.build();
+    clientRequestMsg.writeDelimitedTo(network.getServerSocket().getOutputStream());
+
+    Message receivedResponseMsg = Message.parseDelimitedFrom(network.getServerSocket().getInputStream());
+    assertEquals(receivedResponseMsg.getResponse(), clientResponse);
+
+    network.shutdown();
+  }
+
+  /**
+   * Tests that a client request is successfully received by the
+   * RequestProcessor, and the exception thrown by the RequestProcessor is
+   * passed back in the form of an error response to the client.
+   * 
+   * @throws IOException
+   * @throws ExecutionException
+   * @throws InterruptedException
+   */
+  public void testClientRequestReceivedHandlerThrowsException() {
+    // TODO: Implement once we add error message information to the protobufs
+    // fail("Not yet implemented");
+  }
+
+  /**
+   * Tests that sending an async request to a server when the sending stream is
+   * closed will result in:
+   * 
+   * 1) A rejection of the request to the executor 2) An ExecutionException on a
+   * call to future.get()
+   * 
+   * @throws ExecutionException
+   * @throws InterruptedException
+   * @throws IOException
+   */
+  public void testExecuteAsyncRequestWithClosedSendStream() throws IOException,
+      InterruptedException, ExecutionException {
+    MockNetwork network = createMockNetwork();
+
+    RequestProcessor requestProcessor = new RequestProcessor() {
+      public Response execute(Request request) throws Exception {
+        fail("Should not reach here.");
+        return null;
+      }
+    };
+
+    MessageTransport messageTransport = new MessageTransport(
+        network.getClientSocket().getInputStream(),
+        network.getClientSocket().getOutputStream(), requestProcessor);
+
+    Message.Request.Builder requestMessageBuilder = Message.Request.newBuilder();
+    // FIXME: We are assuming what the request id is, based on knowledge of
+    // MessageTransport's implementation. We need to provide a testing-only
+    // method that allows us to specify (or peek at) the request id.
+    requestMessageBuilder.setRequestId(0);
+    requestMessageBuilder.setServiceType(Message.Request.ServiceType.DEV_MODE);
+    Message.Request request = requestMessageBuilder.build();
+
+    // Close the server's input stream; that will close the client's output
+    // stream
+    network.getServerSocket().getInputStream().close();
+
+    Future<Response> responseFuture = null;
+    responseFuture = messageTransport.executeRequestAsync(request);
+    assertNotNull(responseFuture);
+
+    try {
+      responseFuture.get(2, TimeUnit.SECONDS);
+      fail("Should have thrown an exception");
+    } catch (TimeoutException te) {
+      fail("Should not have timed out");
+    } catch (ExecutionException e) {
+      assertTrue(e.getCause() instanceof IllegalStateException);
+    } catch (Exception e) {
+      fail("Should not have thrown any other exception");
+    }
+
+    network.shutdown();
+  }
+
+  /**
+   * Tests that an async request to a remote server is successfully sent, and
+   * the server's response is successfully received.
+   */
+  public void testExecuteRequestAsync() throws InterruptedException,
+      ExecutionException, IOException, TimeoutException {
+
+    MockNetwork network = createMockNetwork();
+
+    RequestProcessor requestProcessor = new RequestProcessor() {
+      public Response execute(Request request) throws Exception {
+        fail("Should not reach here.");
+        return null;
+      }
+    };
+
+    MessageTransport messageTransport = new MessageTransport(
+        network.getClientSocket().getInputStream(),
+        network.getClientSocket().getOutputStream(), requestProcessor);
+
+    Message.Request.Builder requestMessageBuilder = Message.Request.newBuilder();
+    // FIXME: We are assuming what the request id is, based on knowledge of
+    // MessageTransport's implementation. We need to provide a testing-only
+    // method that allows us to specify (or peek at) the request id.
+    requestMessageBuilder.setRequestId(0);
+    requestMessageBuilder.setServiceType(Message.Request.ServiceType.DEV_MODE);
+    Message.Request request = requestMessageBuilder.build();
+
+    Future<Response> responseFuture = messageTransport.executeRequestAsync(request);
+    assertNotNull(responseFuture);
+
+    Message receivedRequest = Message.parseDelimitedFrom(network.getServerSocket().getInputStream());
+    assertEquals(receivedRequest.getRequest(), request);
+
+    Message.Response.Builder responseBuilder = Message.Response.newBuilder();
+    // FIXME: We are assuming what the request id is, based on knowledge of
+    // MessageTransport's implementation. We need to provide a testing-only
+    // method that allows us to specify (or peek at) the request id.
+    responseBuilder.setRequestId(0);
+    Message.Response response = responseBuilder.build();
+
+    Message.Builder responseMsgBuilder = Message.newBuilder();
+    responseMsgBuilder.setMessageType(Message.MessageType.RESPONSE);
+    responseMsgBuilder.setResponse(response);
+    Message responseMsg = responseMsgBuilder.build();
+
+    responseMsg.writeDelimitedTo(network.getServerSocket().getOutputStream());
+    assertEquals(responseFuture.get(2, TimeUnit.SECONDS), response);
+
+    network.shutdown();
+  }
+
+  /**
+   * Tests that a future for an async request to a remote server will hang if a
+   * matching response is not received.
+   * 
+   * @throws ExecutionException
+   * @throws InterruptedException
+   * @throws IOException
+   */
+  public void testExecuteRequestAsyncReceiveUnmatchedResponse()
+      throws IOException, InterruptedException, ExecutionException {
+    MockNetwork network = createMockNetwork();
+
+    RequestProcessor requestProcessor = new RequestProcessor() {
+      public Response execute(Request request) throws Exception {
+        fail("Should not reach here.");
+        return null;
+      }
+    };
+
+    MessageTransport messageTransport = new MessageTransport(
+        network.getClientSocket().getInputStream(),
+        network.getClientSocket().getOutputStream(), requestProcessor);
+
+    Message.Request.Builder requestMessageBuilder = Message.Request.newBuilder();
+    // FIXME: We are assuming what the request id is, based on knowledge of
+    // MessageTransport's implementation. We need to provide a testing-only
+    // method that allows us to specify (or peek at) the request id.
+    requestMessageBuilder.setRequestId(0);
+    requestMessageBuilder.setServiceType(Message.Request.ServiceType.DEV_MODE);
+    Message.Request request = requestMessageBuilder.build();
+
+    Future<Response> responseFuture = messageTransport.executeRequestAsync(request);
+    assertNotNull(responseFuture);
+
+    Message receivedRequest = Message.parseDelimitedFrom(network.getServerSocket().getInputStream());
+    assertEquals(receivedRequest.getRequest(), request);
+
+    Message.Response.Builder responseBuilder = Message.Response.newBuilder();
+    // Unmatched request id
+    responseBuilder.setRequestId(20);
+    Message.Response response = responseBuilder.build();
+
+    Message.Builder responseMsgBuilder = Message.newBuilder();
+    responseMsgBuilder.setMessageType(Message.MessageType.RESPONSE);
+    responseMsgBuilder.setResponse(response);
+    Message responseMsg = responseMsgBuilder.build();
+
+    responseMsg.writeDelimitedTo(network.getServerSocket().getOutputStream());
+
+    try {
+      responseFuture.get(2, TimeUnit.SECONDS);
+      fail("Should have thrown an exception");
+    } catch (TimeoutException te) {
+      // This is where we should hit
+    }
+
+    network.shutdown();
+  }
+
+  /**
+   * Tests that a future for an async request to a remote server will be
+   * interrupted if the server closes the connection before the response is
+   * received.
+   */
+  public void testExecuteRequestAsyncWithClosedReceiveStreamBeforeResponse()
+      throws IOException, InterruptedException, ExecutionException,
+      TimeoutException {
+    MockNetwork network = createMockNetwork();
+
+    RequestProcessor requestProcessor = new RequestProcessor() {
+      public Response execute(Request request) throws Exception {
+        fail("Should not reach here.");
+        return null;
+      }
+    };
+
+    MessageTransport messageTransport = new MessageTransport(
+        network.getClientSocket().getInputStream(),
+        network.getClientSocket().getOutputStream(), requestProcessor);
+
+    Message.Request.Builder requestMessageBuilder = Message.Request.newBuilder();
+    // FIXME: We are assuming what the request id is, based on knowledge of
+    // MessageTransport's implementation. We need to provide a testing-only
+    // method that allows us to specify (or peek at) the request id.
+    requestMessageBuilder.setRequestId(0);
+    requestMessageBuilder.setServiceType(Message.Request.ServiceType.DEV_MODE);
+    Message.Request request = requestMessageBuilder.build();
+
+    // assertNotNull(response);
+
+    // This will close the client's input stream
+    network.getServerSocket().getOutputStream().close();
+
+    try {
+      Future<Response> response = messageTransport.executeRequestAsync(request);
+      response.get(2, TimeUnit.SECONDS);
+      fail("Should have thrown an exception");
+    } catch (TimeoutException te) {
+      fail("Should not have timed out");
+    } catch (ExecutionException e) {
+      // This is where we should hit
+      assertTrue(e.getCause() instanceof IllegalStateException);
+    } catch (Exception e) {
+      fail("Should not have thrown any other exception");
+    }
+
+    network.shutdown();
+  }
+
+  public void testMessageTransport() {
+    // TODO: Implement tests for the constructor
+    // fail("Not yet implemented");
+  }
+}
diff --git a/distro-source/core/src/COPYING b/distro-source/core/src/COPYING
index 9d93d7f..0fa59c2 100644
--- a/distro-source/core/src/COPYING
+++ b/distro-source/core/src/COPYING
@@ -246,3 +246,10 @@
   Source code availability: 
     http://developer.mozilla.org/en/docs/Download_Mozilla_Source_Code
 
+* Protobuf
+  License: New BSD License
+    http://www.opensource.org/licenses/bsd-license.php
+  Source code availablility:
+    http://code.google.com/p/protobuf/source/checkout
+
+
diff --git a/distro-source/core/src/COPYING.html b/distro-source/core/src/COPYING.html
index 35200d3..0a93bc0 100755
--- a/distro-source/core/src/COPYING.html
+++ b/distro-source/core/src/COPYING.html
@@ -333,6 +333,11 @@
     <td class="license"><a href="http://www.mozilla.org/MPL/MPL-1.1.txt">Mozilla Public License v. 1.1</a></td>
     <td class="location"><a href="http://developer.mozilla.org/en/docs/Download_Mozilla_Source_Code">mozilla.org</a></td>
   </tr>
+  <tr>
+    <td class="package">Protobuf</td>
+    <td class="license"><a href="http://www.opensource.org/licenses/bsd-license.php">New BSD License</a></td>
+    <td class="location"><a href="http://code.google.com/p/protobuf/source/checkout">code.google.com/p/protobuf</a></td>
+  </tr>
 </tbody></table>
 
 </div> 
diff --git a/distro-source/core/src/about.html b/distro-source/core/src/about.html
index 7a734eb..fa2f53e 100644
--- a/distro-source/core/src/about.html
+++ b/distro-source/core/src/about.html
@@ -95,6 +95,7 @@
                 <li><a href="http://selenium-rc.openqa.org/">Selenium-RC</a> </li>
               </ul>
             </li>
+            <li>The <a href="http://code.google.com/p/protobuf/">Protobuf Project</a></li>
          </ul>
          For source availability and license information see COPYING.html.
 
diff --git a/distro-source/core/src/about.txt b/distro-source/core/src/about.txt
index 040e2fb..b3fdea2 100644
--- a/distro-source/core/src/about.txt
+++ b/distro-source/core/src/about.txt
@@ -20,5 +20,6 @@
    - ASM (http://asm.objectweb.org/) with modifications
  - The OpenQA Project (http://openqa.org/)
    - Selenium-RC (http://selenium-rc.openqa.org/)
+ - The Protobuf Project (http://code.google.com/p/protobuf/)
 
 For source availability and license information see COPYING.
diff --git a/eclipse/dev/.classpath b/eclipse/dev/.classpath
index 7f6f4e4..3307c79 100644
--- a/eclipse/dev/.classpath
+++ b/eclipse/dev/.classpath
@@ -39,5 +39,6 @@
 	<classpathentry kind="var" path="GWT_TOOLS/lib/sun/swingworker/swing-worker-1.1.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/htmlunit/htmlunit-core-js-r5070.jar" sourcepath="/GWT_TOOLS/lib/htmlunit/htmlunit-core-js-r5070-sources.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/htmlunit/htmlunit-r5070.jar" sourcepath="/GWT_TOOLS/lib/htmlunit/htmlunit-r5070-sources.jar"/>
+	<classpathentry kind="var" path="GWT_TOOLS/lib/protobuf/protobuf-2.2.0/protobuf-java-2.2.0.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>