diff --git a/.travis.yml b/.travis.yml
index eed620b..7443fa7 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,7 +5,7 @@
 env:
   global:
     - GRADLE_OPTS=-Xmx512m
-    - PROTOBUF_VERSION=3.0.0-beta-2
+    - PROTOBUF_VERSION=3.0.0-beta-3
     - LDFLAGS=-L/tmp/protobuf/lib
     - CXXFLAGS=-I/tmp/protobuf/include
     - LD_LIBRARY_PATH=/tmp/protobuf/lib
diff --git a/COMPILING.md b/COMPILING.md
index 9fd2257..f9cecca 100644
--- a/COMPILING.md
+++ b/COMPILING.md
@@ -27,13 +27,13 @@
 generation. Most users only need to use `skipCodegen=true` as discussed above.
 
 ### Build Protobuf
-The codegen plugin is C++ code and requires protobuf 3.0.0-beta-2.
+The codegen plugin is C++ code and requires protobuf 3.0.0-beta-3.
 
 For Linux, Mac and MinGW:
 ```
 $ git clone https://github.com/google/protobuf.git
 $ cd protobuf
-$ git checkout v3.0.0-beta-2
+$ git checkout v3.0.0-beta-3
 $ ./autogen.sh
 $ ./configure
 $ make
@@ -72,16 +72,16 @@
 Gradle to find protobuf:
 ```
 .\gradlew install ^
-    -PvcProtobufInclude=C:\path\to\protobuf-3.0.0-beta-2\src ^
-    -PvcProtobufLibs=C:\path\to\protobuf-3.0.0-beta-2\vsprojects\Release ^
+    -PvcProtobufInclude=C:\path\to\protobuf-3.0.0-beta-3\src ^
+    -PvcProtobufLibs=C:\path\to\protobuf-3.0.0-beta-3\vsprojects\Release ^
     -PtargetArch=x86_32
 ```
 
 Since specifying those properties every build is bothersome, you can instead
 create ``<project-root>\gradle.properties`` with contents like:
 ```
-vcProtobufInclude=C:\\path\\to\\protobuf-3.0.0-beta-2\\src
-vcProtobufLibs=C:\\path\\to\\protobuf-3.0.0-beta-2\\vsprojects\\Release
+vcProtobufInclude=C:\\path\\to\\protobuf-3.0.0-beta-3\\src
+vcProtobufLibs=C:\\path\\to\\protobuf-3.0.0-beta-3\\vsprojects\\Release
 targetArch=x86_32
 ```
 
diff --git a/android-interop-testing/app/build.gradle b/android-interop-testing/app/build.gradle
index a546020..4e833d8 100644
--- a/android-interop-testing/app/build.gradle
+++ b/android-interop-testing/app/build.gradle
@@ -28,7 +28,7 @@
 
 protobuf {
     protoc {
-        artifact = 'com.google.protobuf:protoc:3.0.0-beta-2'
+        artifact = 'com.google.protobuf:protoc:3.0.0-beta-3'
     }
     plugins {
         grpc {
diff --git a/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Control.java b/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Control.java
index 2bad3bb..81f353b 100644
--- a/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Control.java
+++ b/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Control.java
@@ -16,12 +16,12 @@
     /**
      * <code>SYNC_CLIENT = 0;</code>
      */
-    SYNC_CLIENT(0, 0),
+    SYNC_CLIENT(0),
     /**
      * <code>ASYNC_CLIENT = 1;</code>
      */
-    ASYNC_CLIENT(1, 1),
-    UNRECOGNIZED(-1, -1),
+    ASYNC_CLIENT(1),
+    UNRECOGNIZED(-1),
     ;
 
     /**
@@ -35,14 +35,22 @@
 
 
     public final int getNumber() {
-      if (index == -1) {
+      if (this == UNRECOGNIZED) {
         throw new java.lang.IllegalArgumentException(
             "Can't get the number of an unknown enum value.");
       }
       return value;
     }
 
+    /**
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
     public static ClientType valueOf(int value) {
+      return forNumber(value);
+    }
+
+    public static ClientType forNumber(int value) {
       switch (value) {
         case 0: return SYNC_CLIENT;
         case 1: return ASYNC_CLIENT;
@@ -58,13 +66,13 @@
         ClientType> internalValueMap =
           new com.google.protobuf.Internal.EnumLiteMap<ClientType>() {
             public ClientType findValueByNumber(int number) {
-              return ClientType.valueOf(number);
+              return ClientType.forNumber(number);
             }
           };
 
     public final com.google.protobuf.Descriptors.EnumValueDescriptor
         getValueDescriptor() {
-      return getDescriptor().getValues().get(index);
+      return getDescriptor().getValues().get(ordinal());
     }
     public final com.google.protobuf.Descriptors.EnumDescriptor
         getDescriptorForType() {
@@ -89,11 +97,9 @@
       return VALUES[desc.getIndex()];
     }
 
-    private final int index;
     private final int value;
 
-    private ClientType(int index, int value) {
-      this.index = index;
+    private ClientType(int value) {
       this.value = value;
     }
 
@@ -108,16 +114,16 @@
     /**
      * <code>SYNC_SERVER = 0;</code>
      */
-    SYNC_SERVER(0, 0),
+    SYNC_SERVER(0),
     /**
      * <code>ASYNC_SERVER = 1;</code>
      */
-    ASYNC_SERVER(1, 1),
+    ASYNC_SERVER(1),
     /**
      * <code>ASYNC_GENERIC_SERVER = 2;</code>
      */
-    ASYNC_GENERIC_SERVER(2, 2),
-    UNRECOGNIZED(-1, -1),
+    ASYNC_GENERIC_SERVER(2),
+    UNRECOGNIZED(-1),
     ;
 
     /**
@@ -135,14 +141,22 @@
 
 
     public final int getNumber() {
-      if (index == -1) {
+      if (this == UNRECOGNIZED) {
         throw new java.lang.IllegalArgumentException(
             "Can't get the number of an unknown enum value.");
       }
       return value;
     }
 
+    /**
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
     public static ServerType valueOf(int value) {
+      return forNumber(value);
+    }
+
+    public static ServerType forNumber(int value) {
       switch (value) {
         case 0: return SYNC_SERVER;
         case 1: return ASYNC_SERVER;
@@ -159,13 +173,13 @@
         ServerType> internalValueMap =
           new com.google.protobuf.Internal.EnumLiteMap<ServerType>() {
             public ServerType findValueByNumber(int number) {
-              return ServerType.valueOf(number);
+              return ServerType.forNumber(number);
             }
           };
 
     public final com.google.protobuf.Descriptors.EnumValueDescriptor
         getValueDescriptor() {
-      return getDescriptor().getValues().get(index);
+      return getDescriptor().getValues().get(ordinal());
     }
     public final com.google.protobuf.Descriptors.EnumDescriptor
         getDescriptorForType() {
@@ -190,11 +204,9 @@
       return VALUES[desc.getIndex()];
     }
 
-    private final int index;
     private final int value;
 
-    private ServerType(int index, int value) {
-      this.index = index;
+    private ServerType(int value) {
       this.value = value;
     }
 
@@ -209,12 +221,12 @@
     /**
      * <code>UNARY = 0;</code>
      */
-    UNARY(0, 0),
+    UNARY(0),
     /**
      * <code>STREAMING = 1;</code>
      */
-    STREAMING(1, 1),
-    UNRECOGNIZED(-1, -1),
+    STREAMING(1),
+    UNRECOGNIZED(-1),
     ;
 
     /**
@@ -228,14 +240,22 @@
 
 
     public final int getNumber() {
-      if (index == -1) {
+      if (this == UNRECOGNIZED) {
         throw new java.lang.IllegalArgumentException(
             "Can't get the number of an unknown enum value.");
       }
       return value;
     }
 
+    /**
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
     public static RpcType valueOf(int value) {
+      return forNumber(value);
+    }
+
+    public static RpcType forNumber(int value) {
       switch (value) {
         case 0: return UNARY;
         case 1: return STREAMING;
@@ -251,13 +271,13 @@
         RpcType> internalValueMap =
           new com.google.protobuf.Internal.EnumLiteMap<RpcType>() {
             public RpcType findValueByNumber(int number) {
-              return RpcType.valueOf(number);
+              return RpcType.forNumber(number);
             }
           };
 
     public final com.google.protobuf.Descriptors.EnumValueDescriptor
         getValueDescriptor() {
-      return getDescriptor().getValues().get(index);
+      return getDescriptor().getValues().get(ordinal());
     }
     public final com.google.protobuf.Descriptors.EnumDescriptor
         getDescriptorForType() {
@@ -282,11 +302,9 @@
       return VALUES[desc.getIndex()];
     }
 
-    private final int index;
     private final int value;
 
-    private RpcType(int index, int value) {
-      this.index = index;
+    private RpcType(int value) {
       this.value = value;
     }
 
@@ -298,21 +316,21 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional double offered_load = 1;</code>
-     *
      * <pre>
      * The rate of arrivals (a.k.a. lambda parameter of the exp distribution).
      * </pre>
+     *
+     * <code>optional double offered_load = 1;</code>
      */
     double getOfferedLoad();
   }
   /**
-   * Protobuf type {@code grpc.testing.PoissonParams}
-   *
    * <pre>
    * Parameters of poisson process distribution, which is a good representation
    * of activity coming in from independent identical stationary sources.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.PoissonParams}
    */
   public  static final class PoissonParams extends
       com.google.protobuf.GeneratedMessage implements
@@ -333,7 +351,8 @@
     }
     private PoissonParams(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -358,11 +377,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -382,11 +400,11 @@
     public static final int OFFERED_LOAD_FIELD_NUMBER = 1;
     private double offeredLoad_;
     /**
-     * <code>optional double offered_load = 1;</code>
-     *
      * <pre>
      * The rate of arrivals (a.k.a. lambda parameter of the exp distribution).
      * </pre>
+     *
+     * <code>optional double offered_load = 1;</code>
      */
     public double getOfferedLoad() {
       return offeredLoad_;
@@ -446,34 +464,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.PoissonParams parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.PoissonParams parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.PoissonParams parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.PoissonParams parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.PoissonParams parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.PoissonParams parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -495,12 +519,12 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.PoissonParams}
-     *
      * <pre>
      * Parameters of poisson process distribution, which is a good representation
      * of activity coming in from independent identical stationary sources.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.PoissonParams}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -594,7 +618,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.PoissonParams) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -605,21 +629,21 @@
 
       private double offeredLoad_ ;
       /**
-       * <code>optional double offered_load = 1;</code>
-       *
        * <pre>
        * The rate of arrivals (a.k.a. lambda parameter of the exp distribution).
        * </pre>
+       *
+       * <code>optional double offered_load = 1;</code>
        */
       public double getOfferedLoad() {
         return offeredLoad_;
       }
       /**
-       * <code>optional double offered_load = 1;</code>
-       *
        * <pre>
        * The rate of arrivals (a.k.a. lambda parameter of the exp distribution).
        * </pre>
+       *
+       * <code>optional double offered_load = 1;</code>
        */
       public Builder setOfferedLoad(double value) {
         
@@ -628,11 +652,11 @@
         return this;
       }
       /**
-       * <code>optional double offered_load = 1;</code>
-       *
        * <pre>
        * The rate of arrivals (a.k.a. lambda parameter of the exp distribution).
        * </pre>
+       *
+       * <code>optional double offered_load = 1;</code>
        */
       public Builder clearOfferedLoad() {
         
@@ -670,16 +694,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new PoissonParams(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -735,7 +750,8 @@
     }
     private UniformParams(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -765,11 +781,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -865,34 +880,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.UniformParams parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.UniformParams parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.UniformParams parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.UniformParams parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.UniformParams parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.UniformParams parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -1014,7 +1035,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.UniformParams) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -1104,16 +1125,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new UniformParams(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -1163,7 +1175,8 @@
     }
     private DeterministicParams(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -1188,11 +1201,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -1272,34 +1284,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.DeterministicParams parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.DeterministicParams parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.DeterministicParams parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.DeterministicParams parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.DeterministicParams parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.DeterministicParams parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -1415,7 +1433,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.DeterministicParams) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -1479,16 +1497,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new DeterministicParams(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -1544,7 +1553,8 @@
     }
     private ParetoParams(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -1574,11 +1584,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -1674,34 +1683,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.ParetoParams parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ParetoParams parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ParetoParams parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ParetoParams parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ParetoParams parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ParetoParams parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -1823,7 +1838,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.ParetoParams) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -1913,16 +1928,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ParetoParams(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -1946,12 +1952,12 @@
       com.google.protobuf.MessageOrBuilder {
   }
   /**
-   * Protobuf type {@code grpc.testing.ClosedLoopParams}
-   *
    * <pre>
    * Once an RPC finishes, immediately start a new one.
    * No configuration parameters needed.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.ClosedLoopParams}
    */
   public  static final class ClosedLoopParams extends
       com.google.protobuf.GeneratedMessage implements
@@ -1971,7 +1977,8 @@
     }
     private ClosedLoopParams(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       try {
         boolean done = false;
@@ -1990,11 +1997,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -2058,34 +2064,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.ClosedLoopParams parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ClosedLoopParams parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ClosedLoopParams parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ClosedLoopParams parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ClosedLoopParams parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ClosedLoopParams parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -2107,12 +2119,12 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.ClosedLoopParams}
-     *
      * <pre>
      * Once an RPC finishes, immediately start a new one.
      * No configuration parameters needed.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.ClosedLoopParams}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -2200,7 +2212,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.ClosedLoopParams) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -2238,16 +2250,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ClosedLoopParams(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -2338,7 +2341,8 @@
     }
     private LoadParams(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -2428,11 +2432,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -2459,11 +2462,19 @@
       DETERM(4),
       PARETO(5),
       LOAD_NOT_SET(0);
-      private int value = 0;
+      private final int value;
       private LoadCase(int value) {
         this.value = value;
       }
+      /**
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
       public static LoadCase valueOf(int value) {
+        return forNumber(value);
+      }
+
+      public static LoadCase forNumber(int value) {
         switch (value) {
           case 1: return CLOSED_LOOP;
           case 2: return POISSON;
@@ -2471,8 +2482,7 @@
           case 4: return DETERM;
           case 5: return PARETO;
           case 0: return LOAD_NOT_SET;
-          default: throw new java.lang.IllegalArgumentException(
-            "Value is undefined for this oneof enum.");
+          default: return null;
         }
       }
       public int getNumber() {
@@ -2482,7 +2492,7 @@
 
     public LoadCase
     getLoadCase() {
-      return LoadCase.valueOf(
+      return LoadCase.forNumber(
           loadCase_);
     }
 
@@ -2668,34 +2678,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.LoadParams parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.LoadParams parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.LoadParams parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.LoadParams parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.LoadParams parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.LoadParams parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -2868,7 +2884,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.LoadParams) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -2880,7 +2896,7 @@
       private java.lang.Object load_;
       public LoadCase
           getLoadCase() {
-        return LoadCase.valueOf(
+        return LoadCase.forNumber(
             loadCase_);
       }
 
@@ -3571,16 +3587,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new LoadParams(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -3619,11 +3626,11 @@
         getServerHostOverrideBytes();
   }
   /**
-   * Protobuf type {@code grpc.testing.SecurityParams}
-   *
    * <pre>
    * presence of SecurityParams implies use of TLS
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.SecurityParams}
    */
   public  static final class SecurityParams extends
       com.google.protobuf.GeneratedMessage implements
@@ -3645,7 +3652,8 @@
     }
     private SecurityParams(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -3676,11 +3684,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -3800,34 +3807,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.SecurityParams parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.SecurityParams parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.SecurityParams parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.SecurityParams parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.SecurityParams parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.SecurityParams parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -3849,11 +3862,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.SecurityParams}
-     *
      * <pre>
      * presence of SecurityParams implies use of TLS
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.SecurityParams}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -3954,7 +3967,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.SecurityParams) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -4087,16 +4100,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new SecurityParams(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -4120,36 +4124,36 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated string server_targets = 1;</code>
-     *
      * <pre>
      * List of targets to connect to. At least one target needs to be specified.
      * </pre>
+     *
+     * <code>repeated string server_targets = 1;</code>
      */
     com.google.protobuf.ProtocolStringList
         getServerTargetsList();
     /**
-     * <code>repeated string server_targets = 1;</code>
-     *
      * <pre>
      * List of targets to connect to. At least one target needs to be specified.
      * </pre>
+     *
+     * <code>repeated string server_targets = 1;</code>
      */
     int getServerTargetsCount();
     /**
-     * <code>repeated string server_targets = 1;</code>
-     *
      * <pre>
      * List of targets to connect to. At least one target needs to be specified.
      * </pre>
+     *
+     * <code>repeated string server_targets = 1;</code>
      */
     java.lang.String getServerTargets(int index);
     /**
-     * <code>repeated string server_targets = 1;</code>
-     *
      * <pre>
      * List of targets to connect to. At least one target needs to be specified.
      * </pre>
+     *
+     * <code>repeated string server_targets = 1;</code>
      */
     com.google.protobuf.ByteString
         getServerTargetsBytes(int index);
@@ -4177,31 +4181,31 @@
     io.grpc.benchmarks.proto.Control.SecurityParamsOrBuilder getSecurityParamsOrBuilder();
 
     /**
-     * <code>optional int32 outstanding_rpcs_per_channel = 4;</code>
-     *
      * <pre>
      * How many concurrent RPCs to start for each channel.
      * For synchronous client, use a separate thread for each outstanding RPC.
      * </pre>
+     *
+     * <code>optional int32 outstanding_rpcs_per_channel = 4;</code>
      */
     int getOutstandingRpcsPerChannel();
 
     /**
-     * <code>optional int32 client_channels = 5;</code>
-     *
      * <pre>
      * Number of independent client channels to create.
      * i-th channel will connect to server_target[i % server_targets.size()]
      * </pre>
+     *
+     * <code>optional int32 client_channels = 5;</code>
      */
     int getClientChannels();
 
     /**
-     * <code>optional int32 async_client_threads = 7;</code>
-     *
      * <pre>
      * Only for async client. Number of threads to use to start/manage RPCs.
      * </pre>
+     *
+     * <code>optional int32 async_client_threads = 7;</code>
      */
     int getAsyncClientThreads();
 
@@ -4215,27 +4219,27 @@
     io.grpc.benchmarks.proto.Control.RpcType getRpcType();
 
     /**
-     * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-     *
      * <pre>
      * The requested load for the entire client (aggregated over all the threads).
      * </pre>
+     *
+     * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
      */
     boolean hasLoadParams();
     /**
-     * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-     *
      * <pre>
      * The requested load for the entire client (aggregated over all the threads).
      * </pre>
+     *
+     * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
      */
     io.grpc.benchmarks.proto.Control.LoadParams getLoadParams();
     /**
-     * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-     *
      * <pre>
      * The requested load for the entire client (aggregated over all the threads).
      * </pre>
+     *
+     * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
      */
     io.grpc.benchmarks.proto.Control.LoadParamsOrBuilder getLoadParamsOrBuilder();
 
@@ -4266,27 +4270,27 @@
     io.grpc.benchmarks.proto.Stats.HistogramParamsOrBuilder getHistogramParamsOrBuilder();
 
     /**
-     * <code>repeated int32 core_list = 13;</code>
-     *
      * <pre>
      * Specify the cores we should run the client on, if desired
      * </pre>
+     *
+     * <code>repeated int32 core_list = 13;</code>
      */
     java.util.List<java.lang.Integer> getCoreListList();
     /**
-     * <code>repeated int32 core_list = 13;</code>
-     *
      * <pre>
      * Specify the cores we should run the client on, if desired
      * </pre>
+     *
+     * <code>repeated int32 core_list = 13;</code>
      */
     int getCoreListCount();
     /**
-     * <code>repeated int32 core_list = 13;</code>
-     *
      * <pre>
      * Specify the cores we should run the client on, if desired
      * </pre>
+     *
+     * <code>repeated int32 core_list = 13;</code>
      */
     int getCoreList(int index);
 
@@ -4324,7 +4328,8 @@
     }
     private ClientConfig(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -4458,11 +4463,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
           serverTargets_ = serverTargets_.getUnmodifiableView();
@@ -4489,42 +4493,42 @@
     public static final int SERVER_TARGETS_FIELD_NUMBER = 1;
     private com.google.protobuf.LazyStringList serverTargets_;
     /**
-     * <code>repeated string server_targets = 1;</code>
-     *
      * <pre>
      * List of targets to connect to. At least one target needs to be specified.
      * </pre>
+     *
+     * <code>repeated string server_targets = 1;</code>
      */
     public com.google.protobuf.ProtocolStringList
         getServerTargetsList() {
       return serverTargets_;
     }
     /**
-     * <code>repeated string server_targets = 1;</code>
-     *
      * <pre>
      * List of targets to connect to. At least one target needs to be specified.
      * </pre>
+     *
+     * <code>repeated string server_targets = 1;</code>
      */
     public int getServerTargetsCount() {
       return serverTargets_.size();
     }
     /**
-     * <code>repeated string server_targets = 1;</code>
-     *
      * <pre>
      * List of targets to connect to. At least one target needs to be specified.
      * </pre>
+     *
+     * <code>repeated string server_targets = 1;</code>
      */
     public java.lang.String getServerTargets(int index) {
       return serverTargets_.get(index);
     }
     /**
-     * <code>repeated string server_targets = 1;</code>
-     *
      * <pre>
      * List of targets to connect to. At least one target needs to be specified.
      * </pre>
+     *
+     * <code>repeated string server_targets = 1;</code>
      */
     public com.google.protobuf.ByteString
         getServerTargetsBytes(int index) {
@@ -4543,7 +4547,7 @@
      * <code>optional .grpc.testing.ClientType client_type = 2;</code>
      */
     public io.grpc.benchmarks.proto.Control.ClientType getClientType() {
-      io.grpc.benchmarks.proto.Control.ClientType result = io.grpc.benchmarks.proto.Control.ClientType.valueOf(clientType_);
+      io.grpc.benchmarks.proto.Control.ClientType result = io.grpc.benchmarks.proto.Control.ClientType.forNumber(clientType_);
       return result == null ? io.grpc.benchmarks.proto.Control.ClientType.UNRECOGNIZED : result;
     }
 
@@ -4571,12 +4575,12 @@
     public static final int OUTSTANDING_RPCS_PER_CHANNEL_FIELD_NUMBER = 4;
     private int outstandingRpcsPerChannel_;
     /**
-     * <code>optional int32 outstanding_rpcs_per_channel = 4;</code>
-     *
      * <pre>
      * How many concurrent RPCs to start for each channel.
      * For synchronous client, use a separate thread for each outstanding RPC.
      * </pre>
+     *
+     * <code>optional int32 outstanding_rpcs_per_channel = 4;</code>
      */
     public int getOutstandingRpcsPerChannel() {
       return outstandingRpcsPerChannel_;
@@ -4585,12 +4589,12 @@
     public static final int CLIENT_CHANNELS_FIELD_NUMBER = 5;
     private int clientChannels_;
     /**
-     * <code>optional int32 client_channels = 5;</code>
-     *
      * <pre>
      * Number of independent client channels to create.
      * i-th channel will connect to server_target[i % server_targets.size()]
      * </pre>
+     *
+     * <code>optional int32 client_channels = 5;</code>
      */
     public int getClientChannels() {
       return clientChannels_;
@@ -4599,11 +4603,11 @@
     public static final int ASYNC_CLIENT_THREADS_FIELD_NUMBER = 7;
     private int asyncClientThreads_;
     /**
-     * <code>optional int32 async_client_threads = 7;</code>
-     *
      * <pre>
      * Only for async client. Number of threads to use to start/manage RPCs.
      * </pre>
+     *
+     * <code>optional int32 async_client_threads = 7;</code>
      */
     public int getAsyncClientThreads() {
       return asyncClientThreads_;
@@ -4621,38 +4625,38 @@
      * <code>optional .grpc.testing.RpcType rpc_type = 8;</code>
      */
     public io.grpc.benchmarks.proto.Control.RpcType getRpcType() {
-      io.grpc.benchmarks.proto.Control.RpcType result = io.grpc.benchmarks.proto.Control.RpcType.valueOf(rpcType_);
+      io.grpc.benchmarks.proto.Control.RpcType result = io.grpc.benchmarks.proto.Control.RpcType.forNumber(rpcType_);
       return result == null ? io.grpc.benchmarks.proto.Control.RpcType.UNRECOGNIZED : result;
     }
 
     public static final int LOAD_PARAMS_FIELD_NUMBER = 10;
     private io.grpc.benchmarks.proto.Control.LoadParams loadParams_;
     /**
-     * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-     *
      * <pre>
      * The requested load for the entire client (aggregated over all the threads).
      * </pre>
+     *
+     * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
      */
     public boolean hasLoadParams() {
       return loadParams_ != null;
     }
     /**
-     * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-     *
      * <pre>
      * The requested load for the entire client (aggregated over all the threads).
      * </pre>
+     *
+     * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
      */
     public io.grpc.benchmarks.proto.Control.LoadParams getLoadParams() {
       return loadParams_ == null ? io.grpc.benchmarks.proto.Control.LoadParams.getDefaultInstance() : loadParams_;
     }
     /**
-     * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-     *
      * <pre>
      * The requested load for the entire client (aggregated over all the threads).
      * </pre>
+     *
+     * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
      */
     public io.grpc.benchmarks.proto.Control.LoadParamsOrBuilder getLoadParamsOrBuilder() {
       return getLoadParams();
@@ -4703,32 +4707,32 @@
     public static final int CORE_LIST_FIELD_NUMBER = 13;
     private java.util.List<java.lang.Integer> coreList_;
     /**
-     * <code>repeated int32 core_list = 13;</code>
-     *
      * <pre>
      * Specify the cores we should run the client on, if desired
      * </pre>
+     *
+     * <code>repeated int32 core_list = 13;</code>
      */
     public java.util.List<java.lang.Integer>
         getCoreListList() {
       return coreList_;
     }
     /**
-     * <code>repeated int32 core_list = 13;</code>
-     *
      * <pre>
      * Specify the cores we should run the client on, if desired
      * </pre>
+     *
+     * <code>repeated int32 core_list = 13;</code>
      */
     public int getCoreListCount() {
       return coreList_.size();
     }
     /**
-     * <code>repeated int32 core_list = 13;</code>
-     *
      * <pre>
      * Specify the cores we should run the client on, if desired
      * </pre>
+     *
+     * <code>repeated int32 core_list = 13;</code>
      */
     public int getCoreList(int index) {
       return coreList_.get(index);
@@ -4894,34 +4898,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.ClientConfig parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ClientConfig parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ClientConfig parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ClientConfig parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ClientConfig parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ClientConfig parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -5160,7 +5170,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.ClientConfig) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -5178,53 +5188,53 @@
          }
       }
       /**
-       * <code>repeated string server_targets = 1;</code>
-       *
        * <pre>
        * List of targets to connect to. At least one target needs to be specified.
        * </pre>
+       *
+       * <code>repeated string server_targets = 1;</code>
        */
       public com.google.protobuf.ProtocolStringList
           getServerTargetsList() {
         return serverTargets_.getUnmodifiableView();
       }
       /**
-       * <code>repeated string server_targets = 1;</code>
-       *
        * <pre>
        * List of targets to connect to. At least one target needs to be specified.
        * </pre>
+       *
+       * <code>repeated string server_targets = 1;</code>
        */
       public int getServerTargetsCount() {
         return serverTargets_.size();
       }
       /**
-       * <code>repeated string server_targets = 1;</code>
-       *
        * <pre>
        * List of targets to connect to. At least one target needs to be specified.
        * </pre>
+       *
+       * <code>repeated string server_targets = 1;</code>
        */
       public java.lang.String getServerTargets(int index) {
         return serverTargets_.get(index);
       }
       /**
-       * <code>repeated string server_targets = 1;</code>
-       *
        * <pre>
        * List of targets to connect to. At least one target needs to be specified.
        * </pre>
+       *
+       * <code>repeated string server_targets = 1;</code>
        */
       public com.google.protobuf.ByteString
           getServerTargetsBytes(int index) {
         return serverTargets_.getByteString(index);
       }
       /**
-       * <code>repeated string server_targets = 1;</code>
-       *
        * <pre>
        * List of targets to connect to. At least one target needs to be specified.
        * </pre>
+       *
+       * <code>repeated string server_targets = 1;</code>
        */
       public Builder setServerTargets(
           int index, java.lang.String value) {
@@ -5237,11 +5247,11 @@
         return this;
       }
       /**
-       * <code>repeated string server_targets = 1;</code>
-       *
        * <pre>
        * List of targets to connect to. At least one target needs to be specified.
        * </pre>
+       *
+       * <code>repeated string server_targets = 1;</code>
        */
       public Builder addServerTargets(
           java.lang.String value) {
@@ -5254,11 +5264,11 @@
         return this;
       }
       /**
-       * <code>repeated string server_targets = 1;</code>
-       *
        * <pre>
        * List of targets to connect to. At least one target needs to be specified.
        * </pre>
+       *
+       * <code>repeated string server_targets = 1;</code>
        */
       public Builder addAllServerTargets(
           java.lang.Iterable<java.lang.String> values) {
@@ -5269,11 +5279,11 @@
         return this;
       }
       /**
-       * <code>repeated string server_targets = 1;</code>
-       *
        * <pre>
        * List of targets to connect to. At least one target needs to be specified.
        * </pre>
+       *
+       * <code>repeated string server_targets = 1;</code>
        */
       public Builder clearServerTargets() {
         serverTargets_ = com.google.protobuf.LazyStringArrayList.EMPTY;
@@ -5282,11 +5292,11 @@
         return this;
       }
       /**
-       * <code>repeated string server_targets = 1;</code>
-       *
        * <pre>
        * List of targets to connect to. At least one target needs to be specified.
        * </pre>
+       *
+       * <code>repeated string server_targets = 1;</code>
        */
       public Builder addServerTargetsBytes(
           com.google.protobuf.ByteString value) {
@@ -5319,7 +5329,7 @@
        * <code>optional .grpc.testing.ClientType client_type = 2;</code>
        */
       public io.grpc.benchmarks.proto.Control.ClientType getClientType() {
-        io.grpc.benchmarks.proto.Control.ClientType result = io.grpc.benchmarks.proto.Control.ClientType.valueOf(clientType_);
+        io.grpc.benchmarks.proto.Control.ClientType result = io.grpc.benchmarks.proto.Control.ClientType.forNumber(clientType_);
         return result == null ? io.grpc.benchmarks.proto.Control.ClientType.UNRECOGNIZED : result;
       }
       /**
@@ -5463,23 +5473,23 @@
 
       private int outstandingRpcsPerChannel_ ;
       /**
-       * <code>optional int32 outstanding_rpcs_per_channel = 4;</code>
-       *
        * <pre>
        * How many concurrent RPCs to start for each channel.
        * For synchronous client, use a separate thread for each outstanding RPC.
        * </pre>
+       *
+       * <code>optional int32 outstanding_rpcs_per_channel = 4;</code>
        */
       public int getOutstandingRpcsPerChannel() {
         return outstandingRpcsPerChannel_;
       }
       /**
-       * <code>optional int32 outstanding_rpcs_per_channel = 4;</code>
-       *
        * <pre>
        * How many concurrent RPCs to start for each channel.
        * For synchronous client, use a separate thread for each outstanding RPC.
        * </pre>
+       *
+       * <code>optional int32 outstanding_rpcs_per_channel = 4;</code>
        */
       public Builder setOutstandingRpcsPerChannel(int value) {
         
@@ -5488,12 +5498,12 @@
         return this;
       }
       /**
-       * <code>optional int32 outstanding_rpcs_per_channel = 4;</code>
-       *
        * <pre>
        * How many concurrent RPCs to start for each channel.
        * For synchronous client, use a separate thread for each outstanding RPC.
        * </pre>
+       *
+       * <code>optional int32 outstanding_rpcs_per_channel = 4;</code>
        */
       public Builder clearOutstandingRpcsPerChannel() {
         
@@ -5504,23 +5514,23 @@
 
       private int clientChannels_ ;
       /**
-       * <code>optional int32 client_channels = 5;</code>
-       *
        * <pre>
        * Number of independent client channels to create.
        * i-th channel will connect to server_target[i % server_targets.size()]
        * </pre>
+       *
+       * <code>optional int32 client_channels = 5;</code>
        */
       public int getClientChannels() {
         return clientChannels_;
       }
       /**
-       * <code>optional int32 client_channels = 5;</code>
-       *
        * <pre>
        * Number of independent client channels to create.
        * i-th channel will connect to server_target[i % server_targets.size()]
        * </pre>
+       *
+       * <code>optional int32 client_channels = 5;</code>
        */
       public Builder setClientChannels(int value) {
         
@@ -5529,12 +5539,12 @@
         return this;
       }
       /**
-       * <code>optional int32 client_channels = 5;</code>
-       *
        * <pre>
        * Number of independent client channels to create.
        * i-th channel will connect to server_target[i % server_targets.size()]
        * </pre>
+       *
+       * <code>optional int32 client_channels = 5;</code>
        */
       public Builder clearClientChannels() {
         
@@ -5545,21 +5555,21 @@
 
       private int asyncClientThreads_ ;
       /**
-       * <code>optional int32 async_client_threads = 7;</code>
-       *
        * <pre>
        * Only for async client. Number of threads to use to start/manage RPCs.
        * </pre>
+       *
+       * <code>optional int32 async_client_threads = 7;</code>
        */
       public int getAsyncClientThreads() {
         return asyncClientThreads_;
       }
       /**
-       * <code>optional int32 async_client_threads = 7;</code>
-       *
        * <pre>
        * Only for async client. Number of threads to use to start/manage RPCs.
        * </pre>
+       *
+       * <code>optional int32 async_client_threads = 7;</code>
        */
       public Builder setAsyncClientThreads(int value) {
         
@@ -5568,11 +5578,11 @@
         return this;
       }
       /**
-       * <code>optional int32 async_client_threads = 7;</code>
-       *
        * <pre>
        * Only for async client. Number of threads to use to start/manage RPCs.
        * </pre>
+       *
+       * <code>optional int32 async_client_threads = 7;</code>
        */
       public Builder clearAsyncClientThreads() {
         
@@ -5600,7 +5610,7 @@
        * <code>optional .grpc.testing.RpcType rpc_type = 8;</code>
        */
       public io.grpc.benchmarks.proto.Control.RpcType getRpcType() {
-        io.grpc.benchmarks.proto.Control.RpcType result = io.grpc.benchmarks.proto.Control.RpcType.valueOf(rpcType_);
+        io.grpc.benchmarks.proto.Control.RpcType result = io.grpc.benchmarks.proto.Control.RpcType.forNumber(rpcType_);
         return result == null ? io.grpc.benchmarks.proto.Control.RpcType.UNRECOGNIZED : result;
       }
       /**
@@ -5629,21 +5639,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Control.LoadParams, io.grpc.benchmarks.proto.Control.LoadParams.Builder, io.grpc.benchmarks.proto.Control.LoadParamsOrBuilder> loadParamsBuilder_;
       /**
-       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-       *
        * <pre>
        * The requested load for the entire client (aggregated over all the threads).
        * </pre>
+       *
+       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
        */
       public boolean hasLoadParams() {
         return loadParamsBuilder_ != null || loadParams_ != null;
       }
       /**
-       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-       *
        * <pre>
        * The requested load for the entire client (aggregated over all the threads).
        * </pre>
+       *
+       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
        */
       public io.grpc.benchmarks.proto.Control.LoadParams getLoadParams() {
         if (loadParamsBuilder_ == null) {
@@ -5653,11 +5663,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-       *
        * <pre>
        * The requested load for the entire client (aggregated over all the threads).
        * </pre>
+       *
+       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
        */
       public Builder setLoadParams(io.grpc.benchmarks.proto.Control.LoadParams value) {
         if (loadParamsBuilder_ == null) {
@@ -5673,11 +5683,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-       *
        * <pre>
        * The requested load for the entire client (aggregated over all the threads).
        * </pre>
+       *
+       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
        */
       public Builder setLoadParams(
           io.grpc.benchmarks.proto.Control.LoadParams.Builder builderForValue) {
@@ -5691,11 +5701,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-       *
        * <pre>
        * The requested load for the entire client (aggregated over all the threads).
        * </pre>
+       *
+       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
        */
       public Builder mergeLoadParams(io.grpc.benchmarks.proto.Control.LoadParams value) {
         if (loadParamsBuilder_ == null) {
@@ -5713,11 +5723,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-       *
        * <pre>
        * The requested load for the entire client (aggregated over all the threads).
        * </pre>
+       *
+       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
        */
       public Builder clearLoadParams() {
         if (loadParamsBuilder_ == null) {
@@ -5731,11 +5741,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-       *
        * <pre>
        * The requested load for the entire client (aggregated over all the threads).
        * </pre>
+       *
+       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
        */
       public io.grpc.benchmarks.proto.Control.LoadParams.Builder getLoadParamsBuilder() {
         
@@ -5743,11 +5753,11 @@
         return getLoadParamsFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-       *
        * <pre>
        * The requested load for the entire client (aggregated over all the threads).
        * </pre>
+       *
+       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
        */
       public io.grpc.benchmarks.proto.Control.LoadParamsOrBuilder getLoadParamsOrBuilder() {
         if (loadParamsBuilder_ != null) {
@@ -5758,11 +5768,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
-       *
        * <pre>
        * The requested load for the entire client (aggregated over all the threads).
        * </pre>
+       *
+       * <code>optional .grpc.testing.LoadParams load_params = 10;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Control.LoadParams, io.grpc.benchmarks.proto.Control.LoadParams.Builder, io.grpc.benchmarks.proto.Control.LoadParamsOrBuilder> 
@@ -6020,42 +6030,42 @@
          }
       }
       /**
-       * <code>repeated int32 core_list = 13;</code>
-       *
        * <pre>
        * Specify the cores we should run the client on, if desired
        * </pre>
+       *
+       * <code>repeated int32 core_list = 13;</code>
        */
       public java.util.List<java.lang.Integer>
           getCoreListList() {
         return java.util.Collections.unmodifiableList(coreList_);
       }
       /**
-       * <code>repeated int32 core_list = 13;</code>
-       *
        * <pre>
        * Specify the cores we should run the client on, if desired
        * </pre>
+       *
+       * <code>repeated int32 core_list = 13;</code>
        */
       public int getCoreListCount() {
         return coreList_.size();
       }
       /**
-       * <code>repeated int32 core_list = 13;</code>
-       *
        * <pre>
        * Specify the cores we should run the client on, if desired
        * </pre>
+       *
+       * <code>repeated int32 core_list = 13;</code>
        */
       public int getCoreList(int index) {
         return coreList_.get(index);
       }
       /**
-       * <code>repeated int32 core_list = 13;</code>
-       *
        * <pre>
        * Specify the cores we should run the client on, if desired
        * </pre>
+       *
+       * <code>repeated int32 core_list = 13;</code>
        */
       public Builder setCoreList(
           int index, int value) {
@@ -6065,11 +6075,11 @@
         return this;
       }
       /**
-       * <code>repeated int32 core_list = 13;</code>
-       *
        * <pre>
        * Specify the cores we should run the client on, if desired
        * </pre>
+       *
+       * <code>repeated int32 core_list = 13;</code>
        */
       public Builder addCoreList(int value) {
         ensureCoreListIsMutable();
@@ -6078,11 +6088,11 @@
         return this;
       }
       /**
-       * <code>repeated int32 core_list = 13;</code>
-       *
        * <pre>
        * Specify the cores we should run the client on, if desired
        * </pre>
+       *
+       * <code>repeated int32 core_list = 13;</code>
        */
       public Builder addAllCoreList(
           java.lang.Iterable<? extends java.lang.Integer> values) {
@@ -6093,11 +6103,11 @@
         return this;
       }
       /**
-       * <code>repeated int32 core_list = 13;</code>
-       *
        * <pre>
        * Specify the cores we should run the client on, if desired
        * </pre>
+       *
+       * <code>repeated int32 core_list = 13;</code>
        */
       public Builder clearCoreList() {
         coreList_ = java.util.Collections.emptyList();
@@ -6161,16 +6171,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ClientConfig(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -6227,7 +6228,8 @@
     }
     private ClientStatus(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -6260,11 +6262,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -6356,34 +6357,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.ClientStatus parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ClientStatus parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ClientStatus parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ClientStatus parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ClientStatus parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ClientStatus parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -6507,7 +6514,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.ClientStatus) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -6662,16 +6669,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ClientStatus(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -6695,20 +6693,20 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional bool reset = 1;</code>
-     *
      * <pre>
      * if true, the stats will be reset after taking their snapshot.
      * </pre>
+     *
+     * <code>optional bool reset = 1;</code>
      */
     boolean getReset();
   }
   /**
-   * Protobuf type {@code grpc.testing.Mark}
-   *
    * <pre>
    * Request current stats
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.Mark}
    */
   public  static final class Mark extends
       com.google.protobuf.GeneratedMessage implements
@@ -6729,7 +6727,8 @@
     }
     private Mark(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -6754,11 +6753,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -6778,11 +6776,11 @@
     public static final int RESET_FIELD_NUMBER = 1;
     private boolean reset_;
     /**
-     * <code>optional bool reset = 1;</code>
-     *
      * <pre>
      * if true, the stats will be reset after taking their snapshot.
      * </pre>
+     *
+     * <code>optional bool reset = 1;</code>
      */
     public boolean getReset() {
       return reset_;
@@ -6842,34 +6840,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.Mark parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.Mark parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.Mark parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.Mark parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.Mark parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.Mark parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -6891,11 +6895,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.Mark}
-     *
      * <pre>
      * Request current stats
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.Mark}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -6989,7 +6993,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.Mark) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -7000,21 +7004,21 @@
 
       private boolean reset_ ;
       /**
-       * <code>optional bool reset = 1;</code>
-       *
        * <pre>
        * if true, the stats will be reset after taking their snapshot.
        * </pre>
+       *
+       * <code>optional bool reset = 1;</code>
        */
       public boolean getReset() {
         return reset_;
       }
       /**
-       * <code>optional bool reset = 1;</code>
-       *
        * <pre>
        * if true, the stats will be reset after taking their snapshot.
        * </pre>
+       *
+       * <code>optional bool reset = 1;</code>
        */
       public Builder setReset(boolean value) {
         
@@ -7023,11 +7027,11 @@
         return this;
       }
       /**
-       * <code>optional bool reset = 1;</code>
-       *
        * <pre>
        * if true, the stats will be reset after taking their snapshot.
        * </pre>
+       *
+       * <code>optional bool reset = 1;</code>
        */
       public Builder clearReset() {
         
@@ -7065,16 +7069,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new Mark(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -7138,7 +7133,8 @@
     }
     private ClientArgs(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -7186,11 +7182,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -7214,17 +7209,24 @@
       SETUP(1),
       MARK(2),
       ARGTYPE_NOT_SET(0);
-      private int value = 0;
+      private final int value;
       private ArgtypeCase(int value) {
         this.value = value;
       }
+      /**
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
       public static ArgtypeCase valueOf(int value) {
+        return forNumber(value);
+      }
+
+      public static ArgtypeCase forNumber(int value) {
         switch (value) {
           case 1: return SETUP;
           case 2: return MARK;
           case 0: return ARGTYPE_NOT_SET;
-          default: throw new java.lang.IllegalArgumentException(
-            "Value is undefined for this oneof enum.");
+          default: return null;
         }
       }
       public int getNumber() {
@@ -7234,7 +7236,7 @@
 
     public ArgtypeCase
     getArgtypeCase() {
-      return ArgtypeCase.valueOf(
+      return ArgtypeCase.forNumber(
           argtypeCase_);
     }
 
@@ -7339,34 +7341,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.ClientArgs parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ClientArgs parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ClientArgs parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ClientArgs parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ClientArgs parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ClientArgs parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -7506,7 +7514,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.ClientArgs) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -7518,7 +7526,7 @@
       private java.lang.Object argtype_;
       public ArgtypeCase
           getArgtypeCase() {
-        return ArgtypeCase.valueOf(
+        return ArgtypeCase.forNumber(
             argtypeCase_);
       }
 
@@ -7819,16 +7827,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ClientArgs(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -7874,79 +7873,79 @@
     io.grpc.benchmarks.proto.Control.SecurityParamsOrBuilder getSecurityParamsOrBuilder();
 
     /**
-     * <code>optional int32 port = 4;</code>
-     *
      * <pre>
      * Port on which to listen. Zero means pick unused port.
      * </pre>
+     *
+     * <code>optional int32 port = 4;</code>
      */
     int getPort();
 
     /**
-     * <code>optional int32 async_server_threads = 7;</code>
-     *
      * <pre>
      * Only for async server. Number of threads used to serve the requests.
      * </pre>
+     *
+     * <code>optional int32 async_server_threads = 7;</code>
      */
     int getAsyncServerThreads();
 
     /**
-     * <code>optional int32 core_limit = 8;</code>
-     *
      * <pre>
      * Specify the number of cores to limit server to, if desired
      * </pre>
+     *
+     * <code>optional int32 core_limit = 8;</code>
      */
     int getCoreLimit();
 
     /**
-     * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-     *
      * <pre>
      * payload config, used in generic server
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
      */
     boolean hasPayloadConfig();
     /**
-     * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-     *
      * <pre>
      * payload config, used in generic server
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
      */
     io.grpc.benchmarks.proto.Payloads.PayloadConfig getPayloadConfig();
     /**
-     * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-     *
      * <pre>
      * payload config, used in generic server
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
      */
     io.grpc.benchmarks.proto.Payloads.PayloadConfigOrBuilder getPayloadConfigOrBuilder();
 
     /**
-     * <code>repeated int32 core_list = 10;</code>
-     *
      * <pre>
      * Specify the cores we should run the server on, if desired
      * </pre>
+     *
+     * <code>repeated int32 core_list = 10;</code>
      */
     java.util.List<java.lang.Integer> getCoreListList();
     /**
-     * <code>repeated int32 core_list = 10;</code>
-     *
      * <pre>
      * Specify the cores we should run the server on, if desired
      * </pre>
+     *
+     * <code>repeated int32 core_list = 10;</code>
      */
     int getCoreListCount();
     /**
-     * <code>repeated int32 core_list = 10;</code>
-     *
      * <pre>
      * Specify the cores we should run the server on, if desired
      * </pre>
+     *
+     * <code>repeated int32 core_list = 10;</code>
      */
     int getCoreList(int index);
   }
@@ -7976,7 +7975,8 @@
     }
     private ServerConfig(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -8064,11 +8064,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
           coreList_ = java.util.Collections.unmodifiableList(coreList_);
@@ -8101,7 +8100,7 @@
      * <code>optional .grpc.testing.ServerType server_type = 1;</code>
      */
     public io.grpc.benchmarks.proto.Control.ServerType getServerType() {
-      io.grpc.benchmarks.proto.Control.ServerType result = io.grpc.benchmarks.proto.Control.ServerType.valueOf(serverType_);
+      io.grpc.benchmarks.proto.Control.ServerType result = io.grpc.benchmarks.proto.Control.ServerType.forNumber(serverType_);
       return result == null ? io.grpc.benchmarks.proto.Control.ServerType.UNRECOGNIZED : result;
     }
 
@@ -8129,11 +8128,11 @@
     public static final int PORT_FIELD_NUMBER = 4;
     private int port_;
     /**
-     * <code>optional int32 port = 4;</code>
-     *
      * <pre>
      * Port on which to listen. Zero means pick unused port.
      * </pre>
+     *
+     * <code>optional int32 port = 4;</code>
      */
     public int getPort() {
       return port_;
@@ -8142,11 +8141,11 @@
     public static final int ASYNC_SERVER_THREADS_FIELD_NUMBER = 7;
     private int asyncServerThreads_;
     /**
-     * <code>optional int32 async_server_threads = 7;</code>
-     *
      * <pre>
      * Only for async server. Number of threads used to serve the requests.
      * </pre>
+     *
+     * <code>optional int32 async_server_threads = 7;</code>
      */
     public int getAsyncServerThreads() {
       return asyncServerThreads_;
@@ -8155,11 +8154,11 @@
     public static final int CORE_LIMIT_FIELD_NUMBER = 8;
     private int coreLimit_;
     /**
-     * <code>optional int32 core_limit = 8;</code>
-     *
      * <pre>
      * Specify the number of cores to limit server to, if desired
      * </pre>
+     *
+     * <code>optional int32 core_limit = 8;</code>
      */
     public int getCoreLimit() {
       return coreLimit_;
@@ -8168,31 +8167,31 @@
     public static final int PAYLOAD_CONFIG_FIELD_NUMBER = 9;
     private io.grpc.benchmarks.proto.Payloads.PayloadConfig payloadConfig_;
     /**
-     * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-     *
      * <pre>
      * payload config, used in generic server
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
      */
     public boolean hasPayloadConfig() {
       return payloadConfig_ != null;
     }
     /**
-     * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-     *
      * <pre>
      * payload config, used in generic server
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
      */
     public io.grpc.benchmarks.proto.Payloads.PayloadConfig getPayloadConfig() {
       return payloadConfig_ == null ? io.grpc.benchmarks.proto.Payloads.PayloadConfig.getDefaultInstance() : payloadConfig_;
     }
     /**
-     * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-     *
      * <pre>
      * payload config, used in generic server
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
      */
     public io.grpc.benchmarks.proto.Payloads.PayloadConfigOrBuilder getPayloadConfigOrBuilder() {
       return getPayloadConfig();
@@ -8201,32 +8200,32 @@
     public static final int CORE_LIST_FIELD_NUMBER = 10;
     private java.util.List<java.lang.Integer> coreList_;
     /**
-     * <code>repeated int32 core_list = 10;</code>
-     *
      * <pre>
      * Specify the cores we should run the server on, if desired
      * </pre>
+     *
+     * <code>repeated int32 core_list = 10;</code>
      */
     public java.util.List<java.lang.Integer>
         getCoreListList() {
       return coreList_;
     }
     /**
-     * <code>repeated int32 core_list = 10;</code>
-     *
      * <pre>
      * Specify the cores we should run the server on, if desired
      * </pre>
+     *
+     * <code>repeated int32 core_list = 10;</code>
      */
     public int getCoreListCount() {
       return coreList_.size();
     }
     /**
-     * <code>repeated int32 core_list = 10;</code>
-     *
      * <pre>
      * Specify the cores we should run the server on, if desired
      * </pre>
+     *
+     * <code>repeated int32 core_list = 10;</code>
      */
     public int getCoreList(int index) {
       return coreList_.get(index);
@@ -8344,34 +8343,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.ServerConfig parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ServerConfig parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ServerConfig parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ServerConfig parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ServerConfig parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ServerConfig parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -8553,7 +8558,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.ServerConfig) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -8582,7 +8587,7 @@
        * <code>optional .grpc.testing.ServerType server_type = 1;</code>
        */
       public io.grpc.benchmarks.proto.Control.ServerType getServerType() {
-        io.grpc.benchmarks.proto.Control.ServerType result = io.grpc.benchmarks.proto.Control.ServerType.valueOf(serverType_);
+        io.grpc.benchmarks.proto.Control.ServerType result = io.grpc.benchmarks.proto.Control.ServerType.forNumber(serverType_);
         return result == null ? io.grpc.benchmarks.proto.Control.ServerType.UNRECOGNIZED : result;
       }
       /**
@@ -8726,21 +8731,21 @@
 
       private int port_ ;
       /**
-       * <code>optional int32 port = 4;</code>
-       *
        * <pre>
        * Port on which to listen. Zero means pick unused port.
        * </pre>
+       *
+       * <code>optional int32 port = 4;</code>
        */
       public int getPort() {
         return port_;
       }
       /**
-       * <code>optional int32 port = 4;</code>
-       *
        * <pre>
        * Port on which to listen. Zero means pick unused port.
        * </pre>
+       *
+       * <code>optional int32 port = 4;</code>
        */
       public Builder setPort(int value) {
         
@@ -8749,11 +8754,11 @@
         return this;
       }
       /**
-       * <code>optional int32 port = 4;</code>
-       *
        * <pre>
        * Port on which to listen. Zero means pick unused port.
        * </pre>
+       *
+       * <code>optional int32 port = 4;</code>
        */
       public Builder clearPort() {
         
@@ -8764,21 +8769,21 @@
 
       private int asyncServerThreads_ ;
       /**
-       * <code>optional int32 async_server_threads = 7;</code>
-       *
        * <pre>
        * Only for async server. Number of threads used to serve the requests.
        * </pre>
+       *
+       * <code>optional int32 async_server_threads = 7;</code>
        */
       public int getAsyncServerThreads() {
         return asyncServerThreads_;
       }
       /**
-       * <code>optional int32 async_server_threads = 7;</code>
-       *
        * <pre>
        * Only for async server. Number of threads used to serve the requests.
        * </pre>
+       *
+       * <code>optional int32 async_server_threads = 7;</code>
        */
       public Builder setAsyncServerThreads(int value) {
         
@@ -8787,11 +8792,11 @@
         return this;
       }
       /**
-       * <code>optional int32 async_server_threads = 7;</code>
-       *
        * <pre>
        * Only for async server. Number of threads used to serve the requests.
        * </pre>
+       *
+       * <code>optional int32 async_server_threads = 7;</code>
        */
       public Builder clearAsyncServerThreads() {
         
@@ -8802,21 +8807,21 @@
 
       private int coreLimit_ ;
       /**
-       * <code>optional int32 core_limit = 8;</code>
-       *
        * <pre>
        * Specify the number of cores to limit server to, if desired
        * </pre>
+       *
+       * <code>optional int32 core_limit = 8;</code>
        */
       public int getCoreLimit() {
         return coreLimit_;
       }
       /**
-       * <code>optional int32 core_limit = 8;</code>
-       *
        * <pre>
        * Specify the number of cores to limit server to, if desired
        * </pre>
+       *
+       * <code>optional int32 core_limit = 8;</code>
        */
       public Builder setCoreLimit(int value) {
         
@@ -8825,11 +8830,11 @@
         return this;
       }
       /**
-       * <code>optional int32 core_limit = 8;</code>
-       *
        * <pre>
        * Specify the number of cores to limit server to, if desired
        * </pre>
+       *
+       * <code>optional int32 core_limit = 8;</code>
        */
       public Builder clearCoreLimit() {
         
@@ -8842,21 +8847,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Payloads.PayloadConfig, io.grpc.benchmarks.proto.Payloads.PayloadConfig.Builder, io.grpc.benchmarks.proto.Payloads.PayloadConfigOrBuilder> payloadConfigBuilder_;
       /**
-       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-       *
        * <pre>
        * payload config, used in generic server
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
        */
       public boolean hasPayloadConfig() {
         return payloadConfigBuilder_ != null || payloadConfig_ != null;
       }
       /**
-       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-       *
        * <pre>
        * payload config, used in generic server
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
        */
       public io.grpc.benchmarks.proto.Payloads.PayloadConfig getPayloadConfig() {
         if (payloadConfigBuilder_ == null) {
@@ -8866,11 +8871,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-       *
        * <pre>
        * payload config, used in generic server
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
        */
       public Builder setPayloadConfig(io.grpc.benchmarks.proto.Payloads.PayloadConfig value) {
         if (payloadConfigBuilder_ == null) {
@@ -8886,11 +8891,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-       *
        * <pre>
        * payload config, used in generic server
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
        */
       public Builder setPayloadConfig(
           io.grpc.benchmarks.proto.Payloads.PayloadConfig.Builder builderForValue) {
@@ -8904,11 +8909,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-       *
        * <pre>
        * payload config, used in generic server
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
        */
       public Builder mergePayloadConfig(io.grpc.benchmarks.proto.Payloads.PayloadConfig value) {
         if (payloadConfigBuilder_ == null) {
@@ -8926,11 +8931,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-       *
        * <pre>
        * payload config, used in generic server
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
        */
       public Builder clearPayloadConfig() {
         if (payloadConfigBuilder_ == null) {
@@ -8944,11 +8949,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-       *
        * <pre>
        * payload config, used in generic server
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
        */
       public io.grpc.benchmarks.proto.Payloads.PayloadConfig.Builder getPayloadConfigBuilder() {
         
@@ -8956,11 +8961,11 @@
         return getPayloadConfigFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-       *
        * <pre>
        * payload config, used in generic server
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
        */
       public io.grpc.benchmarks.proto.Payloads.PayloadConfigOrBuilder getPayloadConfigOrBuilder() {
         if (payloadConfigBuilder_ != null) {
@@ -8971,11 +8976,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
-       *
        * <pre>
        * payload config, used in generic server
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadConfig payload_config = 9;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Payloads.PayloadConfig, io.grpc.benchmarks.proto.Payloads.PayloadConfig.Builder, io.grpc.benchmarks.proto.Payloads.PayloadConfigOrBuilder> 
@@ -8999,42 +9004,42 @@
          }
       }
       /**
-       * <code>repeated int32 core_list = 10;</code>
-       *
        * <pre>
        * Specify the cores we should run the server on, if desired
        * </pre>
+       *
+       * <code>repeated int32 core_list = 10;</code>
        */
       public java.util.List<java.lang.Integer>
           getCoreListList() {
         return java.util.Collections.unmodifiableList(coreList_);
       }
       /**
-       * <code>repeated int32 core_list = 10;</code>
-       *
        * <pre>
        * Specify the cores we should run the server on, if desired
        * </pre>
+       *
+       * <code>repeated int32 core_list = 10;</code>
        */
       public int getCoreListCount() {
         return coreList_.size();
       }
       /**
-       * <code>repeated int32 core_list = 10;</code>
-       *
        * <pre>
        * Specify the cores we should run the server on, if desired
        * </pre>
+       *
+       * <code>repeated int32 core_list = 10;</code>
        */
       public int getCoreList(int index) {
         return coreList_.get(index);
       }
       /**
-       * <code>repeated int32 core_list = 10;</code>
-       *
        * <pre>
        * Specify the cores we should run the server on, if desired
        * </pre>
+       *
+       * <code>repeated int32 core_list = 10;</code>
        */
       public Builder setCoreList(
           int index, int value) {
@@ -9044,11 +9049,11 @@
         return this;
       }
       /**
-       * <code>repeated int32 core_list = 10;</code>
-       *
        * <pre>
        * Specify the cores we should run the server on, if desired
        * </pre>
+       *
+       * <code>repeated int32 core_list = 10;</code>
        */
       public Builder addCoreList(int value) {
         ensureCoreListIsMutable();
@@ -9057,11 +9062,11 @@
         return this;
       }
       /**
-       * <code>repeated int32 core_list = 10;</code>
-       *
        * <pre>
        * Specify the cores we should run the server on, if desired
        * </pre>
+       *
+       * <code>repeated int32 core_list = 10;</code>
        */
       public Builder addAllCoreList(
           java.lang.Iterable<? extends java.lang.Integer> values) {
@@ -9072,11 +9077,11 @@
         return this;
       }
       /**
-       * <code>repeated int32 core_list = 10;</code>
-       *
        * <pre>
        * Specify the cores we should run the server on, if desired
        * </pre>
+       *
+       * <code>repeated int32 core_list = 10;</code>
        */
       public Builder clearCoreList() {
         coreList_ = java.util.Collections.emptyList();
@@ -9114,16 +9119,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ServerConfig(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -9187,7 +9183,8 @@
     }
     private ServerArgs(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -9235,11 +9232,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -9263,17 +9259,24 @@
       SETUP(1),
       MARK(2),
       ARGTYPE_NOT_SET(0);
-      private int value = 0;
+      private final int value;
       private ArgtypeCase(int value) {
         this.value = value;
       }
+      /**
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
       public static ArgtypeCase valueOf(int value) {
+        return forNumber(value);
+      }
+
+      public static ArgtypeCase forNumber(int value) {
         switch (value) {
           case 1: return SETUP;
           case 2: return MARK;
           case 0: return ARGTYPE_NOT_SET;
-          default: throw new java.lang.IllegalArgumentException(
-            "Value is undefined for this oneof enum.");
+          default: return null;
         }
       }
       public int getNumber() {
@@ -9283,7 +9286,7 @@
 
     public ArgtypeCase
     getArgtypeCase() {
-      return ArgtypeCase.valueOf(
+      return ArgtypeCase.forNumber(
           argtypeCase_);
     }
 
@@ -9388,34 +9391,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.ServerArgs parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ServerArgs parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ServerArgs parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ServerArgs parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ServerArgs parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ServerArgs parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -9555,7 +9564,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.ServerArgs) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -9567,7 +9576,7 @@
       private java.lang.Object argtype_;
       public ArgtypeCase
           getArgtypeCase() {
-        return ArgtypeCase.valueOf(
+        return ArgtypeCase.forNumber(
             argtypeCase_);
       }
 
@@ -9868,16 +9877,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ServerArgs(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -9914,20 +9914,20 @@
     io.grpc.benchmarks.proto.Stats.ServerStatsOrBuilder getStatsOrBuilder();
 
     /**
-     * <code>optional int32 port = 2;</code>
-     *
      * <pre>
      * the port bound by the server
      * </pre>
+     *
+     * <code>optional int32 port = 2;</code>
      */
     int getPort();
 
     /**
-     * <code>optional int32 cores = 3;</code>
-     *
      * <pre>
      * Number of cores available to the server
      * </pre>
+     *
+     * <code>optional int32 cores = 3;</code>
      */
     int getCores();
   }
@@ -9954,7 +9954,8 @@
     }
     private ServerStatus(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -9997,11 +9998,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -10042,11 +10042,11 @@
     public static final int PORT_FIELD_NUMBER = 2;
     private int port_;
     /**
-     * <code>optional int32 port = 2;</code>
-     *
      * <pre>
      * the port bound by the server
      * </pre>
+     *
+     * <code>optional int32 port = 2;</code>
      */
     public int getPort() {
       return port_;
@@ -10055,11 +10055,11 @@
     public static final int CORES_FIELD_NUMBER = 3;
     private int cores_;
     /**
-     * <code>optional int32 cores = 3;</code>
-     *
      * <pre>
      * Number of cores available to the server
      * </pre>
+     *
+     * <code>optional int32 cores = 3;</code>
      */
     public int getCores() {
       return cores_;
@@ -10133,34 +10133,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.ServerStatus parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ServerStatus parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ServerStatus parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ServerStatus parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.ServerStatus parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.ServerStatus parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -10296,7 +10302,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.ServerStatus) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -10424,21 +10430,21 @@
 
       private int port_ ;
       /**
-       * <code>optional int32 port = 2;</code>
-       *
        * <pre>
        * the port bound by the server
        * </pre>
+       *
+       * <code>optional int32 port = 2;</code>
        */
       public int getPort() {
         return port_;
       }
       /**
-       * <code>optional int32 port = 2;</code>
-       *
        * <pre>
        * the port bound by the server
        * </pre>
+       *
+       * <code>optional int32 port = 2;</code>
        */
       public Builder setPort(int value) {
         
@@ -10447,11 +10453,11 @@
         return this;
       }
       /**
-       * <code>optional int32 port = 2;</code>
-       *
        * <pre>
        * the port bound by the server
        * </pre>
+       *
+       * <code>optional int32 port = 2;</code>
        */
       public Builder clearPort() {
         
@@ -10462,21 +10468,21 @@
 
       private int cores_ ;
       /**
-       * <code>optional int32 cores = 3;</code>
-       *
        * <pre>
        * Number of cores available to the server
        * </pre>
+       *
+       * <code>optional int32 cores = 3;</code>
        */
       public int getCores() {
         return cores_;
       }
       /**
-       * <code>optional int32 cores = 3;</code>
-       *
        * <pre>
        * Number of cores available to the server
        * </pre>
+       *
+       * <code>optional int32 cores = 3;</code>
        */
       public Builder setCores(int value) {
         
@@ -10485,11 +10491,11 @@
         return this;
       }
       /**
-       * <code>optional int32 cores = 3;</code>
-       *
        * <pre>
        * Number of cores available to the server
        * </pre>
+       *
+       * <code>optional int32 cores = 3;</code>
        */
       public Builder clearCores() {
         
@@ -10527,16 +10533,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ServerStatus(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -10580,7 +10577,8 @@
     }
     private CoreRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       try {
         boolean done = false;
@@ -10599,11 +10597,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -10667,34 +10664,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.CoreRequest parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.CoreRequest parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.CoreRequest parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.CoreRequest parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.CoreRequest parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.CoreRequest parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -10804,7 +10807,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.CoreRequest) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -10842,16 +10845,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new CoreRequest(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -10875,11 +10869,11 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional int32 cores = 1;</code>
-     *
      * <pre>
      * Number of cores available on the server
      * </pre>
+     *
+     * <code>optional int32 cores = 1;</code>
      */
     int getCores();
   }
@@ -10905,7 +10899,8 @@
     }
     private CoreResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -10930,11 +10925,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -10954,11 +10948,11 @@
     public static final int CORES_FIELD_NUMBER = 1;
     private int cores_;
     /**
-     * <code>optional int32 cores = 1;</code>
-     *
      * <pre>
      * Number of cores available on the server
      * </pre>
+     *
+     * <code>optional int32 cores = 1;</code>
      */
     public int getCores() {
       return cores_;
@@ -11018,34 +11012,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.CoreResponse parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.CoreResponse parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.CoreResponse parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.CoreResponse parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.CoreResponse parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.CoreResponse parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -11161,7 +11161,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.CoreResponse) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -11172,21 +11172,21 @@
 
       private int cores_ ;
       /**
-       * <code>optional int32 cores = 1;</code>
-       *
        * <pre>
        * Number of cores available on the server
        * </pre>
+       *
+       * <code>optional int32 cores = 1;</code>
        */
       public int getCores() {
         return cores_;
       }
       /**
-       * <code>optional int32 cores = 1;</code>
-       *
        * <pre>
        * Number of cores available on the server
        * </pre>
+       *
+       * <code>optional int32 cores = 1;</code>
        */
       public Builder setCores(int value) {
         
@@ -11195,11 +11195,11 @@
         return this;
       }
       /**
-       * <code>optional int32 cores = 1;</code>
-       *
        * <pre>
        * Number of cores available on the server
        * </pre>
+       *
+       * <code>optional int32 cores = 1;</code>
        */
       public Builder clearCores() {
         
@@ -11237,16 +11237,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new CoreResponse(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -11290,7 +11281,8 @@
     }
     private Void(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       try {
         boolean done = false;
@@ -11309,11 +11301,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -11377,34 +11368,40 @@
     }
     public static io.grpc.benchmarks.proto.Control.Void parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.Void parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.Void parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.Void parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Control.Void parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Control.Void parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -11514,7 +11511,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Control.Void) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -11552,16 +11549,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new Void(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -11580,89 +11568,89 @@
 
   }
 
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_PoissonParams_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_PoissonParams_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_UniformParams_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_UniformParams_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_DeterministicParams_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_DeterministicParams_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ParetoParams_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ParetoParams_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ClosedLoopParams_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ClosedLoopParams_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_LoadParams_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_LoadParams_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_SecurityParams_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_SecurityParams_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ClientConfig_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ClientConfig_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ClientStatus_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ClientStatus_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_Mark_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_Mark_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ClientArgs_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ClientArgs_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ServerConfig_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ServerConfig_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ServerArgs_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ServerArgs_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ServerStatus_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ServerStatus_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_CoreRequest_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_CoreRequest_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_CoreResponse_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_CoreResponse_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_Void_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_Void_fieldAccessorTable;
 
@@ -11670,7 +11658,7 @@
       getDescriptor() {
     return descriptor;
   }
-  private static com.google.protobuf.Descriptors.FileDescriptor
+  private static  com.google.protobuf.Descriptors.FileDescriptor
       descriptor;
   static {
     java.lang.String[] descriptorData = {
diff --git a/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Messages.java b/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Messages.java
index 566664f..65f7fde 100644
--- a/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Messages.java
+++ b/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Messages.java
@@ -9,76 +9,84 @@
       com.google.protobuf.ExtensionRegistry registry) {
   }
   /**
-   * Protobuf enum {@code grpc.testing.PayloadType}
-   *
    * <pre>
    * The type of payload that should be returned.
    * </pre>
+   *
+   * Protobuf enum {@code grpc.testing.PayloadType}
    */
   public enum PayloadType
       implements com.google.protobuf.ProtocolMessageEnum {
     /**
-     * <code>COMPRESSABLE = 0;</code>
-     *
      * <pre>
      * Compressable text format.
      * </pre>
-     */
-    COMPRESSABLE(0, 0),
-    /**
-     * <code>UNCOMPRESSABLE = 1;</code>
      *
+     * <code>COMPRESSABLE = 0;</code>
+     */
+    COMPRESSABLE(0),
+    /**
      * <pre>
      * Uncompressable binary format.
      * </pre>
-     */
-    UNCOMPRESSABLE(1, 1),
-    /**
-     * <code>RANDOM = 2;</code>
      *
+     * <code>UNCOMPRESSABLE = 1;</code>
+     */
+    UNCOMPRESSABLE(1),
+    /**
      * <pre>
      * Randomly chosen from all other formats defined in this enum.
      * </pre>
+     *
+     * <code>RANDOM = 2;</code>
      */
-    RANDOM(2, 2),
-    UNRECOGNIZED(-1, -1),
+    RANDOM(2),
+    UNRECOGNIZED(-1),
     ;
 
     /**
-     * <code>COMPRESSABLE = 0;</code>
-     *
      * <pre>
      * Compressable text format.
      * </pre>
+     *
+     * <code>COMPRESSABLE = 0;</code>
      */
     public static final int COMPRESSABLE_VALUE = 0;
     /**
-     * <code>UNCOMPRESSABLE = 1;</code>
-     *
      * <pre>
      * Uncompressable binary format.
      * </pre>
+     *
+     * <code>UNCOMPRESSABLE = 1;</code>
      */
     public static final int UNCOMPRESSABLE_VALUE = 1;
     /**
-     * <code>RANDOM = 2;</code>
-     *
      * <pre>
      * Randomly chosen from all other formats defined in this enum.
      * </pre>
+     *
+     * <code>RANDOM = 2;</code>
      */
     public static final int RANDOM_VALUE = 2;
 
 
     public final int getNumber() {
-      if (index == -1) {
+      if (this == UNRECOGNIZED) {
         throw new java.lang.IllegalArgumentException(
             "Can't get the number of an unknown enum value.");
       }
       return value;
     }
 
+    /**
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
     public static PayloadType valueOf(int value) {
+      return forNumber(value);
+    }
+
+    public static PayloadType forNumber(int value) {
       switch (value) {
         case 0: return COMPRESSABLE;
         case 1: return UNCOMPRESSABLE;
@@ -95,13 +103,13 @@
         PayloadType> internalValueMap =
           new com.google.protobuf.Internal.EnumLiteMap<PayloadType>() {
             public PayloadType findValueByNumber(int number) {
-              return PayloadType.valueOf(number);
+              return PayloadType.forNumber(number);
             }
           };
 
     public final com.google.protobuf.Descriptors.EnumValueDescriptor
         getValueDescriptor() {
-      return getDescriptor().getValues().get(index);
+      return getDescriptor().getValues().get(ordinal());
     }
     public final com.google.protobuf.Descriptors.EnumDescriptor
         getDescriptorForType() {
@@ -126,11 +134,9 @@
       return VALUES[desc.getIndex()];
     }
 
-    private final int index;
     private final int value;
 
-    private PayloadType(int index, int value) {
-      this.index = index;
+    private PayloadType(int value) {
       this.value = value;
     }
 
@@ -138,39 +144,39 @@
   }
 
   /**
-   * Protobuf enum {@code grpc.testing.CompressionType}
-   *
    * <pre>
    * Compression algorithms
    * </pre>
+   *
+   * Protobuf enum {@code grpc.testing.CompressionType}
    */
   public enum CompressionType
       implements com.google.protobuf.ProtocolMessageEnum {
     /**
-     * <code>NONE = 0;</code>
-     *
      * <pre>
      * No compression
      * </pre>
+     *
+     * <code>NONE = 0;</code>
      */
-    NONE(0, 0),
+    NONE(0),
     /**
      * <code>GZIP = 1;</code>
      */
-    GZIP(1, 1),
+    GZIP(1),
     /**
      * <code>DEFLATE = 2;</code>
      */
-    DEFLATE(2, 2),
-    UNRECOGNIZED(-1, -1),
+    DEFLATE(2),
+    UNRECOGNIZED(-1),
     ;
 
     /**
-     * <code>NONE = 0;</code>
-     *
      * <pre>
      * No compression
      * </pre>
+     *
+     * <code>NONE = 0;</code>
      */
     public static final int NONE_VALUE = 0;
     /**
@@ -184,14 +190,22 @@
 
 
     public final int getNumber() {
-      if (index == -1) {
+      if (this == UNRECOGNIZED) {
         throw new java.lang.IllegalArgumentException(
             "Can't get the number of an unknown enum value.");
       }
       return value;
     }
 
+    /**
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
     public static CompressionType valueOf(int value) {
+      return forNumber(value);
+    }
+
+    public static CompressionType forNumber(int value) {
       switch (value) {
         case 0: return NONE;
         case 1: return GZIP;
@@ -208,13 +222,13 @@
         CompressionType> internalValueMap =
           new com.google.protobuf.Internal.EnumLiteMap<CompressionType>() {
             public CompressionType findValueByNumber(int number) {
-              return CompressionType.valueOf(number);
+              return CompressionType.forNumber(number);
             }
           };
 
     public final com.google.protobuf.Descriptors.EnumValueDescriptor
         getValueDescriptor() {
-      return getDescriptor().getValues().get(index);
+      return getDescriptor().getValues().get(ordinal());
     }
     public final com.google.protobuf.Descriptors.EnumDescriptor
         getDescriptorForType() {
@@ -239,11 +253,9 @@
       return VALUES[desc.getIndex()];
     }
 
-    private final int index;
     private final int value;
 
-    private CompressionType(int index, int value) {
-      this.index = index;
+    private CompressionType(int value) {
       this.value = value;
     }
 
@@ -255,37 +267,37 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional .grpc.testing.PayloadType type = 1;</code>
-     *
      * <pre>
      * The type of data in body.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType type = 1;</code>
      */
     int getTypeValue();
     /**
-     * <code>optional .grpc.testing.PayloadType type = 1;</code>
-     *
      * <pre>
      * The type of data in body.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType type = 1;</code>
      */
     io.grpc.benchmarks.proto.Messages.PayloadType getType();
 
     /**
-     * <code>optional bytes body = 2;</code>
-     *
      * <pre>
      * Primary contents of payload.
      * </pre>
+     *
+     * <code>optional bytes body = 2;</code>
      */
     com.google.protobuf.ByteString getBody();
   }
   /**
-   * Protobuf type {@code grpc.testing.Payload}
-   *
    * <pre>
    * A block of data, to simply increase gRPC message size.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.Payload}
    */
   public  static final class Payload extends
       com.google.protobuf.GeneratedMessage implements
@@ -307,7 +319,8 @@
     }
     private Payload(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -338,11 +351,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -362,35 +374,35 @@
     public static final int TYPE_FIELD_NUMBER = 1;
     private int type_;
     /**
-     * <code>optional .grpc.testing.PayloadType type = 1;</code>
-     *
      * <pre>
      * The type of data in body.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType type = 1;</code>
      */
     public int getTypeValue() {
       return type_;
     }
     /**
-     * <code>optional .grpc.testing.PayloadType type = 1;</code>
-     *
      * <pre>
      * The type of data in body.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType type = 1;</code>
      */
     public io.grpc.benchmarks.proto.Messages.PayloadType getType() {
-      io.grpc.benchmarks.proto.Messages.PayloadType result = io.grpc.benchmarks.proto.Messages.PayloadType.valueOf(type_);
+      io.grpc.benchmarks.proto.Messages.PayloadType result = io.grpc.benchmarks.proto.Messages.PayloadType.forNumber(type_);
       return result == null ? io.grpc.benchmarks.proto.Messages.PayloadType.UNRECOGNIZED : result;
     }
 
     public static final int BODY_FIELD_NUMBER = 2;
     private com.google.protobuf.ByteString body_;
     /**
-     * <code>optional bytes body = 2;</code>
-     *
      * <pre>
      * Primary contents of payload.
      * </pre>
+     *
+     * <code>optional bytes body = 2;</code>
      */
     public com.google.protobuf.ByteString getBody() {
       return body_;
@@ -457,34 +469,40 @@
     }
     public static io.grpc.benchmarks.proto.Messages.Payload parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.Payload parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.Payload parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.Payload parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.Payload parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.Payload parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -506,11 +524,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.Payload}
-     *
      * <pre>
      * A block of data, to simply increase gRPC message size.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.Payload}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -610,7 +628,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Messages.Payload) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -621,21 +639,21 @@
 
       private int type_ = 0;
       /**
-       * <code>optional .grpc.testing.PayloadType type = 1;</code>
-       *
        * <pre>
        * The type of data in body.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType type = 1;</code>
        */
       public int getTypeValue() {
         return type_;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType type = 1;</code>
-       *
        * <pre>
        * The type of data in body.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType type = 1;</code>
        */
       public Builder setTypeValue(int value) {
         type_ = value;
@@ -643,22 +661,22 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType type = 1;</code>
-       *
        * <pre>
        * The type of data in body.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType type = 1;</code>
        */
       public io.grpc.benchmarks.proto.Messages.PayloadType getType() {
-        io.grpc.benchmarks.proto.Messages.PayloadType result = io.grpc.benchmarks.proto.Messages.PayloadType.valueOf(type_);
+        io.grpc.benchmarks.proto.Messages.PayloadType result = io.grpc.benchmarks.proto.Messages.PayloadType.forNumber(type_);
         return result == null ? io.grpc.benchmarks.proto.Messages.PayloadType.UNRECOGNIZED : result;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType type = 1;</code>
-       *
        * <pre>
        * The type of data in body.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType type = 1;</code>
        */
       public Builder setType(io.grpc.benchmarks.proto.Messages.PayloadType value) {
         if (value == null) {
@@ -670,11 +688,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType type = 1;</code>
-       *
        * <pre>
        * The type of data in body.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType type = 1;</code>
        */
       public Builder clearType() {
         
@@ -685,21 +703,21 @@
 
       private com.google.protobuf.ByteString body_ = com.google.protobuf.ByteString.EMPTY;
       /**
-       * <code>optional bytes body = 2;</code>
-       *
        * <pre>
        * Primary contents of payload.
        * </pre>
+       *
+       * <code>optional bytes body = 2;</code>
        */
       public com.google.protobuf.ByteString getBody() {
         return body_;
       }
       /**
-       * <code>optional bytes body = 2;</code>
-       *
        * <pre>
        * Primary contents of payload.
        * </pre>
+       *
+       * <code>optional bytes body = 2;</code>
        */
       public Builder setBody(com.google.protobuf.ByteString value) {
         if (value == null) {
@@ -711,11 +729,11 @@
         return this;
       }
       /**
-       * <code>optional bytes body = 2;</code>
-       *
        * <pre>
        * Primary contents of payload.
        * </pre>
+       *
+       * <code>optional bytes body = 2;</code>
        */
       public Builder clearBody() {
         
@@ -753,16 +771,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new Payload(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -801,12 +810,12 @@
         getMessageBytes();
   }
   /**
-   * Protobuf type {@code grpc.testing.EchoStatus}
-   *
    * <pre>
    * A protobuf representation for grpc status. This is used by test
    * clients to specify a status that the server should attempt to return.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.EchoStatus}
    */
   public  static final class EchoStatus extends
       com.google.protobuf.GeneratedMessage implements
@@ -828,7 +837,8 @@
     }
     private EchoStatus(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -859,11 +869,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -983,34 +992,40 @@
     }
     public static io.grpc.benchmarks.proto.Messages.EchoStatus parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.EchoStatus parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.EchoStatus parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.EchoStatus parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.EchoStatus parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.EchoStatus parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -1032,12 +1047,12 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.EchoStatus}
-     *
      * <pre>
      * A protobuf representation for grpc status. This is used by test
      * clients to specify a status that the server should attempt to return.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.EchoStatus}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -1138,7 +1153,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Messages.EchoStatus) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -1271,16 +1286,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new EchoStatus(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -1304,125 +1310,125 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, server randomly chooses one from other formats.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     int getResponseTypeValue();
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, server randomly chooses one from other formats.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     io.grpc.benchmarks.proto.Messages.PayloadType getResponseType();
 
     /**
-     * <code>optional int32 response_size = 2;</code>
-     *
      * <pre>
      * Desired payload size in the response from the server.
      * If response_type is COMPRESSABLE, this denotes the size before compression.
      * </pre>
+     *
+     * <code>optional int32 response_size = 2;</code>
      */
     int getResponseSize();
 
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     boolean hasPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     io.grpc.benchmarks.proto.Messages.Payload getPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder();
 
     /**
-     * <code>optional bool fill_username = 4;</code>
-     *
      * <pre>
      * Whether SimpleResponse should include username.
      * </pre>
+     *
+     * <code>optional bool fill_username = 4;</code>
      */
     boolean getFillUsername();
 
     /**
-     * <code>optional bool fill_oauth_scope = 5;</code>
-     *
      * <pre>
      * Whether SimpleResponse should include OAuth scope.
      * </pre>
+     *
+     * <code>optional bool fill_oauth_scope = 5;</code>
      */
     boolean getFillOauthScope();
 
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     int getResponseCompressionValue();
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     io.grpc.benchmarks.proto.Messages.CompressionType getResponseCompression();
 
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     boolean hasResponseStatus();
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     io.grpc.benchmarks.proto.Messages.EchoStatus getResponseStatus();
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     io.grpc.benchmarks.proto.Messages.EchoStatusOrBuilder getResponseStatusOrBuilder();
   }
   /**
-   * Protobuf type {@code grpc.testing.SimpleRequest}
-   *
    * <pre>
    * Unary request.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.SimpleRequest}
    */
   public  static final class SimpleRequest extends
       com.google.protobuf.GeneratedMessage implements
@@ -1447,7 +1453,8 @@
     }
     private SimpleRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -1520,11 +1527,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -1544,38 +1550,38 @@
     public static final int RESPONSE_TYPE_FIELD_NUMBER = 1;
     private int responseType_;
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, server randomly chooses one from other formats.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     public int getResponseTypeValue() {
       return responseType_;
     }
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, server randomly chooses one from other formats.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     public io.grpc.benchmarks.proto.Messages.PayloadType getResponseType() {
-      io.grpc.benchmarks.proto.Messages.PayloadType result = io.grpc.benchmarks.proto.Messages.PayloadType.valueOf(responseType_);
+      io.grpc.benchmarks.proto.Messages.PayloadType result = io.grpc.benchmarks.proto.Messages.PayloadType.forNumber(responseType_);
       return result == null ? io.grpc.benchmarks.proto.Messages.PayloadType.UNRECOGNIZED : result;
     }
 
     public static final int RESPONSE_SIZE_FIELD_NUMBER = 2;
     private int responseSize_;
     /**
-     * <code>optional int32 response_size = 2;</code>
-     *
      * <pre>
      * Desired payload size in the response from the server.
      * If response_type is COMPRESSABLE, this denotes the size before compression.
      * </pre>
+     *
+     * <code>optional int32 response_size = 2;</code>
      */
     public int getResponseSize() {
       return responseSize_;
@@ -1584,31 +1590,31 @@
     public static final int PAYLOAD_FIELD_NUMBER = 3;
     private io.grpc.benchmarks.proto.Messages.Payload payload_;
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     public boolean hasPayload() {
       return payload_ != null;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     public io.grpc.benchmarks.proto.Messages.Payload getPayload() {
       return payload_ == null ? io.grpc.benchmarks.proto.Messages.Payload.getDefaultInstance() : payload_;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     public io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder() {
       return getPayload();
@@ -1617,11 +1623,11 @@
     public static final int FILL_USERNAME_FIELD_NUMBER = 4;
     private boolean fillUsername_;
     /**
-     * <code>optional bool fill_username = 4;</code>
-     *
      * <pre>
      * Whether SimpleResponse should include username.
      * </pre>
+     *
+     * <code>optional bool fill_username = 4;</code>
      */
     public boolean getFillUsername() {
       return fillUsername_;
@@ -1630,11 +1636,11 @@
     public static final int FILL_OAUTH_SCOPE_FIELD_NUMBER = 5;
     private boolean fillOauthScope_;
     /**
-     * <code>optional bool fill_oauth_scope = 5;</code>
-     *
      * <pre>
      * Whether SimpleResponse should include OAuth scope.
      * </pre>
+     *
+     * <code>optional bool fill_oauth_scope = 5;</code>
      */
     public boolean getFillOauthScope() {
       return fillOauthScope_;
@@ -1643,55 +1649,55 @@
     public static final int RESPONSE_COMPRESSION_FIELD_NUMBER = 6;
     private int responseCompression_;
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     public int getResponseCompressionValue() {
       return responseCompression_;
     }
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     public io.grpc.benchmarks.proto.Messages.CompressionType getResponseCompression() {
-      io.grpc.benchmarks.proto.Messages.CompressionType result = io.grpc.benchmarks.proto.Messages.CompressionType.valueOf(responseCompression_);
+      io.grpc.benchmarks.proto.Messages.CompressionType result = io.grpc.benchmarks.proto.Messages.CompressionType.forNumber(responseCompression_);
       return result == null ? io.grpc.benchmarks.proto.Messages.CompressionType.UNRECOGNIZED : result;
     }
 
     public static final int RESPONSE_STATUS_FIELD_NUMBER = 7;
     private io.grpc.benchmarks.proto.Messages.EchoStatus responseStatus_;
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     public boolean hasResponseStatus() {
       return responseStatus_ != null;
     }
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     public io.grpc.benchmarks.proto.Messages.EchoStatus getResponseStatus() {
       return responseStatus_ == null ? io.grpc.benchmarks.proto.Messages.EchoStatus.getDefaultInstance() : responseStatus_;
     }
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     public io.grpc.benchmarks.proto.Messages.EchoStatusOrBuilder getResponseStatusOrBuilder() {
       return getResponseStatus();
@@ -1793,34 +1799,40 @@
     }
     public static io.grpc.benchmarks.proto.Messages.SimpleRequest parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.SimpleRequest parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.SimpleRequest parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.SimpleRequest parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.SimpleRequest parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.SimpleRequest parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -1842,11 +1854,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.SimpleRequest}
-     *
      * <pre>
      * Unary request.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.SimpleRequest}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -1992,7 +2004,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Messages.SimpleRequest) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -2003,23 +2015,23 @@
 
       private int responseType_ = 0;
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, server randomly chooses one from other formats.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public int getResponseTypeValue() {
         return responseType_;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, server randomly chooses one from other formats.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public Builder setResponseTypeValue(int value) {
         responseType_ = value;
@@ -2027,24 +2039,24 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, server randomly chooses one from other formats.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public io.grpc.benchmarks.proto.Messages.PayloadType getResponseType() {
-        io.grpc.benchmarks.proto.Messages.PayloadType result = io.grpc.benchmarks.proto.Messages.PayloadType.valueOf(responseType_);
+        io.grpc.benchmarks.proto.Messages.PayloadType result = io.grpc.benchmarks.proto.Messages.PayloadType.forNumber(responseType_);
         return result == null ? io.grpc.benchmarks.proto.Messages.PayloadType.UNRECOGNIZED : result;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, server randomly chooses one from other formats.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public Builder setResponseType(io.grpc.benchmarks.proto.Messages.PayloadType value) {
         if (value == null) {
@@ -2056,12 +2068,12 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, server randomly chooses one from other formats.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public Builder clearResponseType() {
         
@@ -2072,23 +2084,23 @@
 
       private int responseSize_ ;
       /**
-       * <code>optional int32 response_size = 2;</code>
-       *
        * <pre>
        * Desired payload size in the response from the server.
        * If response_type is COMPRESSABLE, this denotes the size before compression.
        * </pre>
+       *
+       * <code>optional int32 response_size = 2;</code>
        */
       public int getResponseSize() {
         return responseSize_;
       }
       /**
-       * <code>optional int32 response_size = 2;</code>
-       *
        * <pre>
        * Desired payload size in the response from the server.
        * If response_type is COMPRESSABLE, this denotes the size before compression.
        * </pre>
+       *
+       * <code>optional int32 response_size = 2;</code>
        */
       public Builder setResponseSize(int value) {
         
@@ -2097,12 +2109,12 @@
         return this;
       }
       /**
-       * <code>optional int32 response_size = 2;</code>
-       *
        * <pre>
        * Desired payload size in the response from the server.
        * If response_type is COMPRESSABLE, this denotes the size before compression.
        * </pre>
+       *
+       * <code>optional int32 response_size = 2;</code>
        */
       public Builder clearResponseSize() {
         
@@ -2115,21 +2127,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Messages.Payload, io.grpc.benchmarks.proto.Messages.Payload.Builder, io.grpc.benchmarks.proto.Messages.PayloadOrBuilder> payloadBuilder_;
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public boolean hasPayload() {
         return payloadBuilder_ != null || payload_ != null;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public io.grpc.benchmarks.proto.Messages.Payload getPayload() {
         if (payloadBuilder_ == null) {
@@ -2139,11 +2151,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder setPayload(io.grpc.benchmarks.proto.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -2159,11 +2171,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder setPayload(
           io.grpc.benchmarks.proto.Messages.Payload.Builder builderForValue) {
@@ -2177,11 +2189,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder mergePayload(io.grpc.benchmarks.proto.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -2199,11 +2211,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder clearPayload() {
         if (payloadBuilder_ == null) {
@@ -2217,11 +2229,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public io.grpc.benchmarks.proto.Messages.Payload.Builder getPayloadBuilder() {
         
@@ -2229,11 +2241,11 @@
         return getPayloadFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder() {
         if (payloadBuilder_ != null) {
@@ -2244,11 +2256,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Messages.Payload, io.grpc.benchmarks.proto.Messages.Payload.Builder, io.grpc.benchmarks.proto.Messages.PayloadOrBuilder> 
@@ -2266,21 +2278,21 @@
 
       private boolean fillUsername_ ;
       /**
-       * <code>optional bool fill_username = 4;</code>
-       *
        * <pre>
        * Whether SimpleResponse should include username.
        * </pre>
+       *
+       * <code>optional bool fill_username = 4;</code>
        */
       public boolean getFillUsername() {
         return fillUsername_;
       }
       /**
-       * <code>optional bool fill_username = 4;</code>
-       *
        * <pre>
        * Whether SimpleResponse should include username.
        * </pre>
+       *
+       * <code>optional bool fill_username = 4;</code>
        */
       public Builder setFillUsername(boolean value) {
         
@@ -2289,11 +2301,11 @@
         return this;
       }
       /**
-       * <code>optional bool fill_username = 4;</code>
-       *
        * <pre>
        * Whether SimpleResponse should include username.
        * </pre>
+       *
+       * <code>optional bool fill_username = 4;</code>
        */
       public Builder clearFillUsername() {
         
@@ -2304,21 +2316,21 @@
 
       private boolean fillOauthScope_ ;
       /**
-       * <code>optional bool fill_oauth_scope = 5;</code>
-       *
        * <pre>
        * Whether SimpleResponse should include OAuth scope.
        * </pre>
+       *
+       * <code>optional bool fill_oauth_scope = 5;</code>
        */
       public boolean getFillOauthScope() {
         return fillOauthScope_;
       }
       /**
-       * <code>optional bool fill_oauth_scope = 5;</code>
-       *
        * <pre>
        * Whether SimpleResponse should include OAuth scope.
        * </pre>
+       *
+       * <code>optional bool fill_oauth_scope = 5;</code>
        */
       public Builder setFillOauthScope(boolean value) {
         
@@ -2327,11 +2339,11 @@
         return this;
       }
       /**
-       * <code>optional bool fill_oauth_scope = 5;</code>
-       *
        * <pre>
        * Whether SimpleResponse should include OAuth scope.
        * </pre>
+       *
+       * <code>optional bool fill_oauth_scope = 5;</code>
        */
       public Builder clearFillOauthScope() {
         
@@ -2342,21 +2354,21 @@
 
       private int responseCompression_ = 0;
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public int getResponseCompressionValue() {
         return responseCompression_;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public Builder setResponseCompressionValue(int value) {
         responseCompression_ = value;
@@ -2364,22 +2376,22 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public io.grpc.benchmarks.proto.Messages.CompressionType getResponseCompression() {
-        io.grpc.benchmarks.proto.Messages.CompressionType result = io.grpc.benchmarks.proto.Messages.CompressionType.valueOf(responseCompression_);
+        io.grpc.benchmarks.proto.Messages.CompressionType result = io.grpc.benchmarks.proto.Messages.CompressionType.forNumber(responseCompression_);
         return result == null ? io.grpc.benchmarks.proto.Messages.CompressionType.UNRECOGNIZED : result;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public Builder setResponseCompression(io.grpc.benchmarks.proto.Messages.CompressionType value) {
         if (value == null) {
@@ -2391,11 +2403,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public Builder clearResponseCompression() {
         
@@ -2408,21 +2420,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Messages.EchoStatus, io.grpc.benchmarks.proto.Messages.EchoStatus.Builder, io.grpc.benchmarks.proto.Messages.EchoStatusOrBuilder> responseStatusBuilder_;
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public boolean hasResponseStatus() {
         return responseStatusBuilder_ != null || responseStatus_ != null;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public io.grpc.benchmarks.proto.Messages.EchoStatus getResponseStatus() {
         if (responseStatusBuilder_ == null) {
@@ -2432,11 +2444,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder setResponseStatus(io.grpc.benchmarks.proto.Messages.EchoStatus value) {
         if (responseStatusBuilder_ == null) {
@@ -2452,11 +2464,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder setResponseStatus(
           io.grpc.benchmarks.proto.Messages.EchoStatus.Builder builderForValue) {
@@ -2470,11 +2482,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder mergeResponseStatus(io.grpc.benchmarks.proto.Messages.EchoStatus value) {
         if (responseStatusBuilder_ == null) {
@@ -2492,11 +2504,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder clearResponseStatus() {
         if (responseStatusBuilder_ == null) {
@@ -2510,11 +2522,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public io.grpc.benchmarks.proto.Messages.EchoStatus.Builder getResponseStatusBuilder() {
         
@@ -2522,11 +2534,11 @@
         return getResponseStatusFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public io.grpc.benchmarks.proto.Messages.EchoStatusOrBuilder getResponseStatusOrBuilder() {
         if (responseStatusBuilder_ != null) {
@@ -2537,11 +2549,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Messages.EchoStatus, io.grpc.benchmarks.proto.Messages.EchoStatus.Builder, io.grpc.benchmarks.proto.Messages.EchoStatusOrBuilder> 
@@ -2586,16 +2598,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new SimpleRequest(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -2619,74 +2622,74 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase message size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     boolean hasPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase message size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     io.grpc.benchmarks.proto.Messages.Payload getPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase message size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder();
 
     /**
-     * <code>optional string username = 2;</code>
-     *
      * <pre>
      * The user the request came from, for verifying authentication was
      * successful when the client expected it.
      * </pre>
+     *
+     * <code>optional string username = 2;</code>
      */
     java.lang.String getUsername();
     /**
-     * <code>optional string username = 2;</code>
-     *
      * <pre>
      * The user the request came from, for verifying authentication was
      * successful when the client expected it.
      * </pre>
+     *
+     * <code>optional string username = 2;</code>
      */
     com.google.protobuf.ByteString
         getUsernameBytes();
 
     /**
-     * <code>optional string oauth_scope = 3;</code>
-     *
      * <pre>
      * OAuth scope.
      * </pre>
+     *
+     * <code>optional string oauth_scope = 3;</code>
      */
     java.lang.String getOauthScope();
     /**
-     * <code>optional string oauth_scope = 3;</code>
-     *
      * <pre>
      * OAuth scope.
      * </pre>
+     *
+     * <code>optional string oauth_scope = 3;</code>
      */
     com.google.protobuf.ByteString
         getOauthScopeBytes();
   }
   /**
-   * Protobuf type {@code grpc.testing.SimpleResponse}
-   *
    * <pre>
    * Unary response, as configured by the request.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.SimpleResponse}
    */
   public  static final class SimpleResponse extends
       com.google.protobuf.GeneratedMessage implements
@@ -2708,7 +2711,8 @@
     }
     private SimpleResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -2753,11 +2757,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -2777,31 +2780,31 @@
     public static final int PAYLOAD_FIELD_NUMBER = 1;
     private io.grpc.benchmarks.proto.Messages.Payload payload_;
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase message size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public boolean hasPayload() {
       return payload_ != null;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase message size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public io.grpc.benchmarks.proto.Messages.Payload getPayload() {
       return payload_ == null ? io.grpc.benchmarks.proto.Messages.Payload.getDefaultInstance() : payload_;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase message size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder() {
       return getPayload();
@@ -2810,12 +2813,12 @@
     public static final int USERNAME_FIELD_NUMBER = 2;
     private volatile java.lang.Object username_;
     /**
-     * <code>optional string username = 2;</code>
-     *
      * <pre>
      * The user the request came from, for verifying authentication was
      * successful when the client expected it.
      * </pre>
+     *
+     * <code>optional string username = 2;</code>
      */
     public java.lang.String getUsername() {
       java.lang.Object ref = username_;
@@ -2830,12 +2833,12 @@
       }
     }
     /**
-     * <code>optional string username = 2;</code>
-     *
      * <pre>
      * The user the request came from, for verifying authentication was
      * successful when the client expected it.
      * </pre>
+     *
+     * <code>optional string username = 2;</code>
      */
     public com.google.protobuf.ByteString
         getUsernameBytes() {
@@ -2854,11 +2857,11 @@
     public static final int OAUTH_SCOPE_FIELD_NUMBER = 3;
     private volatile java.lang.Object oauthScope_;
     /**
-     * <code>optional string oauth_scope = 3;</code>
-     *
      * <pre>
      * OAuth scope.
      * </pre>
+     *
+     * <code>optional string oauth_scope = 3;</code>
      */
     public java.lang.String getOauthScope() {
       java.lang.Object ref = oauthScope_;
@@ -2873,11 +2876,11 @@
       }
     }
     /**
-     * <code>optional string oauth_scope = 3;</code>
-     *
      * <pre>
      * OAuth scope.
      * </pre>
+     *
+     * <code>optional string oauth_scope = 3;</code>
      */
     public com.google.protobuf.ByteString
         getOauthScopeBytes() {
@@ -2959,34 +2962,40 @@
     }
     public static io.grpc.benchmarks.proto.Messages.SimpleResponse parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.SimpleResponse parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.SimpleResponse parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.SimpleResponse parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.SimpleResponse parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.SimpleResponse parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -3008,11 +3017,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.SimpleResponse}
-     *
      * <pre>
      * Unary response, as configured by the request.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.SimpleResponse}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -3128,7 +3137,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Messages.SimpleResponse) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -3141,21 +3150,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Messages.Payload, io.grpc.benchmarks.proto.Messages.Payload.Builder, io.grpc.benchmarks.proto.Messages.PayloadOrBuilder> payloadBuilder_;
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public boolean hasPayload() {
         return payloadBuilder_ != null || payload_ != null;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.benchmarks.proto.Messages.Payload getPayload() {
         if (payloadBuilder_ == null) {
@@ -3165,11 +3174,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder setPayload(io.grpc.benchmarks.proto.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -3185,11 +3194,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder setPayload(
           io.grpc.benchmarks.proto.Messages.Payload.Builder builderForValue) {
@@ -3203,11 +3212,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder mergePayload(io.grpc.benchmarks.proto.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -3225,11 +3234,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder clearPayload() {
         if (payloadBuilder_ == null) {
@@ -3243,11 +3252,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.benchmarks.proto.Messages.Payload.Builder getPayloadBuilder() {
         
@@ -3255,11 +3264,11 @@
         return getPayloadFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder() {
         if (payloadBuilder_ != null) {
@@ -3270,11 +3279,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Messages.Payload, io.grpc.benchmarks.proto.Messages.Payload.Builder, io.grpc.benchmarks.proto.Messages.PayloadOrBuilder> 
@@ -3292,12 +3301,12 @@
 
       private java.lang.Object username_ = "";
       /**
-       * <code>optional string username = 2;</code>
-       *
        * <pre>
        * The user the request came from, for verifying authentication was
        * successful when the client expected it.
        * </pre>
+       *
+       * <code>optional string username = 2;</code>
        */
       public java.lang.String getUsername() {
         java.lang.Object ref = username_;
@@ -3312,12 +3321,12 @@
         }
       }
       /**
-       * <code>optional string username = 2;</code>
-       *
        * <pre>
        * The user the request came from, for verifying authentication was
        * successful when the client expected it.
        * </pre>
+       *
+       * <code>optional string username = 2;</code>
        */
       public com.google.protobuf.ByteString
           getUsernameBytes() {
@@ -3333,12 +3342,12 @@
         }
       }
       /**
-       * <code>optional string username = 2;</code>
-       *
        * <pre>
        * The user the request came from, for verifying authentication was
        * successful when the client expected it.
        * </pre>
+       *
+       * <code>optional string username = 2;</code>
        */
       public Builder setUsername(
           java.lang.String value) {
@@ -3351,12 +3360,12 @@
         return this;
       }
       /**
-       * <code>optional string username = 2;</code>
-       *
        * <pre>
        * The user the request came from, for verifying authentication was
        * successful when the client expected it.
        * </pre>
+       *
+       * <code>optional string username = 2;</code>
        */
       public Builder clearUsername() {
         
@@ -3365,12 +3374,12 @@
         return this;
       }
       /**
-       * <code>optional string username = 2;</code>
-       *
        * <pre>
        * The user the request came from, for verifying authentication was
        * successful when the client expected it.
        * </pre>
+       *
+       * <code>optional string username = 2;</code>
        */
       public Builder setUsernameBytes(
           com.google.protobuf.ByteString value) {
@@ -3386,11 +3395,11 @@
 
       private java.lang.Object oauthScope_ = "";
       /**
-       * <code>optional string oauth_scope = 3;</code>
-       *
        * <pre>
        * OAuth scope.
        * </pre>
+       *
+       * <code>optional string oauth_scope = 3;</code>
        */
       public java.lang.String getOauthScope() {
         java.lang.Object ref = oauthScope_;
@@ -3405,11 +3414,11 @@
         }
       }
       /**
-       * <code>optional string oauth_scope = 3;</code>
-       *
        * <pre>
        * OAuth scope.
        * </pre>
+       *
+       * <code>optional string oauth_scope = 3;</code>
        */
       public com.google.protobuf.ByteString
           getOauthScopeBytes() {
@@ -3425,11 +3434,11 @@
         }
       }
       /**
-       * <code>optional string oauth_scope = 3;</code>
-       *
        * <pre>
        * OAuth scope.
        * </pre>
+       *
+       * <code>optional string oauth_scope = 3;</code>
        */
       public Builder setOauthScope(
           java.lang.String value) {
@@ -3442,11 +3451,11 @@
         return this;
       }
       /**
-       * <code>optional string oauth_scope = 3;</code>
-       *
        * <pre>
        * OAuth scope.
        * </pre>
+       *
+       * <code>optional string oauth_scope = 3;</code>
        */
       public Builder clearOauthScope() {
         
@@ -3455,11 +3464,11 @@
         return this;
       }
       /**
-       * <code>optional string oauth_scope = 3;</code>
-       *
        * <pre>
        * OAuth scope.
        * </pre>
+       *
+       * <code>optional string oauth_scope = 3;</code>
        */
       public Builder setOauthScopeBytes(
           com.google.protobuf.ByteString value) {
@@ -3502,16 +3511,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new SimpleResponse(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -3535,36 +3535,36 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     boolean hasPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     io.grpc.benchmarks.proto.Messages.Payload getPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder();
   }
   /**
-   * Protobuf type {@code grpc.testing.StreamingInputCallRequest}
-   *
    * <pre>
    * Client-streaming request.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.StreamingInputCallRequest}
    */
   public  static final class StreamingInputCallRequest extends
       com.google.protobuf.GeneratedMessage implements
@@ -3584,7 +3584,8 @@
     }
     private StreamingInputCallRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -3617,11 +3618,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -3641,31 +3641,31 @@
     public static final int PAYLOAD_FIELD_NUMBER = 1;
     private io.grpc.benchmarks.proto.Messages.Payload payload_;
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public boolean hasPayload() {
       return payload_ != null;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public io.grpc.benchmarks.proto.Messages.Payload getPayload() {
       return payload_ == null ? io.grpc.benchmarks.proto.Messages.Payload.getDefaultInstance() : payload_;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder() {
       return getPayload();
@@ -3725,34 +3725,40 @@
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingInputCallRequest parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingInputCallRequest parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingInputCallRequest parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingInputCallRequest parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingInputCallRequest parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingInputCallRequest parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -3774,11 +3780,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.StreamingInputCallRequest}
-     *
      * <pre>
      * Client-streaming request.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.StreamingInputCallRequest}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -3880,7 +3886,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Messages.StreamingInputCallRequest) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -3893,21 +3899,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Messages.Payload, io.grpc.benchmarks.proto.Messages.Payload.Builder, io.grpc.benchmarks.proto.Messages.PayloadOrBuilder> payloadBuilder_;
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public boolean hasPayload() {
         return payloadBuilder_ != null || payload_ != null;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.benchmarks.proto.Messages.Payload getPayload() {
         if (payloadBuilder_ == null) {
@@ -3917,11 +3923,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder setPayload(io.grpc.benchmarks.proto.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -3937,11 +3943,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder setPayload(
           io.grpc.benchmarks.proto.Messages.Payload.Builder builderForValue) {
@@ -3955,11 +3961,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder mergePayload(io.grpc.benchmarks.proto.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -3977,11 +3983,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder clearPayload() {
         if (payloadBuilder_ == null) {
@@ -3995,11 +4001,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.benchmarks.proto.Messages.Payload.Builder getPayloadBuilder() {
         
@@ -4007,11 +4013,11 @@
         return getPayloadFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder() {
         if (payloadBuilder_ != null) {
@@ -4022,11 +4028,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Messages.Payload, io.grpc.benchmarks.proto.Messages.Payload.Builder, io.grpc.benchmarks.proto.Messages.PayloadOrBuilder> 
@@ -4071,16 +4077,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new StreamingInputCallRequest(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -4104,20 +4101,20 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional int32 aggregated_payload_size = 1;</code>
-     *
      * <pre>
      * Aggregated size of payloads received from the client.
      * </pre>
+     *
+     * <code>optional int32 aggregated_payload_size = 1;</code>
      */
     int getAggregatedPayloadSize();
   }
   /**
-   * Protobuf type {@code grpc.testing.StreamingInputCallResponse}
-   *
    * <pre>
    * Client-streaming response.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.StreamingInputCallResponse}
    */
   public  static final class StreamingInputCallResponse extends
       com.google.protobuf.GeneratedMessage implements
@@ -4138,7 +4135,8 @@
     }
     private StreamingInputCallResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -4163,11 +4161,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -4187,11 +4184,11 @@
     public static final int AGGREGATED_PAYLOAD_SIZE_FIELD_NUMBER = 1;
     private int aggregatedPayloadSize_;
     /**
-     * <code>optional int32 aggregated_payload_size = 1;</code>
-     *
      * <pre>
      * Aggregated size of payloads received from the client.
      * </pre>
+     *
+     * <code>optional int32 aggregated_payload_size = 1;</code>
      */
     public int getAggregatedPayloadSize() {
       return aggregatedPayloadSize_;
@@ -4251,34 +4248,40 @@
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingInputCallResponse parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingInputCallResponse parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingInputCallResponse parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingInputCallResponse parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingInputCallResponse parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingInputCallResponse parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -4300,11 +4303,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.StreamingInputCallResponse}
-     *
      * <pre>
      * Client-streaming response.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.StreamingInputCallResponse}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -4398,7 +4401,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Messages.StreamingInputCallResponse) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -4409,21 +4412,21 @@
 
       private int aggregatedPayloadSize_ ;
       /**
-       * <code>optional int32 aggregated_payload_size = 1;</code>
-       *
        * <pre>
        * Aggregated size of payloads received from the client.
        * </pre>
+       *
+       * <code>optional int32 aggregated_payload_size = 1;</code>
        */
       public int getAggregatedPayloadSize() {
         return aggregatedPayloadSize_;
       }
       /**
-       * <code>optional int32 aggregated_payload_size = 1;</code>
-       *
        * <pre>
        * Aggregated size of payloads received from the client.
        * </pre>
+       *
+       * <code>optional int32 aggregated_payload_size = 1;</code>
        */
       public Builder setAggregatedPayloadSize(int value) {
         
@@ -4432,11 +4435,11 @@
         return this;
       }
       /**
-       * <code>optional int32 aggregated_payload_size = 1;</code>
-       *
        * <pre>
        * Aggregated size of payloads received from the client.
        * </pre>
+       *
+       * <code>optional int32 aggregated_payload_size = 1;</code>
        */
       public Builder clearAggregatedPayloadSize() {
         
@@ -4474,16 +4477,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new StreamingInputCallResponse(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -4507,31 +4501,31 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional int32 size = 1;</code>
-     *
      * <pre>
      * Desired payload sizes in responses from the server.
      * If response_type is COMPRESSABLE, this denotes the size before compression.
      * </pre>
+     *
+     * <code>optional int32 size = 1;</code>
      */
     int getSize();
 
     /**
-     * <code>optional int32 interval_us = 2;</code>
-     *
      * <pre>
      * Desired interval between consecutive responses in the response stream in
      * microseconds.
      * </pre>
+     *
+     * <code>optional int32 interval_us = 2;</code>
      */
     int getIntervalUs();
   }
   /**
-   * Protobuf type {@code grpc.testing.ResponseParameters}
-   *
    * <pre>
    * Configuration for a particular response.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.ResponseParameters}
    */
   public  static final class ResponseParameters extends
       com.google.protobuf.GeneratedMessage implements
@@ -4553,7 +4547,8 @@
     }
     private ResponseParameters(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -4583,11 +4578,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -4607,12 +4601,12 @@
     public static final int SIZE_FIELD_NUMBER = 1;
     private int size_;
     /**
-     * <code>optional int32 size = 1;</code>
-     *
      * <pre>
      * Desired payload sizes in responses from the server.
      * If response_type is COMPRESSABLE, this denotes the size before compression.
      * </pre>
+     *
+     * <code>optional int32 size = 1;</code>
      */
     public int getSize() {
       return size_;
@@ -4621,12 +4615,12 @@
     public static final int INTERVAL_US_FIELD_NUMBER = 2;
     private int intervalUs_;
     /**
-     * <code>optional int32 interval_us = 2;</code>
-     *
      * <pre>
      * Desired interval between consecutive responses in the response stream in
      * microseconds.
      * </pre>
+     *
+     * <code>optional int32 interval_us = 2;</code>
      */
     public int getIntervalUs() {
       return intervalUs_;
@@ -4693,34 +4687,40 @@
     }
     public static io.grpc.benchmarks.proto.Messages.ResponseParameters parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.ResponseParameters parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.ResponseParameters parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.ResponseParameters parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.ResponseParameters parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.ResponseParameters parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -4742,11 +4742,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.ResponseParameters}
-     *
      * <pre>
      * Configuration for a particular response.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.ResponseParameters}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -4846,7 +4846,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Messages.ResponseParameters) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -4857,23 +4857,23 @@
 
       private int size_ ;
       /**
-       * <code>optional int32 size = 1;</code>
-       *
        * <pre>
        * Desired payload sizes in responses from the server.
        * If response_type is COMPRESSABLE, this denotes the size before compression.
        * </pre>
+       *
+       * <code>optional int32 size = 1;</code>
        */
       public int getSize() {
         return size_;
       }
       /**
-       * <code>optional int32 size = 1;</code>
-       *
        * <pre>
        * Desired payload sizes in responses from the server.
        * If response_type is COMPRESSABLE, this denotes the size before compression.
        * </pre>
+       *
+       * <code>optional int32 size = 1;</code>
        */
       public Builder setSize(int value) {
         
@@ -4882,12 +4882,12 @@
         return this;
       }
       /**
-       * <code>optional int32 size = 1;</code>
-       *
        * <pre>
        * Desired payload sizes in responses from the server.
        * If response_type is COMPRESSABLE, this denotes the size before compression.
        * </pre>
+       *
+       * <code>optional int32 size = 1;</code>
        */
       public Builder clearSize() {
         
@@ -4898,23 +4898,23 @@
 
       private int intervalUs_ ;
       /**
-       * <code>optional int32 interval_us = 2;</code>
-       *
        * <pre>
        * Desired interval between consecutive responses in the response stream in
        * microseconds.
        * </pre>
+       *
+       * <code>optional int32 interval_us = 2;</code>
        */
       public int getIntervalUs() {
         return intervalUs_;
       }
       /**
-       * <code>optional int32 interval_us = 2;</code>
-       *
        * <pre>
        * Desired interval between consecutive responses in the response stream in
        * microseconds.
        * </pre>
+       *
+       * <code>optional int32 interval_us = 2;</code>
        */
       public Builder setIntervalUs(int value) {
         
@@ -4923,12 +4923,12 @@
         return this;
       }
       /**
-       * <code>optional int32 interval_us = 2;</code>
-       *
        * <pre>
        * Desired interval between consecutive responses in the response stream in
        * microseconds.
        * </pre>
+       *
+       * <code>optional int32 interval_us = 2;</code>
        */
       public Builder clearIntervalUs() {
         
@@ -4966,16 +4966,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ResponseParameters(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -4999,145 +4990,145 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, the payload from each response in the stream
      * might be of different types. This is to simulate a mixed type of payload
      * stream.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     int getResponseTypeValue();
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, the payload from each response in the stream
      * might be of different types. This is to simulate a mixed type of payload
      * stream.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     io.grpc.benchmarks.proto.Messages.PayloadType getResponseType();
 
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     java.util.List<io.grpc.benchmarks.proto.Messages.ResponseParameters> 
         getResponseParametersList();
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     io.grpc.benchmarks.proto.Messages.ResponseParameters getResponseParameters(int index);
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     int getResponseParametersCount();
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     java.util.List<? extends io.grpc.benchmarks.proto.Messages.ResponseParametersOrBuilder> 
         getResponseParametersOrBuilderList();
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     io.grpc.benchmarks.proto.Messages.ResponseParametersOrBuilder getResponseParametersOrBuilder(
         int index);
 
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     boolean hasPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     io.grpc.benchmarks.proto.Messages.Payload getPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder();
 
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     int getResponseCompressionValue();
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     io.grpc.benchmarks.proto.Messages.CompressionType getResponseCompression();
 
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     boolean hasResponseStatus();
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     io.grpc.benchmarks.proto.Messages.EchoStatus getResponseStatus();
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     io.grpc.benchmarks.proto.Messages.EchoStatusOrBuilder getResponseStatusOrBuilder();
   }
   /**
-   * Protobuf type {@code grpc.testing.StreamingOutputCallRequest}
-   *
    * <pre>
    * Server-streaming request.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.StreamingOutputCallRequest}
    */
   public  static final class StreamingOutputCallRequest extends
       com.google.protobuf.GeneratedMessage implements
@@ -5160,7 +5151,8 @@
     }
     private StreamingOutputCallRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -5226,11 +5218,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
           responseParameters_ = java.util.Collections.unmodifiableList(responseParameters_);
@@ -5254,82 +5245,82 @@
     public static final int RESPONSE_TYPE_FIELD_NUMBER = 1;
     private int responseType_;
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, the payload from each response in the stream
      * might be of different types. This is to simulate a mixed type of payload
      * stream.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     public int getResponseTypeValue() {
       return responseType_;
     }
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, the payload from each response in the stream
      * might be of different types. This is to simulate a mixed type of payload
      * stream.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     public io.grpc.benchmarks.proto.Messages.PayloadType getResponseType() {
-      io.grpc.benchmarks.proto.Messages.PayloadType result = io.grpc.benchmarks.proto.Messages.PayloadType.valueOf(responseType_);
+      io.grpc.benchmarks.proto.Messages.PayloadType result = io.grpc.benchmarks.proto.Messages.PayloadType.forNumber(responseType_);
       return result == null ? io.grpc.benchmarks.proto.Messages.PayloadType.UNRECOGNIZED : result;
     }
 
     public static final int RESPONSE_PARAMETERS_FIELD_NUMBER = 2;
     private java.util.List<io.grpc.benchmarks.proto.Messages.ResponseParameters> responseParameters_;
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     public java.util.List<io.grpc.benchmarks.proto.Messages.ResponseParameters> getResponseParametersList() {
       return responseParameters_;
     }
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     public java.util.List<? extends io.grpc.benchmarks.proto.Messages.ResponseParametersOrBuilder> 
         getResponseParametersOrBuilderList() {
       return responseParameters_;
     }
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     public int getResponseParametersCount() {
       return responseParameters_.size();
     }
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     public io.grpc.benchmarks.proto.Messages.ResponseParameters getResponseParameters(int index) {
       return responseParameters_.get(index);
     }
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     public io.grpc.benchmarks.proto.Messages.ResponseParametersOrBuilder getResponseParametersOrBuilder(
         int index) {
@@ -5339,31 +5330,31 @@
     public static final int PAYLOAD_FIELD_NUMBER = 3;
     private io.grpc.benchmarks.proto.Messages.Payload payload_;
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     public boolean hasPayload() {
       return payload_ != null;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     public io.grpc.benchmarks.proto.Messages.Payload getPayload() {
       return payload_ == null ? io.grpc.benchmarks.proto.Messages.Payload.getDefaultInstance() : payload_;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     public io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder() {
       return getPayload();
@@ -5372,55 +5363,55 @@
     public static final int RESPONSE_COMPRESSION_FIELD_NUMBER = 6;
     private int responseCompression_;
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     public int getResponseCompressionValue() {
       return responseCompression_;
     }
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     public io.grpc.benchmarks.proto.Messages.CompressionType getResponseCompression() {
-      io.grpc.benchmarks.proto.Messages.CompressionType result = io.grpc.benchmarks.proto.Messages.CompressionType.valueOf(responseCompression_);
+      io.grpc.benchmarks.proto.Messages.CompressionType result = io.grpc.benchmarks.proto.Messages.CompressionType.forNumber(responseCompression_);
       return result == null ? io.grpc.benchmarks.proto.Messages.CompressionType.UNRECOGNIZED : result;
     }
 
     public static final int RESPONSE_STATUS_FIELD_NUMBER = 7;
     private io.grpc.benchmarks.proto.Messages.EchoStatus responseStatus_;
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     public boolean hasResponseStatus() {
       return responseStatus_ != null;
     }
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     public io.grpc.benchmarks.proto.Messages.EchoStatus getResponseStatus() {
       return responseStatus_ == null ? io.grpc.benchmarks.proto.Messages.EchoStatus.getDefaultInstance() : responseStatus_;
     }
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     public io.grpc.benchmarks.proto.Messages.EchoStatusOrBuilder getResponseStatusOrBuilder() {
       return getResponseStatus();
@@ -5508,34 +5499,40 @@
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingOutputCallRequest parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingOutputCallRequest parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingOutputCallRequest parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingOutputCallRequest parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingOutputCallRequest parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingOutputCallRequest parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -5557,11 +5554,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.StreamingOutputCallRequest}
-     *
      * <pre>
      * Server-streaming request.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.StreamingOutputCallRequest}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -5734,7 +5731,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Messages.StreamingOutputCallRequest) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -5746,27 +5743,27 @@
 
       private int responseType_ = 0;
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, the payload from each response in the stream
        * might be of different types. This is to simulate a mixed type of payload
        * stream.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public int getResponseTypeValue() {
         return responseType_;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, the payload from each response in the stream
        * might be of different types. This is to simulate a mixed type of payload
        * stream.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public Builder setResponseTypeValue(int value) {
         responseType_ = value;
@@ -5774,28 +5771,28 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, the payload from each response in the stream
        * might be of different types. This is to simulate a mixed type of payload
        * stream.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public io.grpc.benchmarks.proto.Messages.PayloadType getResponseType() {
-        io.grpc.benchmarks.proto.Messages.PayloadType result = io.grpc.benchmarks.proto.Messages.PayloadType.valueOf(responseType_);
+        io.grpc.benchmarks.proto.Messages.PayloadType result = io.grpc.benchmarks.proto.Messages.PayloadType.forNumber(responseType_);
         return result == null ? io.grpc.benchmarks.proto.Messages.PayloadType.UNRECOGNIZED : result;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, the payload from each response in the stream
        * might be of different types. This is to simulate a mixed type of payload
        * stream.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public Builder setResponseType(io.grpc.benchmarks.proto.Messages.PayloadType value) {
         if (value == null) {
@@ -5807,14 +5804,14 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, the payload from each response in the stream
        * might be of different types. This is to simulate a mixed type of payload
        * stream.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public Builder clearResponseType() {
         
@@ -5836,11 +5833,11 @@
           io.grpc.benchmarks.proto.Messages.ResponseParameters, io.grpc.benchmarks.proto.Messages.ResponseParameters.Builder, io.grpc.benchmarks.proto.Messages.ResponseParametersOrBuilder> responseParametersBuilder_;
 
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public java.util.List<io.grpc.benchmarks.proto.Messages.ResponseParameters> getResponseParametersList() {
         if (responseParametersBuilder_ == null) {
@@ -5850,11 +5847,11 @@
         }
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public int getResponseParametersCount() {
         if (responseParametersBuilder_ == null) {
@@ -5864,11 +5861,11 @@
         }
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public io.grpc.benchmarks.proto.Messages.ResponseParameters getResponseParameters(int index) {
         if (responseParametersBuilder_ == null) {
@@ -5878,11 +5875,11 @@
         }
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder setResponseParameters(
           int index, io.grpc.benchmarks.proto.Messages.ResponseParameters value) {
@@ -5899,11 +5896,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder setResponseParameters(
           int index, io.grpc.benchmarks.proto.Messages.ResponseParameters.Builder builderForValue) {
@@ -5917,11 +5914,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder addResponseParameters(io.grpc.benchmarks.proto.Messages.ResponseParameters value) {
         if (responseParametersBuilder_ == null) {
@@ -5937,11 +5934,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder addResponseParameters(
           int index, io.grpc.benchmarks.proto.Messages.ResponseParameters value) {
@@ -5958,11 +5955,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder addResponseParameters(
           io.grpc.benchmarks.proto.Messages.ResponseParameters.Builder builderForValue) {
@@ -5976,11 +5973,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder addResponseParameters(
           int index, io.grpc.benchmarks.proto.Messages.ResponseParameters.Builder builderForValue) {
@@ -5994,11 +5991,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder addAllResponseParameters(
           java.lang.Iterable<? extends io.grpc.benchmarks.proto.Messages.ResponseParameters> values) {
@@ -6013,11 +6010,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder clearResponseParameters() {
         if (responseParametersBuilder_ == null) {
@@ -6030,11 +6027,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder removeResponseParameters(int index) {
         if (responseParametersBuilder_ == null) {
@@ -6047,22 +6044,22 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public io.grpc.benchmarks.proto.Messages.ResponseParameters.Builder getResponseParametersBuilder(
           int index) {
         return getResponseParametersFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public io.grpc.benchmarks.proto.Messages.ResponseParametersOrBuilder getResponseParametersOrBuilder(
           int index) {
@@ -6072,11 +6069,11 @@
         }
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public java.util.List<? extends io.grpc.benchmarks.proto.Messages.ResponseParametersOrBuilder> 
            getResponseParametersOrBuilderList() {
@@ -6087,22 +6084,22 @@
         }
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public io.grpc.benchmarks.proto.Messages.ResponseParameters.Builder addResponseParametersBuilder() {
         return getResponseParametersFieldBuilder().addBuilder(
             io.grpc.benchmarks.proto.Messages.ResponseParameters.getDefaultInstance());
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public io.grpc.benchmarks.proto.Messages.ResponseParameters.Builder addResponseParametersBuilder(
           int index) {
@@ -6110,11 +6107,11 @@
             index, io.grpc.benchmarks.proto.Messages.ResponseParameters.getDefaultInstance());
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public java.util.List<io.grpc.benchmarks.proto.Messages.ResponseParameters.Builder> 
            getResponseParametersBuilderList() {
@@ -6139,21 +6136,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Messages.Payload, io.grpc.benchmarks.proto.Messages.Payload.Builder, io.grpc.benchmarks.proto.Messages.PayloadOrBuilder> payloadBuilder_;
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public boolean hasPayload() {
         return payloadBuilder_ != null || payload_ != null;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public io.grpc.benchmarks.proto.Messages.Payload getPayload() {
         if (payloadBuilder_ == null) {
@@ -6163,11 +6160,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder setPayload(io.grpc.benchmarks.proto.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -6183,11 +6180,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder setPayload(
           io.grpc.benchmarks.proto.Messages.Payload.Builder builderForValue) {
@@ -6201,11 +6198,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder mergePayload(io.grpc.benchmarks.proto.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -6223,11 +6220,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder clearPayload() {
         if (payloadBuilder_ == null) {
@@ -6241,11 +6238,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public io.grpc.benchmarks.proto.Messages.Payload.Builder getPayloadBuilder() {
         
@@ -6253,11 +6250,11 @@
         return getPayloadFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder() {
         if (payloadBuilder_ != null) {
@@ -6268,11 +6265,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Messages.Payload, io.grpc.benchmarks.proto.Messages.Payload.Builder, io.grpc.benchmarks.proto.Messages.PayloadOrBuilder> 
@@ -6290,21 +6287,21 @@
 
       private int responseCompression_ = 0;
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public int getResponseCompressionValue() {
         return responseCompression_;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public Builder setResponseCompressionValue(int value) {
         responseCompression_ = value;
@@ -6312,22 +6309,22 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public io.grpc.benchmarks.proto.Messages.CompressionType getResponseCompression() {
-        io.grpc.benchmarks.proto.Messages.CompressionType result = io.grpc.benchmarks.proto.Messages.CompressionType.valueOf(responseCompression_);
+        io.grpc.benchmarks.proto.Messages.CompressionType result = io.grpc.benchmarks.proto.Messages.CompressionType.forNumber(responseCompression_);
         return result == null ? io.grpc.benchmarks.proto.Messages.CompressionType.UNRECOGNIZED : result;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public Builder setResponseCompression(io.grpc.benchmarks.proto.Messages.CompressionType value) {
         if (value == null) {
@@ -6339,11 +6336,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public Builder clearResponseCompression() {
         
@@ -6356,21 +6353,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Messages.EchoStatus, io.grpc.benchmarks.proto.Messages.EchoStatus.Builder, io.grpc.benchmarks.proto.Messages.EchoStatusOrBuilder> responseStatusBuilder_;
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public boolean hasResponseStatus() {
         return responseStatusBuilder_ != null || responseStatus_ != null;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public io.grpc.benchmarks.proto.Messages.EchoStatus getResponseStatus() {
         if (responseStatusBuilder_ == null) {
@@ -6380,11 +6377,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder setResponseStatus(io.grpc.benchmarks.proto.Messages.EchoStatus value) {
         if (responseStatusBuilder_ == null) {
@@ -6400,11 +6397,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder setResponseStatus(
           io.grpc.benchmarks.proto.Messages.EchoStatus.Builder builderForValue) {
@@ -6418,11 +6415,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder mergeResponseStatus(io.grpc.benchmarks.proto.Messages.EchoStatus value) {
         if (responseStatusBuilder_ == null) {
@@ -6440,11 +6437,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder clearResponseStatus() {
         if (responseStatusBuilder_ == null) {
@@ -6458,11 +6455,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public io.grpc.benchmarks.proto.Messages.EchoStatus.Builder getResponseStatusBuilder() {
         
@@ -6470,11 +6467,11 @@
         return getResponseStatusFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public io.grpc.benchmarks.proto.Messages.EchoStatusOrBuilder getResponseStatusOrBuilder() {
         if (responseStatusBuilder_ != null) {
@@ -6485,11 +6482,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Messages.EchoStatus, io.grpc.benchmarks.proto.Messages.EchoStatus.Builder, io.grpc.benchmarks.proto.Messages.EchoStatusOrBuilder> 
@@ -6534,16 +6531,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new StreamingOutputCallRequest(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -6567,36 +6555,36 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase response size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     boolean hasPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase response size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     io.grpc.benchmarks.proto.Messages.Payload getPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase response size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder();
   }
   /**
-   * Protobuf type {@code grpc.testing.StreamingOutputCallResponse}
-   *
    * <pre>
    * Server-streaming response, as configured by the request and parameters.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.StreamingOutputCallResponse}
    */
   public  static final class StreamingOutputCallResponse extends
       com.google.protobuf.GeneratedMessage implements
@@ -6616,7 +6604,8 @@
     }
     private StreamingOutputCallResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -6649,11 +6638,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -6673,31 +6661,31 @@
     public static final int PAYLOAD_FIELD_NUMBER = 1;
     private io.grpc.benchmarks.proto.Messages.Payload payload_;
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase response size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public boolean hasPayload() {
       return payload_ != null;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase response size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public io.grpc.benchmarks.proto.Messages.Payload getPayload() {
       return payload_ == null ? io.grpc.benchmarks.proto.Messages.Payload.getDefaultInstance() : payload_;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase response size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder() {
       return getPayload();
@@ -6757,34 +6745,40 @@
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingOutputCallResponse parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingOutputCallResponse parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingOutputCallResponse parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingOutputCallResponse parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingOutputCallResponse parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.StreamingOutputCallResponse parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -6806,11 +6800,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.StreamingOutputCallResponse}
-     *
      * <pre>
      * Server-streaming response, as configured by the request and parameters.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.StreamingOutputCallResponse}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -6912,7 +6906,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Messages.StreamingOutputCallResponse) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -6925,21 +6919,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Messages.Payload, io.grpc.benchmarks.proto.Messages.Payload.Builder, io.grpc.benchmarks.proto.Messages.PayloadOrBuilder> payloadBuilder_;
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public boolean hasPayload() {
         return payloadBuilder_ != null || payload_ != null;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.benchmarks.proto.Messages.Payload getPayload() {
         if (payloadBuilder_ == null) {
@@ -6949,11 +6943,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder setPayload(io.grpc.benchmarks.proto.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -6969,11 +6963,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder setPayload(
           io.grpc.benchmarks.proto.Messages.Payload.Builder builderForValue) {
@@ -6987,11 +6981,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder mergePayload(io.grpc.benchmarks.proto.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -7009,11 +7003,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder clearPayload() {
         if (payloadBuilder_ == null) {
@@ -7027,11 +7021,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.benchmarks.proto.Messages.Payload.Builder getPayloadBuilder() {
         
@@ -7039,11 +7033,11 @@
         return getPayloadFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.benchmarks.proto.Messages.PayloadOrBuilder getPayloadOrBuilder() {
         if (payloadBuilder_ != null) {
@@ -7054,11 +7048,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Messages.Payload, io.grpc.benchmarks.proto.Messages.Payload.Builder, io.grpc.benchmarks.proto.Messages.PayloadOrBuilder> 
@@ -7103,16 +7097,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new StreamingOutputCallResponse(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -7154,13 +7139,13 @@
     int getBackoffMs(int index);
   }
   /**
-   * Protobuf type {@code grpc.testing.ReconnectInfo}
-   *
    * <pre>
    * For reconnect interop test only.
    * Server tells client whether its reconnects are following the spec and the
    * reconnect backoffs it saw.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.ReconnectInfo}
    */
   public  static final class ReconnectInfo extends
       com.google.protobuf.GeneratedMessage implements
@@ -7182,7 +7167,8 @@
     }
     private ReconnectInfo(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -7228,11 +7214,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
           backoffMs_ = java.util.Collections.unmodifiableList(backoffMs_);
@@ -7361,34 +7346,40 @@
     }
     public static io.grpc.benchmarks.proto.Messages.ReconnectInfo parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.ReconnectInfo parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.ReconnectInfo parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.ReconnectInfo parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Messages.ReconnectInfo parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Messages.ReconnectInfo parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -7410,13 +7401,13 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.ReconnectInfo}
-     *
      * <pre>
      * For reconnect interop test only.
      * Server tells client whether its reconnects are following the spec and the
      * reconnect backoffs it saw.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.ReconnectInfo}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -7530,7 +7521,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Messages.ReconnectInfo) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -7661,16 +7652,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ReconnectInfo(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -7689,54 +7671,54 @@
 
   }
 
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_Payload_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_Payload_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_EchoStatus_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_EchoStatus_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_SimpleRequest_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_SimpleRequest_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_SimpleResponse_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_SimpleResponse_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_StreamingInputCallRequest_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_StreamingInputCallRequest_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_StreamingInputCallResponse_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_StreamingInputCallResponse_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ResponseParameters_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ResponseParameters_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_StreamingOutputCallRequest_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_StreamingOutputCallRequest_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_StreamingOutputCallResponse_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_StreamingOutputCallResponse_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ReconnectInfo_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ReconnectInfo_fieldAccessorTable;
 
@@ -7744,7 +7726,7 @@
       getDescriptor() {
     return descriptor;
   }
-  private static com.google.protobuf.Descriptors.FileDescriptor
+  private static  com.google.protobuf.Descriptors.FileDescriptor
       descriptor;
   static {
     java.lang.String[] descriptorData = {
diff --git a/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Payloads.java b/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Payloads.java
index 87deeb4..e351346 100644
--- a/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Payloads.java
+++ b/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Payloads.java
@@ -45,7 +45,8 @@
     }
     private ByteBufferParams(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -75,11 +76,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -175,34 +175,40 @@
     }
     public static io.grpc.benchmarks.proto.Payloads.ByteBufferParams parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Payloads.ByteBufferParams parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Payloads.ByteBufferParams parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Payloads.ByteBufferParams parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Payloads.ByteBufferParams parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Payloads.ByteBufferParams parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -324,7 +330,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Payloads.ByteBufferParams) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -414,16 +420,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ByteBufferParams(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -479,7 +476,8 @@
     }
     private SimpleProtoParams(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -509,11 +507,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -609,34 +606,40 @@
     }
     public static io.grpc.benchmarks.proto.Payloads.SimpleProtoParams parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Payloads.SimpleProtoParams parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Payloads.SimpleProtoParams parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Payloads.SimpleProtoParams parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Payloads.SimpleProtoParams parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Payloads.SimpleProtoParams parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -758,7 +761,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Payloads.SimpleProtoParams) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -848,16 +851,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new SimpleProtoParams(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -881,12 +875,12 @@
       com.google.protobuf.MessageOrBuilder {
   }
   /**
-   * Protobuf type {@code grpc.testing.ComplexProtoParams}
-   *
    * <pre>
    * TODO (vpai): Fill this in once the details of complex, representative
    *              protos are decided
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.ComplexProtoParams}
    */
   public  static final class ComplexProtoParams extends
       com.google.protobuf.GeneratedMessage implements
@@ -906,7 +900,8 @@
     }
     private ComplexProtoParams(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       try {
         boolean done = false;
@@ -925,11 +920,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -993,34 +987,40 @@
     }
     public static io.grpc.benchmarks.proto.Payloads.ComplexProtoParams parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Payloads.ComplexProtoParams parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Payloads.ComplexProtoParams parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Payloads.ComplexProtoParams parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Payloads.ComplexProtoParams parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Payloads.ComplexProtoParams parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -1042,12 +1042,12 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.ComplexProtoParams}
-     *
      * <pre>
      * TODO (vpai): Fill this in once the details of complex, representative
      *              protos are decided
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.ComplexProtoParams}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -1135,7 +1135,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Payloads.ComplexProtoParams) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -1173,16 +1173,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ComplexProtoParams(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -1255,7 +1246,8 @@
     }
     private PayloadConfig(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -1317,11 +1309,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -1346,18 +1337,25 @@
       SIMPLE_PARAMS(2),
       COMPLEX_PARAMS(3),
       PAYLOAD_NOT_SET(0);
-      private int value = 0;
+      private final int value;
       private PayloadCase(int value) {
         this.value = value;
       }
+      /**
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
       public static PayloadCase valueOf(int value) {
+        return forNumber(value);
+      }
+
+      public static PayloadCase forNumber(int value) {
         switch (value) {
           case 1: return BYTEBUF_PARAMS;
           case 2: return SIMPLE_PARAMS;
           case 3: return COMPLEX_PARAMS;
           case 0: return PAYLOAD_NOT_SET;
-          default: throw new java.lang.IllegalArgumentException(
-            "Value is undefined for this oneof enum.");
+          default: return null;
         }
       }
       public int getNumber() {
@@ -1367,7 +1365,7 @@
 
     public PayloadCase
     getPayloadCase() {
-      return PayloadCase.valueOf(
+      return PayloadCase.forNumber(
           payloadCase_);
     }
 
@@ -1499,34 +1497,40 @@
     }
     public static io.grpc.benchmarks.proto.Payloads.PayloadConfig parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Payloads.PayloadConfig parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Payloads.PayloadConfig parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Payloads.PayloadConfig parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Payloads.PayloadConfig parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Payloads.PayloadConfig parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -1677,7 +1681,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Payloads.PayloadConfig) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -1689,7 +1693,7 @@
       private java.lang.Object payload_;
       public PayloadCase
           getPayloadCase() {
-        return PayloadCase.valueOf(
+        return PayloadCase.forNumber(
             payloadCase_);
       }
 
@@ -2120,16 +2124,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new PayloadConfig(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -2148,24 +2143,24 @@
 
   }
 
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ByteBufferParams_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ByteBufferParams_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_SimpleProtoParams_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_SimpleProtoParams_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ComplexProtoParams_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ComplexProtoParams_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_PayloadConfig_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_PayloadConfig_fieldAccessorTable;
 
@@ -2173,7 +2168,7 @@
       getDescriptor() {
     return descriptor;
   }
-  private static com.google.protobuf.Descriptors.FileDescriptor
+  private static  com.google.protobuf.Descriptors.FileDescriptor
       descriptor;
   static {
     java.lang.String[] descriptorData = {
diff --git a/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Services.java b/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Services.java
index 8a9298a..6f24cf2 100644
--- a/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Services.java
+++ b/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Services.java
@@ -13,7 +13,7 @@
       getDescriptor() {
     return descriptor;
   }
-  private static com.google.protobuf.Descriptors.FileDescriptor
+  private static  com.google.protobuf.Descriptors.FileDescriptor
       descriptor;
   static {
     java.lang.String[] descriptorData = {
diff --git a/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Stats.java b/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Stats.java
index 98b7324..18fd5bf 100644
--- a/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Stats.java
+++ b/benchmarks/src/generated/main/java/io/grpc/benchmarks/proto/Stats.java
@@ -13,30 +13,30 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional double time_elapsed = 1;</code>
-     *
      * <pre>
      * wall clock time change in seconds since last reset
      * </pre>
+     *
+     * <code>optional double time_elapsed = 1;</code>
      */
     double getTimeElapsed();
 
     /**
-     * <code>optional double time_user = 2;</code>
-     *
      * <pre>
      * change in user time (in seconds) used by the server since last reset
      * </pre>
+     *
+     * <code>optional double time_user = 2;</code>
      */
     double getTimeUser();
 
     /**
-     * <code>optional double time_system = 3;</code>
-     *
      * <pre>
      * change in server time (in seconds) used by the server process and all
      * threads since last reset
      * </pre>
+     *
+     * <code>optional double time_system = 3;</code>
      */
     double getTimeSystem();
   }
@@ -64,7 +64,8 @@
     }
     private ServerStats(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -99,11 +100,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -123,11 +123,11 @@
     public static final int TIME_ELAPSED_FIELD_NUMBER = 1;
     private double timeElapsed_;
     /**
-     * <code>optional double time_elapsed = 1;</code>
-     *
      * <pre>
      * wall clock time change in seconds since last reset
      * </pre>
+     *
+     * <code>optional double time_elapsed = 1;</code>
      */
     public double getTimeElapsed() {
       return timeElapsed_;
@@ -136,11 +136,11 @@
     public static final int TIME_USER_FIELD_NUMBER = 2;
     private double timeUser_;
     /**
-     * <code>optional double time_user = 2;</code>
-     *
      * <pre>
      * change in user time (in seconds) used by the server since last reset
      * </pre>
+     *
+     * <code>optional double time_user = 2;</code>
      */
     public double getTimeUser() {
       return timeUser_;
@@ -149,12 +149,12 @@
     public static final int TIME_SYSTEM_FIELD_NUMBER = 3;
     private double timeSystem_;
     /**
-     * <code>optional double time_system = 3;</code>
-     *
      * <pre>
      * change in server time (in seconds) used by the server process and all
      * threads since last reset
      * </pre>
+     *
+     * <code>optional double time_system = 3;</code>
      */
     public double getTimeSystem() {
       return timeSystem_;
@@ -228,34 +228,40 @@
     }
     public static io.grpc.benchmarks.proto.Stats.ServerStats parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Stats.ServerStats parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Stats.ServerStats parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Stats.ServerStats parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Stats.ServerStats parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Stats.ServerStats parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -383,7 +389,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Stats.ServerStats) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -394,21 +400,21 @@
 
       private double timeElapsed_ ;
       /**
-       * <code>optional double time_elapsed = 1;</code>
-       *
        * <pre>
        * wall clock time change in seconds since last reset
        * </pre>
+       *
+       * <code>optional double time_elapsed = 1;</code>
        */
       public double getTimeElapsed() {
         return timeElapsed_;
       }
       /**
-       * <code>optional double time_elapsed = 1;</code>
-       *
        * <pre>
        * wall clock time change in seconds since last reset
        * </pre>
+       *
+       * <code>optional double time_elapsed = 1;</code>
        */
       public Builder setTimeElapsed(double value) {
         
@@ -417,11 +423,11 @@
         return this;
       }
       /**
-       * <code>optional double time_elapsed = 1;</code>
-       *
        * <pre>
        * wall clock time change in seconds since last reset
        * </pre>
+       *
+       * <code>optional double time_elapsed = 1;</code>
        */
       public Builder clearTimeElapsed() {
         
@@ -432,21 +438,21 @@
 
       private double timeUser_ ;
       /**
-       * <code>optional double time_user = 2;</code>
-       *
        * <pre>
        * change in user time (in seconds) used by the server since last reset
        * </pre>
+       *
+       * <code>optional double time_user = 2;</code>
        */
       public double getTimeUser() {
         return timeUser_;
       }
       /**
-       * <code>optional double time_user = 2;</code>
-       *
        * <pre>
        * change in user time (in seconds) used by the server since last reset
        * </pre>
+       *
+       * <code>optional double time_user = 2;</code>
        */
       public Builder setTimeUser(double value) {
         
@@ -455,11 +461,11 @@
         return this;
       }
       /**
-       * <code>optional double time_user = 2;</code>
-       *
        * <pre>
        * change in user time (in seconds) used by the server since last reset
        * </pre>
+       *
+       * <code>optional double time_user = 2;</code>
        */
       public Builder clearTimeUser() {
         
@@ -470,23 +476,23 @@
 
       private double timeSystem_ ;
       /**
-       * <code>optional double time_system = 3;</code>
-       *
        * <pre>
        * change in server time (in seconds) used by the server process and all
        * threads since last reset
        * </pre>
+       *
+       * <code>optional double time_system = 3;</code>
        */
       public double getTimeSystem() {
         return timeSystem_;
       }
       /**
-       * <code>optional double time_system = 3;</code>
-       *
        * <pre>
        * change in server time (in seconds) used by the server process and all
        * threads since last reset
        * </pre>
+       *
+       * <code>optional double time_system = 3;</code>
        */
       public Builder setTimeSystem(double value) {
         
@@ -495,12 +501,12 @@
         return this;
       }
       /**
-       * <code>optional double time_system = 3;</code>
-       *
        * <pre>
        * change in server time (in seconds) used by the server process and all
        * threads since last reset
        * </pre>
+       *
+       * <code>optional double time_system = 3;</code>
        */
       public Builder clearTimeSystem() {
         
@@ -538,16 +544,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ServerStats(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -571,29 +568,29 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional double resolution = 1;</code>
-     *
      * <pre>
      * first bucket is [0, 1 + resolution)
      * </pre>
+     *
+     * <code>optional double resolution = 1;</code>
      */
     double getResolution();
 
     /**
-     * <code>optional double max_possible = 2;</code>
-     *
      * <pre>
      * use enough buckets to allow this value
      * </pre>
+     *
+     * <code>optional double max_possible = 2;</code>
      */
     double getMaxPossible();
   }
   /**
-   * Protobuf type {@code grpc.testing.HistogramParams}
-   *
    * <pre>
    * Histogram params based on grpc/support/histogram.c
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.HistogramParams}
    */
   public  static final class HistogramParams extends
       com.google.protobuf.GeneratedMessage implements
@@ -615,7 +612,8 @@
     }
     private HistogramParams(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -645,11 +643,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -669,11 +666,11 @@
     public static final int RESOLUTION_FIELD_NUMBER = 1;
     private double resolution_;
     /**
-     * <code>optional double resolution = 1;</code>
-     *
      * <pre>
      * first bucket is [0, 1 + resolution)
      * </pre>
+     *
+     * <code>optional double resolution = 1;</code>
      */
     public double getResolution() {
       return resolution_;
@@ -682,11 +679,11 @@
     public static final int MAX_POSSIBLE_FIELD_NUMBER = 2;
     private double maxPossible_;
     /**
-     * <code>optional double max_possible = 2;</code>
-     *
      * <pre>
      * use enough buckets to allow this value
      * </pre>
+     *
+     * <code>optional double max_possible = 2;</code>
      */
     public double getMaxPossible() {
       return maxPossible_;
@@ -753,34 +750,40 @@
     }
     public static io.grpc.benchmarks.proto.Stats.HistogramParams parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Stats.HistogramParams parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Stats.HistogramParams parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Stats.HistogramParams parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Stats.HistogramParams parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Stats.HistogramParams parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -802,11 +805,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.HistogramParams}
-     *
      * <pre>
      * Histogram params based on grpc/support/histogram.c
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.HistogramParams}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -906,7 +909,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Stats.HistogramParams) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -917,21 +920,21 @@
 
       private double resolution_ ;
       /**
-       * <code>optional double resolution = 1;</code>
-       *
        * <pre>
        * first bucket is [0, 1 + resolution)
        * </pre>
+       *
+       * <code>optional double resolution = 1;</code>
        */
       public double getResolution() {
         return resolution_;
       }
       /**
-       * <code>optional double resolution = 1;</code>
-       *
        * <pre>
        * first bucket is [0, 1 + resolution)
        * </pre>
+       *
+       * <code>optional double resolution = 1;</code>
        */
       public Builder setResolution(double value) {
         
@@ -940,11 +943,11 @@
         return this;
       }
       /**
-       * <code>optional double resolution = 1;</code>
-       *
        * <pre>
        * first bucket is [0, 1 + resolution)
        * </pre>
+       *
+       * <code>optional double resolution = 1;</code>
        */
       public Builder clearResolution() {
         
@@ -955,21 +958,21 @@
 
       private double maxPossible_ ;
       /**
-       * <code>optional double max_possible = 2;</code>
-       *
        * <pre>
        * use enough buckets to allow this value
        * </pre>
+       *
+       * <code>optional double max_possible = 2;</code>
        */
       public double getMaxPossible() {
         return maxPossible_;
       }
       /**
-       * <code>optional double max_possible = 2;</code>
-       *
        * <pre>
        * use enough buckets to allow this value
        * </pre>
+       *
+       * <code>optional double max_possible = 2;</code>
        */
       public Builder setMaxPossible(double value) {
         
@@ -978,11 +981,11 @@
         return this;
       }
       /**
-       * <code>optional double max_possible = 2;</code>
-       *
        * <pre>
        * use enough buckets to allow this value
        * </pre>
+       *
+       * <code>optional double max_possible = 2;</code>
        */
       public Builder clearMaxPossible() {
         
@@ -1020,16 +1023,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new HistogramParams(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -1091,11 +1085,11 @@
     double getCount();
   }
   /**
-   * Protobuf type {@code grpc.testing.HistogramData}
-   *
    * <pre>
    * Histogram data based on grpc/support/histogram.c
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.HistogramData}
    */
   public  static final class HistogramData extends
       com.google.protobuf.GeneratedMessage implements
@@ -1121,7 +1115,8 @@
     }
     private HistogramData(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -1187,11 +1182,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
           bucket_ = java.util.Collections.unmodifiableList(bucket_);
@@ -1384,34 +1378,40 @@
     }
     public static io.grpc.benchmarks.proto.Stats.HistogramData parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Stats.HistogramData parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Stats.HistogramData parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Stats.HistogramData parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Stats.HistogramData parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Stats.HistogramData parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -1433,11 +1433,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.HistogramData}
-     *
      * <pre>
      * Histogram data based on grpc/support/histogram.c
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.HistogramData}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -1575,7 +1575,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Stats.HistogramData) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -1810,16 +1810,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new HistogramData(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -1843,36 +1834,36 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-     *
      * <pre>
      * Latency histogram. Data points are in nanoseconds.
      * </pre>
+     *
+     * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
      */
     boolean hasLatencies();
     /**
-     * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-     *
      * <pre>
      * Latency histogram. Data points are in nanoseconds.
      * </pre>
+     *
+     * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
      */
     io.grpc.benchmarks.proto.Stats.HistogramData getLatencies();
     /**
-     * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-     *
      * <pre>
      * Latency histogram. Data points are in nanoseconds.
      * </pre>
+     *
+     * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
      */
     io.grpc.benchmarks.proto.Stats.HistogramDataOrBuilder getLatenciesOrBuilder();
 
     /**
-     * <code>optional double time_elapsed = 2;</code>
-     *
      * <pre>
      * See ServerStats for details.
      * </pre>
+     *
+     * <code>optional double time_elapsed = 2;</code>
      */
     double getTimeElapsed();
 
@@ -1910,7 +1901,8 @@
     }
     private ClientStats(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -1958,11 +1950,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -1982,31 +1973,31 @@
     public static final int LATENCIES_FIELD_NUMBER = 1;
     private io.grpc.benchmarks.proto.Stats.HistogramData latencies_;
     /**
-     * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-     *
      * <pre>
      * Latency histogram. Data points are in nanoseconds.
      * </pre>
+     *
+     * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
      */
     public boolean hasLatencies() {
       return latencies_ != null;
     }
     /**
-     * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-     *
      * <pre>
      * Latency histogram. Data points are in nanoseconds.
      * </pre>
+     *
+     * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
      */
     public io.grpc.benchmarks.proto.Stats.HistogramData getLatencies() {
       return latencies_ == null ? io.grpc.benchmarks.proto.Stats.HistogramData.getDefaultInstance() : latencies_;
     }
     /**
-     * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-     *
      * <pre>
      * Latency histogram. Data points are in nanoseconds.
      * </pre>
+     *
+     * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
      */
     public io.grpc.benchmarks.proto.Stats.HistogramDataOrBuilder getLatenciesOrBuilder() {
       return getLatencies();
@@ -2015,11 +2006,11 @@
     public static final int TIME_ELAPSED_FIELD_NUMBER = 2;
     private double timeElapsed_;
     /**
-     * <code>optional double time_elapsed = 2;</code>
-     *
      * <pre>
      * See ServerStats for details.
      * </pre>
+     *
+     * <code>optional double time_elapsed = 2;</code>
      */
     public double getTimeElapsed() {
       return timeElapsed_;
@@ -2118,34 +2109,40 @@
     }
     public static io.grpc.benchmarks.proto.Stats.ClientStats parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Stats.ClientStats parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Stats.ClientStats parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Stats.ClientStats parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.benchmarks.proto.Stats.ClientStats parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.benchmarks.proto.Stats.ClientStats parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -2287,7 +2284,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.benchmarks.proto.Stats.ClientStats) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -2300,21 +2297,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Stats.HistogramData, io.grpc.benchmarks.proto.Stats.HistogramData.Builder, io.grpc.benchmarks.proto.Stats.HistogramDataOrBuilder> latenciesBuilder_;
       /**
-       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-       *
        * <pre>
        * Latency histogram. Data points are in nanoseconds.
        * </pre>
+       *
+       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
        */
       public boolean hasLatencies() {
         return latenciesBuilder_ != null || latencies_ != null;
       }
       /**
-       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-       *
        * <pre>
        * Latency histogram. Data points are in nanoseconds.
        * </pre>
+       *
+       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
        */
       public io.grpc.benchmarks.proto.Stats.HistogramData getLatencies() {
         if (latenciesBuilder_ == null) {
@@ -2324,11 +2321,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-       *
        * <pre>
        * Latency histogram. Data points are in nanoseconds.
        * </pre>
+       *
+       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
        */
       public Builder setLatencies(io.grpc.benchmarks.proto.Stats.HistogramData value) {
         if (latenciesBuilder_ == null) {
@@ -2344,11 +2341,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-       *
        * <pre>
        * Latency histogram. Data points are in nanoseconds.
        * </pre>
+       *
+       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
        */
       public Builder setLatencies(
           io.grpc.benchmarks.proto.Stats.HistogramData.Builder builderForValue) {
@@ -2362,11 +2359,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-       *
        * <pre>
        * Latency histogram. Data points are in nanoseconds.
        * </pre>
+       *
+       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
        */
       public Builder mergeLatencies(io.grpc.benchmarks.proto.Stats.HistogramData value) {
         if (latenciesBuilder_ == null) {
@@ -2384,11 +2381,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-       *
        * <pre>
        * Latency histogram. Data points are in nanoseconds.
        * </pre>
+       *
+       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
        */
       public Builder clearLatencies() {
         if (latenciesBuilder_ == null) {
@@ -2402,11 +2399,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-       *
        * <pre>
        * Latency histogram. Data points are in nanoseconds.
        * </pre>
+       *
+       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
        */
       public io.grpc.benchmarks.proto.Stats.HistogramData.Builder getLatenciesBuilder() {
         
@@ -2414,11 +2411,11 @@
         return getLatenciesFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-       *
        * <pre>
        * Latency histogram. Data points are in nanoseconds.
        * </pre>
+       *
+       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
        */
       public io.grpc.benchmarks.proto.Stats.HistogramDataOrBuilder getLatenciesOrBuilder() {
         if (latenciesBuilder_ != null) {
@@ -2429,11 +2426,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
-       *
        * <pre>
        * Latency histogram. Data points are in nanoseconds.
        * </pre>
+       *
+       * <code>optional .grpc.testing.HistogramData latencies = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.benchmarks.proto.Stats.HistogramData, io.grpc.benchmarks.proto.Stats.HistogramData.Builder, io.grpc.benchmarks.proto.Stats.HistogramDataOrBuilder> 
@@ -2451,21 +2448,21 @@
 
       private double timeElapsed_ ;
       /**
-       * <code>optional double time_elapsed = 2;</code>
-       *
        * <pre>
        * See ServerStats for details.
        * </pre>
+       *
+       * <code>optional double time_elapsed = 2;</code>
        */
       public double getTimeElapsed() {
         return timeElapsed_;
       }
       /**
-       * <code>optional double time_elapsed = 2;</code>
-       *
        * <pre>
        * See ServerStats for details.
        * </pre>
+       *
+       * <code>optional double time_elapsed = 2;</code>
        */
       public Builder setTimeElapsed(double value) {
         
@@ -2474,11 +2471,11 @@
         return this;
       }
       /**
-       * <code>optional double time_elapsed = 2;</code>
-       *
        * <pre>
        * See ServerStats for details.
        * </pre>
+       *
+       * <code>optional double time_elapsed = 2;</code>
        */
       public Builder clearTimeElapsed() {
         
@@ -2568,16 +2565,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ClientStats(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -2596,24 +2584,24 @@
 
   }
 
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ServerStats_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ServerStats_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_HistogramParams_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_HistogramParams_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_HistogramData_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_HistogramData_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ClientStats_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ClientStats_fieldAccessorTable;
 
@@ -2621,7 +2609,7 @@
       getDescriptor() {
     return descriptor;
   }
-  private static com.google.protobuf.Descriptors.FileDescriptor
+  private static  com.google.protobuf.Descriptors.FileDescriptor
       descriptor;
   static {
     java.lang.String[] descriptorData = {
diff --git a/build.gradle b/build.gradle
index 62af69b..861bb33 100644
--- a/build.gradle
+++ b/build.gradle
@@ -59,7 +59,7 @@
         javaPluginPath = "$rootDir/compiler/build/exe/java_plugin/$protocPluginBaseName$exeSuffix"
 
         guavaVersion = '19.0'
-        protobufVersion = '3.0.0-beta-2'
+        protobufVersion = '3.0.0-beta-3'
         protobufNanoVersion = '3.0.0-alpha-5'
 
         configureProtoCompilation = {
@@ -123,6 +123,11 @@
               }
             }
           }
+
+          compileJava {
+            // Protobuf-generated code produces some warnings.
+            options.compilerArgs = compileJava.options.compilerArgs + ["-Xlint:-deprecation"]
+          }
         }
 
         def epoll_suffix = "";
diff --git a/buildscripts/jenkins-pre.bat b/buildscripts/jenkins-pre.bat
index f0e6785..229b4e4 100644
--- a/buildscripts/jenkins-pre.bat
+++ b/buildscripts/jenkins-pre.bat
@@ -13,5 +13,5 @@
 set ESCWORKSPACE=%WORKSPACE:\=\\%
 
 echo targetArch=x86_32> gradle.properties
-echo vcProtobufLibs=%ESCWORKSPACE%\\grpc-java-helper\\protobuf-3.0.0-beta-2\\cmake\\build\\Release>> gradle.properties
-echo vcProtobufInclude=%ESCWORKSPACE%\\grpc-java-helper\\protobuf-3.0.0-beta-2\\cmake\\build\\include>> gradle.properties
+echo vcProtobufLibs=%ESCWORKSPACE%\\grpc-java-helper\\protobuf-3.0.0-beta-3\\cmake\\build\\Release>> gradle.properties
+echo vcProtobufInclude=%ESCWORKSPACE%\\grpc-java-helper\\protobuf-3.0.0-beta-3\\cmake\\build\\include>> gradle.properties
diff --git a/buildscripts/make_dependencies.bat b/buildscripts/make_dependencies.bat
index e907ca9..93ff3fc 100644
--- a/buildscripts/make_dependencies.bat
+++ b/buildscripts/make_dependencies.bat
@@ -4,7 +4,7 @@
 REM Prerequisite:
 REM   7za.exe in current directory or PATH
 
-set PROTOBUF_VER=3.0.0-beta-2
+set PROTOBUF_VER=3.0.0-beta-3
 set CMAKE_NAME=cmake-3.3.2-win32-x86
 
 if not exist "protobuf-%PROTOBUF_VER%\cmake\build\Release\" (
@@ -25,7 +25,7 @@
 powershell -command "& { iwr https://github.com/google/protobuf/archive/v%PROTOBUF_VER%.zip -OutFile protobuf.zip }"
 7za X protobuf.zip
 del protobuf.zip
-pushd protobuf-3.0.0-beta-2\cmake
+pushd protobuf-3.0.0-beta-3\cmake
 mkdir build
 cd build
 cmake -Dprotobuf_BUILD_TESTS=OFF ..
diff --git a/compiler/Dockerfile b/compiler/Dockerfile
index e25f285..a51aaca 100644
--- a/compiler/Dockerfile
+++ b/compiler/Dockerfile
@@ -2,7 +2,7 @@
 
 RUN scl enable devtoolset-1.1 'bash -c "cd /protobuf && \
     git fetch && \
-    git checkout v3.0.0-beta-2 && \
+    git checkout v3.0.0-beta-3 && \
     ./autogen.sh && \
     CXXFLAGS=-m32 ./configure --disable-shared --prefix=/protobuf-32 && \
     make clean && make -j$(nproc) && make -j$(nproc) install"'
diff --git a/compiler/README.md b/compiler/README.md
index d09a70b..2cd1aee 100644
--- a/compiler/README.md
+++ b/compiler/README.md
@@ -13,7 +13,7 @@
 
 * Linux, Mac OS X with Clang, or Windows with MSYS2
 * Java 7 or up
-* [Protobuf](https://github.com/google/protobuf) 3.0.0-beta-2 or up
+* [Protobuf](https://github.com/google/protobuf) 3.0.0-beta-3 or up
 
 ## Compiling and testing the codegen
 Change to the `compiler` directory:
@@ -37,6 +37,11 @@
 $ protoc --plugin=protoc-gen-grpc-java=build/binaries/java_pluginExecutable/protoc-gen-grpc-java \
   --grpc-java_out="$OUTPUT_FILE" --proto_path="$DIR_OF_PROTO_FILE" "$PROTO_FILE"
 ```
+To generate Java interfaces with protobuf lite:
+```
+$ protoc --plugin=protoc-gen-grpc-java=build/binaries/java_pluginExecutable/protoc-gen-grpc-java \
+  --grpc-java_out=lite:"$OUTPUT_FILE" --proto_path="$DIR_OF_PROTO_FILE" "$PROTO_FILE"
+```
 To generate Java interfaces with protobuf nano:
 ```
 $ protoc --plugin=protoc-gen-grpc-java=build/binaries/java_pluginExecutable/protoc-gen-grpc-java \
diff --git a/compiler/build.gradle b/compiler/build.gradle
index c9b7c56..e368c36 100644
--- a/compiler/build.gradle
+++ b/compiler/build.gradle
@@ -125,7 +125,11 @@
 }
 
 sourceSets {
-  testLite {}
+  testLite {
+    proto {
+      setSrcDirs(['src/test/proto'])
+    }
+  }
   testNano {
     proto {
       setSrcDirs(['src/test/proto'])
@@ -136,7 +140,7 @@
 compileTestLiteJava {
   // Protobuf-generated Lite produces quite a few warnings.
   options.compilerArgs = compileTestJava.options.compilerArgs +
-      ["-Xlint:-unchecked", "-Xlint:-rawtypes"]
+      ["-Xlint:-unchecked", "-Xlint:-rawtypes", "-Xlint:-fallthrough"]
 }
 
 compileTestNanoJava {
diff --git a/compiler/src/testLite/proto/test.proto b/compiler/src/testLite/proto/test.proto
deleted file mode 100644
index d2a1fd5..0000000
--- a/compiler/src/testLite/proto/test.proto
+++ /dev/null
@@ -1,55 +0,0 @@
-// A simple service definition for testing the protoc plugin.
-syntax = "proto2";
-
-package grpc.testing;
-
-option java_package = "io.grpc.testing.integration";
-option optimize_for = LITE_RUNTIME;
-
-message SimpleRequest {
-}
-
-message SimpleResponse {
-}
-
-message StreamingInputCallRequest {
-}
-
-message StreamingInputCallResponse {
-}
-
-message StreamingOutputCallRequest {
-}
-
-message StreamingOutputCallResponse {
-}
-
-// Test service that supports all call types.
-service TestService {
-  // One request followed by one response.
-  // The server returns the client payload as-is.
-  rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
-
-  // One request followed by a sequence of responses (streamed download).
-  // The server returns the payload with client desired type and sizes.
-  rpc StreamingOutputCall(StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-
-  // A sequence of requests followed by one response (streamed upload).
-  // The server returns the aggregated size of client payload as the result.
-  rpc StreamingInputCall(stream StreamingInputCallRequest)
-      returns (StreamingInputCallResponse);
-
-  // A sequence of requests with each request served by the server immediately.
-  // As one request could lead to multiple responses, this interface
-  // demonstrates the idea of full bidirectionality.
-  rpc FullBidiCall(stream StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-
-  // A sequence of requests followed by a sequence of responses.
-  // The server buffers all the client requests and then serves them in order. A
-  // stream of responses are returned to the client when the server starts with
-  // first request.
-  rpc HalfBidiCall(stream StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-}
diff --git a/examples/android/app/build.gradle b/examples/android/app/build.gradle
index dfd7fa5..ee104af 100644
--- a/examples/android/app/build.gradle
+++ b/examples/android/app/build.gradle
@@ -27,7 +27,7 @@
 
 protobuf {
     protoc {
-        artifact = 'com.google.protobuf:protoc:3.0.0-beta-2'
+        artifact = 'com.google.protobuf:protoc:3.0.0-beta-3'
     }
     plugins {
         grpc {
diff --git a/examples/src/generated/main/java/io/grpc/examples/helloworld/HelloReply.java b/examples/src/generated/main/java/io/grpc/examples/helloworld/HelloReply.java
index a613ec3..c45f263 100644
--- a/examples/src/generated/main/java/io/grpc/examples/helloworld/HelloReply.java
+++ b/examples/src/generated/main/java/io/grpc/examples/helloworld/HelloReply.java
@@ -4,11 +4,11 @@
 package io.grpc.examples.helloworld;
 
 /**
- * Protobuf type {@code helloworld.HelloReply}
- *
  * <pre>
  * The response message containing the greetings
  * </pre>
+ *
+ * Protobuf type {@code helloworld.HelloReply}
  */
 public  final class HelloReply extends
     com.google.protobuf.GeneratedMessage implements
@@ -29,7 +29,8 @@
   }
   private HelloReply(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -55,11 +56,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -163,34 +163,40 @@
   }
   public static io.grpc.examples.helloworld.HelloReply parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.helloworld.HelloReply parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.helloworld.HelloReply parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.examples.helloworld.HelloReply parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.helloworld.HelloReply parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.helloworld.HelloReply parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -212,11 +218,11 @@
     return builder;
   }
   /**
-   * Protobuf type {@code helloworld.HelloReply}
-   *
    * <pre>
    * The response message containing the greetings
    * </pre>
+   *
+   * Protobuf type {@code helloworld.HelloReply}
    */
   public static final class Builder extends
       com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -311,7 +317,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.examples.helloworld.HelloReply) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -418,16 +424,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new HelloReply(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/examples/src/generated/main/java/io/grpc/examples/helloworld/HelloRequest.java b/examples/src/generated/main/java/io/grpc/examples/helloworld/HelloRequest.java
index e96df7c..bb5d252 100644
--- a/examples/src/generated/main/java/io/grpc/examples/helloworld/HelloRequest.java
+++ b/examples/src/generated/main/java/io/grpc/examples/helloworld/HelloRequest.java
@@ -4,11 +4,11 @@
 package io.grpc.examples.helloworld;
 
 /**
- * Protobuf type {@code helloworld.HelloRequest}
- *
  * <pre>
  * The request message containing the user's name.
  * </pre>
+ *
+ * Protobuf type {@code helloworld.HelloRequest}
  */
 public  final class HelloRequest extends
     com.google.protobuf.GeneratedMessage implements
@@ -29,7 +29,8 @@
   }
   private HelloRequest(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -55,11 +56,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -163,34 +163,40 @@
   }
   public static io.grpc.examples.helloworld.HelloRequest parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.helloworld.HelloRequest parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.helloworld.HelloRequest parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.examples.helloworld.HelloRequest parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.helloworld.HelloRequest parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.helloworld.HelloRequest parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -212,11 +218,11 @@
     return builder;
   }
   /**
-   * Protobuf type {@code helloworld.HelloRequest}
-   *
    * <pre>
    * The request message containing the user's name.
    * </pre>
+   *
+   * Protobuf type {@code helloworld.HelloRequest}
    */
   public static final class Builder extends
       com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -311,7 +317,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.examples.helloworld.HelloRequest) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -418,16 +424,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new HelloRequest(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/examples/src/generated/main/java/io/grpc/examples/helloworld/HelloWorldProto.java b/examples/src/generated/main/java/io/grpc/examples/helloworld/HelloWorldProto.java
index 03e1e6e..32704fe 100644
--- a/examples/src/generated/main/java/io/grpc/examples/helloworld/HelloWorldProto.java
+++ b/examples/src/generated/main/java/io/grpc/examples/helloworld/HelloWorldProto.java
@@ -8,14 +8,14 @@
   public static void registerAllExtensions(
       com.google.protobuf.ExtensionRegistry registry) {
   }
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_helloworld_HelloRequest_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_helloworld_HelloRequest_fieldAccessorTable;
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_helloworld_HelloReply_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_helloworld_HelloReply_fieldAccessorTable;
 
@@ -23,7 +23,7 @@
       getDescriptor() {
     return descriptor;
   }
-  private static com.google.protobuf.Descriptors.FileDescriptor
+  private static  com.google.protobuf.Descriptors.FileDescriptor
       descriptor;
   static {
     java.lang.String[] descriptorData = {
diff --git a/examples/src/generated/main/java/io/grpc/examples/routeguide/Feature.java b/examples/src/generated/main/java/io/grpc/examples/routeguide/Feature.java
index be77f97..9b87e93 100644
--- a/examples/src/generated/main/java/io/grpc/examples/routeguide/Feature.java
+++ b/examples/src/generated/main/java/io/grpc/examples/routeguide/Feature.java
@@ -4,12 +4,12 @@
 package io.grpc.examples.routeguide;
 
 /**
- * Protobuf type {@code routeguide.Feature}
- *
  * <pre>
  * A feature names something at a given point.
  * If a feature could not be named, the name is empty.
  * </pre>
+ *
+ * Protobuf type {@code routeguide.Feature}
  */
 public  final class Feature extends
     com.google.protobuf.GeneratedMessage implements
@@ -30,7 +30,8 @@
   }
   private Feature(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -69,11 +70,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -93,11 +93,11 @@
   public static final int NAME_FIELD_NUMBER = 1;
   private volatile java.lang.Object name_;
   /**
-   * <code>optional string name = 1;</code>
-   *
    * <pre>
    * The name of the feature.
    * </pre>
+   *
+   * <code>optional string name = 1;</code>
    */
   public java.lang.String getName() {
     java.lang.Object ref = name_;
@@ -112,11 +112,11 @@
     }
   }
   /**
-   * <code>optional string name = 1;</code>
-   *
    * <pre>
    * The name of the feature.
    * </pre>
+   *
+   * <code>optional string name = 1;</code>
    */
   public com.google.protobuf.ByteString
       getNameBytes() {
@@ -135,31 +135,31 @@
   public static final int LOCATION_FIELD_NUMBER = 2;
   private io.grpc.examples.routeguide.Point location_;
   /**
-   * <code>optional .routeguide.Point location = 2;</code>
-   *
    * <pre>
    * The point where the feature is detected.
    * </pre>
+   *
+   * <code>optional .routeguide.Point location = 2;</code>
    */
   public boolean hasLocation() {
     return location_ != null;
   }
   /**
-   * <code>optional .routeguide.Point location = 2;</code>
-   *
    * <pre>
    * The point where the feature is detected.
    * </pre>
+   *
+   * <code>optional .routeguide.Point location = 2;</code>
    */
   public io.grpc.examples.routeguide.Point getLocation() {
     return location_ == null ? io.grpc.examples.routeguide.Point.getDefaultInstance() : location_;
   }
   /**
-   * <code>optional .routeguide.Point location = 2;</code>
-   *
    * <pre>
    * The point where the feature is detected.
    * </pre>
+   *
+   * <code>optional .routeguide.Point location = 2;</code>
    */
   public io.grpc.examples.routeguide.PointOrBuilder getLocationOrBuilder() {
     return getLocation();
@@ -225,34 +225,40 @@
   }
   public static io.grpc.examples.routeguide.Feature parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.Feature parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.routeguide.Feature parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.Feature parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.routeguide.Feature parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.Feature parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -274,12 +280,12 @@
     return builder;
   }
   /**
-   * Protobuf type {@code routeguide.Feature}
-   *
    * <pre>
    * A feature names something at a given point.
    * If a feature could not be named, the name is empty.
    * </pre>
+   *
+   * Protobuf type {@code routeguide.Feature}
    */
   public static final class Builder extends
       com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -388,7 +394,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.examples.routeguide.Feature) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -399,11 +405,11 @@
 
     private java.lang.Object name_ = "";
     /**
-     * <code>optional string name = 1;</code>
-     *
      * <pre>
      * The name of the feature.
      * </pre>
+     *
+     * <code>optional string name = 1;</code>
      */
     public java.lang.String getName() {
       java.lang.Object ref = name_;
@@ -418,11 +424,11 @@
       }
     }
     /**
-     * <code>optional string name = 1;</code>
-     *
      * <pre>
      * The name of the feature.
      * </pre>
+     *
+     * <code>optional string name = 1;</code>
      */
     public com.google.protobuf.ByteString
         getNameBytes() {
@@ -438,11 +444,11 @@
       }
     }
     /**
-     * <code>optional string name = 1;</code>
-     *
      * <pre>
      * The name of the feature.
      * </pre>
+     *
+     * <code>optional string name = 1;</code>
      */
     public Builder setName(
         java.lang.String value) {
@@ -455,11 +461,11 @@
       return this;
     }
     /**
-     * <code>optional string name = 1;</code>
-     *
      * <pre>
      * The name of the feature.
      * </pre>
+     *
+     * <code>optional string name = 1;</code>
      */
     public Builder clearName() {
       
@@ -468,11 +474,11 @@
       return this;
     }
     /**
-     * <code>optional string name = 1;</code>
-     *
      * <pre>
      * The name of the feature.
      * </pre>
+     *
+     * <code>optional string name = 1;</code>
      */
     public Builder setNameBytes(
         com.google.protobuf.ByteString value) {
@@ -490,21 +496,21 @@
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> locationBuilder_;
     /**
-     * <code>optional .routeguide.Point location = 2;</code>
-     *
      * <pre>
      * The point where the feature is detected.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 2;</code>
      */
     public boolean hasLocation() {
       return locationBuilder_ != null || location_ != null;
     }
     /**
-     * <code>optional .routeguide.Point location = 2;</code>
-     *
      * <pre>
      * The point where the feature is detected.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 2;</code>
      */
     public io.grpc.examples.routeguide.Point getLocation() {
       if (locationBuilder_ == null) {
@@ -514,11 +520,11 @@
       }
     }
     /**
-     * <code>optional .routeguide.Point location = 2;</code>
-     *
      * <pre>
      * The point where the feature is detected.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 2;</code>
      */
     public Builder setLocation(io.grpc.examples.routeguide.Point value) {
       if (locationBuilder_ == null) {
@@ -534,11 +540,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point location = 2;</code>
-     *
      * <pre>
      * The point where the feature is detected.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 2;</code>
      */
     public Builder setLocation(
         io.grpc.examples.routeguide.Point.Builder builderForValue) {
@@ -552,11 +558,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point location = 2;</code>
-     *
      * <pre>
      * The point where the feature is detected.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 2;</code>
      */
     public Builder mergeLocation(io.grpc.examples.routeguide.Point value) {
       if (locationBuilder_ == null) {
@@ -574,11 +580,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point location = 2;</code>
-     *
      * <pre>
      * The point where the feature is detected.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 2;</code>
      */
     public Builder clearLocation() {
       if (locationBuilder_ == null) {
@@ -592,11 +598,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point location = 2;</code>
-     *
      * <pre>
      * The point where the feature is detected.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 2;</code>
      */
     public io.grpc.examples.routeguide.Point.Builder getLocationBuilder() {
       
@@ -604,11 +610,11 @@
       return getLocationFieldBuilder().getBuilder();
     }
     /**
-     * <code>optional .routeguide.Point location = 2;</code>
-     *
      * <pre>
      * The point where the feature is detected.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 2;</code>
      */
     public io.grpc.examples.routeguide.PointOrBuilder getLocationOrBuilder() {
       if (locationBuilder_ != null) {
@@ -619,11 +625,11 @@
       }
     }
     /**
-     * <code>optional .routeguide.Point location = 2;</code>
-     *
      * <pre>
      * The point where the feature is detected.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 2;</code>
      */
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> 
@@ -668,16 +674,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new Feature(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/examples/src/generated/main/java/io/grpc/examples/routeguide/FeatureDatabase.java b/examples/src/generated/main/java/io/grpc/examples/routeguide/FeatureDatabase.java
index ae0a536..21259e8 100644
--- a/examples/src/generated/main/java/io/grpc/examples/routeguide/FeatureDatabase.java
+++ b/examples/src/generated/main/java/io/grpc/examples/routeguide/FeatureDatabase.java
@@ -4,11 +4,11 @@
 package io.grpc.examples.routeguide;
 
 /**
- * Protobuf type {@code routeguide.FeatureDatabase}
- *
  * <pre>
  * Not used in the RPC.  Instead, this is here for the form serialized to disk.
  * </pre>
+ *
+ * Protobuf type {@code routeguide.FeatureDatabase}
  */
 public  final class FeatureDatabase extends
     com.google.protobuf.GeneratedMessage implements
@@ -29,7 +29,8 @@
   }
   private FeatureDatabase(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -57,11 +58,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
         feature_ = java.util.Collections.unmodifiableList(feature_);
@@ -170,34 +170,40 @@
   }
   public static io.grpc.examples.routeguide.FeatureDatabase parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.FeatureDatabase parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.routeguide.FeatureDatabase parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.FeatureDatabase parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.routeguide.FeatureDatabase parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.FeatureDatabase parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -219,11 +225,11 @@
     return builder;
   }
   /**
-   * Protobuf type {@code routeguide.FeatureDatabase}
-   *
    * <pre>
    * Not used in the RPC.  Instead, this is here for the form serialized to disk.
    * </pre>
+   *
+   * Protobuf type {@code routeguide.FeatureDatabase}
    */
   public static final class Builder extends
       com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -354,7 +360,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.examples.routeguide.FeatureDatabase) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -633,16 +639,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new FeatureDatabase(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/examples/src/generated/main/java/io/grpc/examples/routeguide/FeatureOrBuilder.java b/examples/src/generated/main/java/io/grpc/examples/routeguide/FeatureOrBuilder.java
index e8fb726..ec173ab 100644
--- a/examples/src/generated/main/java/io/grpc/examples/routeguide/FeatureOrBuilder.java
+++ b/examples/src/generated/main/java/io/grpc/examples/routeguide/FeatureOrBuilder.java
@@ -8,45 +8,45 @@
     com.google.protobuf.MessageOrBuilder {
 
   /**
-   * <code>optional string name = 1;</code>
-   *
    * <pre>
    * The name of the feature.
    * </pre>
+   *
+   * <code>optional string name = 1;</code>
    */
   java.lang.String getName();
   /**
-   * <code>optional string name = 1;</code>
-   *
    * <pre>
    * The name of the feature.
    * </pre>
+   *
+   * <code>optional string name = 1;</code>
    */
   com.google.protobuf.ByteString
       getNameBytes();
 
   /**
-   * <code>optional .routeguide.Point location = 2;</code>
-   *
    * <pre>
    * The point where the feature is detected.
    * </pre>
+   *
+   * <code>optional .routeguide.Point location = 2;</code>
    */
   boolean hasLocation();
   /**
-   * <code>optional .routeguide.Point location = 2;</code>
-   *
    * <pre>
    * The point where the feature is detected.
    * </pre>
+   *
+   * <code>optional .routeguide.Point location = 2;</code>
    */
   io.grpc.examples.routeguide.Point getLocation();
   /**
-   * <code>optional .routeguide.Point location = 2;</code>
-   *
    * <pre>
    * The point where the feature is detected.
    * </pre>
+   *
+   * <code>optional .routeguide.Point location = 2;</code>
    */
   io.grpc.examples.routeguide.PointOrBuilder getLocationOrBuilder();
 }
diff --git a/examples/src/generated/main/java/io/grpc/examples/routeguide/Point.java b/examples/src/generated/main/java/io/grpc/examples/routeguide/Point.java
index 49aefc7..2b63046 100644
--- a/examples/src/generated/main/java/io/grpc/examples/routeguide/Point.java
+++ b/examples/src/generated/main/java/io/grpc/examples/routeguide/Point.java
@@ -4,14 +4,14 @@
 package io.grpc.examples.routeguide;
 
 /**
- * Protobuf type {@code routeguide.Point}
- *
  * <pre>
  * Points are represented as latitude-longitude pairs in the E7 representation
  * (degrees multiplied by 10**7 and rounded to the nearest integer).
  * Latitudes should be in the range +/- 90 degrees and longitude should be in
  * the range +/- 180 degrees (inclusive).
  * </pre>
+ *
+ * Protobuf type {@code routeguide.Point}
  */
 public  final class Point extends
     com.google.protobuf.GeneratedMessage implements
@@ -33,7 +33,8 @@
   }
   private Point(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -63,11 +64,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -163,34 +163,40 @@
   }
   public static io.grpc.examples.routeguide.Point parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.Point parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.routeguide.Point parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.Point parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.routeguide.Point parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.Point parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -212,14 +218,14 @@
     return builder;
   }
   /**
-   * Protobuf type {@code routeguide.Point}
-   *
    * <pre>
    * Points are represented as latitude-longitude pairs in the E7 representation
    * (degrees multiplied by 10**7 and rounded to the nearest integer).
    * Latitudes should be in the range +/- 90 degrees and longitude should be in
    * the range +/- 180 degrees (inclusive).
    * </pre>
+   *
+   * Protobuf type {@code routeguide.Point}
    */
   public static final class Builder extends
       com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -319,7 +325,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.examples.routeguide.Point) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -409,16 +415,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new Point(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/examples/src/generated/main/java/io/grpc/examples/routeguide/Rectangle.java b/examples/src/generated/main/java/io/grpc/examples/routeguide/Rectangle.java
index 8268e7f..f38ed16 100644
--- a/examples/src/generated/main/java/io/grpc/examples/routeguide/Rectangle.java
+++ b/examples/src/generated/main/java/io/grpc/examples/routeguide/Rectangle.java
@@ -4,12 +4,12 @@
 package io.grpc.examples.routeguide;
 
 /**
- * Protobuf type {@code routeguide.Rectangle}
- *
  * <pre>
  * A latitude-longitude rectangle, represented as two diagonally opposite
  * points "lo" and "hi".
  * </pre>
+ *
+ * Protobuf type {@code routeguide.Rectangle}
  */
 public  final class Rectangle extends
     com.google.protobuf.GeneratedMessage implements
@@ -29,7 +29,8 @@
   }
   private Rectangle(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -75,11 +76,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -99,31 +99,31 @@
   public static final int LO_FIELD_NUMBER = 1;
   private io.grpc.examples.routeguide.Point lo_;
   /**
-   * <code>optional .routeguide.Point lo = 1;</code>
-   *
    * <pre>
    * One corner of the rectangle.
    * </pre>
+   *
+   * <code>optional .routeguide.Point lo = 1;</code>
    */
   public boolean hasLo() {
     return lo_ != null;
   }
   /**
-   * <code>optional .routeguide.Point lo = 1;</code>
-   *
    * <pre>
    * One corner of the rectangle.
    * </pre>
+   *
+   * <code>optional .routeguide.Point lo = 1;</code>
    */
   public io.grpc.examples.routeguide.Point getLo() {
     return lo_ == null ? io.grpc.examples.routeguide.Point.getDefaultInstance() : lo_;
   }
   /**
-   * <code>optional .routeguide.Point lo = 1;</code>
-   *
    * <pre>
    * One corner of the rectangle.
    * </pre>
+   *
+   * <code>optional .routeguide.Point lo = 1;</code>
    */
   public io.grpc.examples.routeguide.PointOrBuilder getLoOrBuilder() {
     return getLo();
@@ -132,31 +132,31 @@
   public static final int HI_FIELD_NUMBER = 2;
   private io.grpc.examples.routeguide.Point hi_;
   /**
-   * <code>optional .routeguide.Point hi = 2;</code>
-   *
    * <pre>
    * The other corner of the rectangle.
    * </pre>
+   *
+   * <code>optional .routeguide.Point hi = 2;</code>
    */
   public boolean hasHi() {
     return hi_ != null;
   }
   /**
-   * <code>optional .routeguide.Point hi = 2;</code>
-   *
    * <pre>
    * The other corner of the rectangle.
    * </pre>
+   *
+   * <code>optional .routeguide.Point hi = 2;</code>
    */
   public io.grpc.examples.routeguide.Point getHi() {
     return hi_ == null ? io.grpc.examples.routeguide.Point.getDefaultInstance() : hi_;
   }
   /**
-   * <code>optional .routeguide.Point hi = 2;</code>
-   *
    * <pre>
    * The other corner of the rectangle.
    * </pre>
+   *
+   * <code>optional .routeguide.Point hi = 2;</code>
    */
   public io.grpc.examples.routeguide.PointOrBuilder getHiOrBuilder() {
     return getHi();
@@ -223,34 +223,40 @@
   }
   public static io.grpc.examples.routeguide.Rectangle parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.Rectangle parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.routeguide.Rectangle parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.Rectangle parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.routeguide.Rectangle parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.Rectangle parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -272,12 +278,12 @@
     return builder;
   }
   /**
-   * Protobuf type {@code routeguide.Rectangle}
-   *
    * <pre>
    * A latitude-longitude rectangle, represented as two diagonally opposite
    * points "lo" and "hi".
    * </pre>
+   *
+   * Protobuf type {@code routeguide.Rectangle}
    */
   public static final class Builder extends
       com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -393,7 +399,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.examples.routeguide.Rectangle) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -406,21 +412,21 @@
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> loBuilder_;
     /**
-     * <code>optional .routeguide.Point lo = 1;</code>
-     *
      * <pre>
      * One corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point lo = 1;</code>
      */
     public boolean hasLo() {
       return loBuilder_ != null || lo_ != null;
     }
     /**
-     * <code>optional .routeguide.Point lo = 1;</code>
-     *
      * <pre>
      * One corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point lo = 1;</code>
      */
     public io.grpc.examples.routeguide.Point getLo() {
       if (loBuilder_ == null) {
@@ -430,11 +436,11 @@
       }
     }
     /**
-     * <code>optional .routeguide.Point lo = 1;</code>
-     *
      * <pre>
      * One corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point lo = 1;</code>
      */
     public Builder setLo(io.grpc.examples.routeguide.Point value) {
       if (loBuilder_ == null) {
@@ -450,11 +456,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point lo = 1;</code>
-     *
      * <pre>
      * One corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point lo = 1;</code>
      */
     public Builder setLo(
         io.grpc.examples.routeguide.Point.Builder builderForValue) {
@@ -468,11 +474,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point lo = 1;</code>
-     *
      * <pre>
      * One corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point lo = 1;</code>
      */
     public Builder mergeLo(io.grpc.examples.routeguide.Point value) {
       if (loBuilder_ == null) {
@@ -490,11 +496,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point lo = 1;</code>
-     *
      * <pre>
      * One corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point lo = 1;</code>
      */
     public Builder clearLo() {
       if (loBuilder_ == null) {
@@ -508,11 +514,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point lo = 1;</code>
-     *
      * <pre>
      * One corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point lo = 1;</code>
      */
     public io.grpc.examples.routeguide.Point.Builder getLoBuilder() {
       
@@ -520,11 +526,11 @@
       return getLoFieldBuilder().getBuilder();
     }
     /**
-     * <code>optional .routeguide.Point lo = 1;</code>
-     *
      * <pre>
      * One corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point lo = 1;</code>
      */
     public io.grpc.examples.routeguide.PointOrBuilder getLoOrBuilder() {
       if (loBuilder_ != null) {
@@ -535,11 +541,11 @@
       }
     }
     /**
-     * <code>optional .routeguide.Point lo = 1;</code>
-     *
      * <pre>
      * One corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point lo = 1;</code>
      */
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> 
@@ -559,21 +565,21 @@
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> hiBuilder_;
     /**
-     * <code>optional .routeguide.Point hi = 2;</code>
-     *
      * <pre>
      * The other corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point hi = 2;</code>
      */
     public boolean hasHi() {
       return hiBuilder_ != null || hi_ != null;
     }
     /**
-     * <code>optional .routeguide.Point hi = 2;</code>
-     *
      * <pre>
      * The other corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point hi = 2;</code>
      */
     public io.grpc.examples.routeguide.Point getHi() {
       if (hiBuilder_ == null) {
@@ -583,11 +589,11 @@
       }
     }
     /**
-     * <code>optional .routeguide.Point hi = 2;</code>
-     *
      * <pre>
      * The other corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point hi = 2;</code>
      */
     public Builder setHi(io.grpc.examples.routeguide.Point value) {
       if (hiBuilder_ == null) {
@@ -603,11 +609,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point hi = 2;</code>
-     *
      * <pre>
      * The other corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point hi = 2;</code>
      */
     public Builder setHi(
         io.grpc.examples.routeguide.Point.Builder builderForValue) {
@@ -621,11 +627,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point hi = 2;</code>
-     *
      * <pre>
      * The other corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point hi = 2;</code>
      */
     public Builder mergeHi(io.grpc.examples.routeguide.Point value) {
       if (hiBuilder_ == null) {
@@ -643,11 +649,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point hi = 2;</code>
-     *
      * <pre>
      * The other corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point hi = 2;</code>
      */
     public Builder clearHi() {
       if (hiBuilder_ == null) {
@@ -661,11 +667,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point hi = 2;</code>
-     *
      * <pre>
      * The other corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point hi = 2;</code>
      */
     public io.grpc.examples.routeguide.Point.Builder getHiBuilder() {
       
@@ -673,11 +679,11 @@
       return getHiFieldBuilder().getBuilder();
     }
     /**
-     * <code>optional .routeguide.Point hi = 2;</code>
-     *
      * <pre>
      * The other corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point hi = 2;</code>
      */
     public io.grpc.examples.routeguide.PointOrBuilder getHiOrBuilder() {
       if (hiBuilder_ != null) {
@@ -688,11 +694,11 @@
       }
     }
     /**
-     * <code>optional .routeguide.Point hi = 2;</code>
-     *
      * <pre>
      * The other corner of the rectangle.
      * </pre>
+     *
+     * <code>optional .routeguide.Point hi = 2;</code>
      */
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> 
@@ -737,16 +743,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new Rectangle(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/examples/src/generated/main/java/io/grpc/examples/routeguide/RectangleOrBuilder.java b/examples/src/generated/main/java/io/grpc/examples/routeguide/RectangleOrBuilder.java
index df3961d..d5b534c 100644
--- a/examples/src/generated/main/java/io/grpc/examples/routeguide/RectangleOrBuilder.java
+++ b/examples/src/generated/main/java/io/grpc/examples/routeguide/RectangleOrBuilder.java
@@ -8,52 +8,52 @@
     com.google.protobuf.MessageOrBuilder {
 
   /**
-   * <code>optional .routeguide.Point lo = 1;</code>
-   *
    * <pre>
    * One corner of the rectangle.
    * </pre>
+   *
+   * <code>optional .routeguide.Point lo = 1;</code>
    */
   boolean hasLo();
   /**
-   * <code>optional .routeguide.Point lo = 1;</code>
-   *
    * <pre>
    * One corner of the rectangle.
    * </pre>
+   *
+   * <code>optional .routeguide.Point lo = 1;</code>
    */
   io.grpc.examples.routeguide.Point getLo();
   /**
-   * <code>optional .routeguide.Point lo = 1;</code>
-   *
    * <pre>
    * One corner of the rectangle.
    * </pre>
+   *
+   * <code>optional .routeguide.Point lo = 1;</code>
    */
   io.grpc.examples.routeguide.PointOrBuilder getLoOrBuilder();
 
   /**
-   * <code>optional .routeguide.Point hi = 2;</code>
-   *
    * <pre>
    * The other corner of the rectangle.
    * </pre>
+   *
+   * <code>optional .routeguide.Point hi = 2;</code>
    */
   boolean hasHi();
   /**
-   * <code>optional .routeguide.Point hi = 2;</code>
-   *
    * <pre>
    * The other corner of the rectangle.
    * </pre>
+   *
+   * <code>optional .routeguide.Point hi = 2;</code>
    */
   io.grpc.examples.routeguide.Point getHi();
   /**
-   * <code>optional .routeguide.Point hi = 2;</code>
-   *
    * <pre>
    * The other corner of the rectangle.
    * </pre>
+   *
+   * <code>optional .routeguide.Point hi = 2;</code>
    */
   io.grpc.examples.routeguide.PointOrBuilder getHiOrBuilder();
 }
diff --git a/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteGuideProto.java b/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteGuideProto.java
index e751617..2510a2e 100644
--- a/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteGuideProto.java
+++ b/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteGuideProto.java
@@ -8,34 +8,34 @@
   public static void registerAllExtensions(
       com.google.protobuf.ExtensionRegistry registry) {
   }
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_routeguide_Point_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_routeguide_Point_fieldAccessorTable;
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_routeguide_Rectangle_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_routeguide_Rectangle_fieldAccessorTable;
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_routeguide_Feature_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_routeguide_Feature_fieldAccessorTable;
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_routeguide_FeatureDatabase_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_routeguide_FeatureDatabase_fieldAccessorTable;
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_routeguide_RouteNote_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_routeguide_RouteNote_fieldAccessorTable;
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_routeguide_RouteSummary_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_routeguide_RouteSummary_fieldAccessorTable;
 
@@ -43,7 +43,7 @@
       getDescriptor() {
     return descriptor;
   }
-  private static com.google.protobuf.Descriptors.FileDescriptor
+  private static  com.google.protobuf.Descriptors.FileDescriptor
       descriptor;
   static {
     java.lang.String[] descriptorData = {
diff --git a/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteNote.java b/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteNote.java
index 1b38c0a..c700545 100644
--- a/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteNote.java
+++ b/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteNote.java
@@ -4,11 +4,11 @@
 package io.grpc.examples.routeguide;
 
 /**
- * Protobuf type {@code routeguide.RouteNote}
- *
  * <pre>
  * A RouteNote is a message sent while at a given point.
  * </pre>
+ *
+ * Protobuf type {@code routeguide.RouteNote}
  */
 public  final class RouteNote extends
     com.google.protobuf.GeneratedMessage implements
@@ -29,7 +29,8 @@
   }
   private RouteNote(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -68,11 +69,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -92,31 +92,31 @@
   public static final int LOCATION_FIELD_NUMBER = 1;
   private io.grpc.examples.routeguide.Point location_;
   /**
-   * <code>optional .routeguide.Point location = 1;</code>
-   *
    * <pre>
    * The location from which the message is sent.
    * </pre>
+   *
+   * <code>optional .routeguide.Point location = 1;</code>
    */
   public boolean hasLocation() {
     return location_ != null;
   }
   /**
-   * <code>optional .routeguide.Point location = 1;</code>
-   *
    * <pre>
    * The location from which the message is sent.
    * </pre>
+   *
+   * <code>optional .routeguide.Point location = 1;</code>
    */
   public io.grpc.examples.routeguide.Point getLocation() {
     return location_ == null ? io.grpc.examples.routeguide.Point.getDefaultInstance() : location_;
   }
   /**
-   * <code>optional .routeguide.Point location = 1;</code>
-   *
    * <pre>
    * The location from which the message is sent.
    * </pre>
+   *
+   * <code>optional .routeguide.Point location = 1;</code>
    */
   public io.grpc.examples.routeguide.PointOrBuilder getLocationOrBuilder() {
     return getLocation();
@@ -125,11 +125,11 @@
   public static final int MESSAGE_FIELD_NUMBER = 2;
   private volatile java.lang.Object message_;
   /**
-   * <code>optional string message = 2;</code>
-   *
    * <pre>
    * The message to be sent.
    * </pre>
+   *
+   * <code>optional string message = 2;</code>
    */
   public java.lang.String getMessage() {
     java.lang.Object ref = message_;
@@ -144,11 +144,11 @@
     }
   }
   /**
-   * <code>optional string message = 2;</code>
-   *
    * <pre>
    * The message to be sent.
    * </pre>
+   *
+   * <code>optional string message = 2;</code>
    */
   public com.google.protobuf.ByteString
       getMessageBytes() {
@@ -224,34 +224,40 @@
   }
   public static io.grpc.examples.routeguide.RouteNote parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.RouteNote parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.routeguide.RouteNote parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.RouteNote parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.routeguide.RouteNote parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.RouteNote parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -273,11 +279,11 @@
     return builder;
   }
   /**
-   * Protobuf type {@code routeguide.RouteNote}
-   *
    * <pre>
    * A RouteNote is a message sent while at a given point.
    * </pre>
+   *
+   * Protobuf type {@code routeguide.RouteNote}
    */
   public static final class Builder extends
       com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -386,7 +392,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.examples.routeguide.RouteNote) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -399,21 +405,21 @@
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> locationBuilder_;
     /**
-     * <code>optional .routeguide.Point location = 1;</code>
-     *
      * <pre>
      * The location from which the message is sent.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 1;</code>
      */
     public boolean hasLocation() {
       return locationBuilder_ != null || location_ != null;
     }
     /**
-     * <code>optional .routeguide.Point location = 1;</code>
-     *
      * <pre>
      * The location from which the message is sent.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 1;</code>
      */
     public io.grpc.examples.routeguide.Point getLocation() {
       if (locationBuilder_ == null) {
@@ -423,11 +429,11 @@
       }
     }
     /**
-     * <code>optional .routeguide.Point location = 1;</code>
-     *
      * <pre>
      * The location from which the message is sent.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 1;</code>
      */
     public Builder setLocation(io.grpc.examples.routeguide.Point value) {
       if (locationBuilder_ == null) {
@@ -443,11 +449,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point location = 1;</code>
-     *
      * <pre>
      * The location from which the message is sent.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 1;</code>
      */
     public Builder setLocation(
         io.grpc.examples.routeguide.Point.Builder builderForValue) {
@@ -461,11 +467,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point location = 1;</code>
-     *
      * <pre>
      * The location from which the message is sent.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 1;</code>
      */
     public Builder mergeLocation(io.grpc.examples.routeguide.Point value) {
       if (locationBuilder_ == null) {
@@ -483,11 +489,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point location = 1;</code>
-     *
      * <pre>
      * The location from which the message is sent.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 1;</code>
      */
     public Builder clearLocation() {
       if (locationBuilder_ == null) {
@@ -501,11 +507,11 @@
       return this;
     }
     /**
-     * <code>optional .routeguide.Point location = 1;</code>
-     *
      * <pre>
      * The location from which the message is sent.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 1;</code>
      */
     public io.grpc.examples.routeguide.Point.Builder getLocationBuilder() {
       
@@ -513,11 +519,11 @@
       return getLocationFieldBuilder().getBuilder();
     }
     /**
-     * <code>optional .routeguide.Point location = 1;</code>
-     *
      * <pre>
      * The location from which the message is sent.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 1;</code>
      */
     public io.grpc.examples.routeguide.PointOrBuilder getLocationOrBuilder() {
       if (locationBuilder_ != null) {
@@ -528,11 +534,11 @@
       }
     }
     /**
-     * <code>optional .routeguide.Point location = 1;</code>
-     *
      * <pre>
      * The location from which the message is sent.
      * </pre>
+     *
+     * <code>optional .routeguide.Point location = 1;</code>
      */
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> 
@@ -550,11 +556,11 @@
 
     private java.lang.Object message_ = "";
     /**
-     * <code>optional string message = 2;</code>
-     *
      * <pre>
      * The message to be sent.
      * </pre>
+     *
+     * <code>optional string message = 2;</code>
      */
     public java.lang.String getMessage() {
       java.lang.Object ref = message_;
@@ -569,11 +575,11 @@
       }
     }
     /**
-     * <code>optional string message = 2;</code>
-     *
      * <pre>
      * The message to be sent.
      * </pre>
+     *
+     * <code>optional string message = 2;</code>
      */
     public com.google.protobuf.ByteString
         getMessageBytes() {
@@ -589,11 +595,11 @@
       }
     }
     /**
-     * <code>optional string message = 2;</code>
-     *
      * <pre>
      * The message to be sent.
      * </pre>
+     *
+     * <code>optional string message = 2;</code>
      */
     public Builder setMessage(
         java.lang.String value) {
@@ -606,11 +612,11 @@
       return this;
     }
     /**
-     * <code>optional string message = 2;</code>
-     *
      * <pre>
      * The message to be sent.
      * </pre>
+     *
+     * <code>optional string message = 2;</code>
      */
     public Builder clearMessage() {
       
@@ -619,11 +625,11 @@
       return this;
     }
     /**
-     * <code>optional string message = 2;</code>
-     *
      * <pre>
      * The message to be sent.
      * </pre>
+     *
+     * <code>optional string message = 2;</code>
      */
     public Builder setMessageBytes(
         com.google.protobuf.ByteString value) {
@@ -666,16 +672,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new RouteNote(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteNoteOrBuilder.java b/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteNoteOrBuilder.java
index f6b429a..a7fb973 100644
--- a/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteNoteOrBuilder.java
+++ b/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteNoteOrBuilder.java
@@ -8,44 +8,44 @@
     com.google.protobuf.MessageOrBuilder {
 
   /**
-   * <code>optional .routeguide.Point location = 1;</code>
-   *
    * <pre>
    * The location from which the message is sent.
    * </pre>
+   *
+   * <code>optional .routeguide.Point location = 1;</code>
    */
   boolean hasLocation();
   /**
-   * <code>optional .routeguide.Point location = 1;</code>
-   *
    * <pre>
    * The location from which the message is sent.
    * </pre>
+   *
+   * <code>optional .routeguide.Point location = 1;</code>
    */
   io.grpc.examples.routeguide.Point getLocation();
   /**
-   * <code>optional .routeguide.Point location = 1;</code>
-   *
    * <pre>
    * The location from which the message is sent.
    * </pre>
+   *
+   * <code>optional .routeguide.Point location = 1;</code>
    */
   io.grpc.examples.routeguide.PointOrBuilder getLocationOrBuilder();
 
   /**
-   * <code>optional string message = 2;</code>
-   *
    * <pre>
    * The message to be sent.
    * </pre>
+   *
+   * <code>optional string message = 2;</code>
    */
   java.lang.String getMessage();
   /**
-   * <code>optional string message = 2;</code>
-   *
    * <pre>
    * The message to be sent.
    * </pre>
+   *
+   * <code>optional string message = 2;</code>
    */
   com.google.protobuf.ByteString
       getMessageBytes();
diff --git a/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteSummary.java b/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteSummary.java
index 0ab163e..3e78aee 100644
--- a/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteSummary.java
+++ b/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteSummary.java
@@ -4,14 +4,14 @@
 package io.grpc.examples.routeguide;
 
 /**
- * Protobuf type {@code routeguide.RouteSummary}
- *
  * <pre>
  * A RouteSummary is received in response to a RecordRoute rpc.
  * It contains the number of individual points received, the number of
  * detected features, and the total distance covered as the cumulative sum of
  * the distance between each point.
  * </pre>
+ *
+ * Protobuf type {@code routeguide.RouteSummary}
  */
 public  final class RouteSummary extends
     com.google.protobuf.GeneratedMessage implements
@@ -35,7 +35,8 @@
   }
   private RouteSummary(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -75,11 +76,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -99,11 +99,11 @@
   public static final int POINT_COUNT_FIELD_NUMBER = 1;
   private int pointCount_;
   /**
-   * <code>optional int32 point_count = 1;</code>
-   *
    * <pre>
    * The number of points received.
    * </pre>
+   *
+   * <code>optional int32 point_count = 1;</code>
    */
   public int getPointCount() {
     return pointCount_;
@@ -112,11 +112,11 @@
   public static final int FEATURE_COUNT_FIELD_NUMBER = 2;
   private int featureCount_;
   /**
-   * <code>optional int32 feature_count = 2;</code>
-   *
    * <pre>
    * The number of known features passed while traversing the route.
    * </pre>
+   *
+   * <code>optional int32 feature_count = 2;</code>
    */
   public int getFeatureCount() {
     return featureCount_;
@@ -125,11 +125,11 @@
   public static final int DISTANCE_FIELD_NUMBER = 3;
   private int distance_;
   /**
-   * <code>optional int32 distance = 3;</code>
-   *
    * <pre>
    * The distance covered in metres.
    * </pre>
+   *
+   * <code>optional int32 distance = 3;</code>
    */
   public int getDistance() {
     return distance_;
@@ -138,11 +138,11 @@
   public static final int ELAPSED_TIME_FIELD_NUMBER = 4;
   private int elapsedTime_;
   /**
-   * <code>optional int32 elapsed_time = 4;</code>
-   *
    * <pre>
    * The duration of the traversal in seconds.
    * </pre>
+   *
+   * <code>optional int32 elapsed_time = 4;</code>
    */
   public int getElapsedTime() {
     return elapsedTime_;
@@ -223,34 +223,40 @@
   }
   public static io.grpc.examples.routeguide.RouteSummary parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.RouteSummary parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.routeguide.RouteSummary parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.RouteSummary parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.examples.routeguide.RouteSummary parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.examples.routeguide.RouteSummary parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -272,14 +278,14 @@
     return builder;
   }
   /**
-   * Protobuf type {@code routeguide.RouteSummary}
-   *
    * <pre>
    * A RouteSummary is received in response to a RecordRoute rpc.
    * It contains the number of individual points received, the number of
    * detected features, and the total distance covered as the cumulative sum of
    * the distance between each point.
    * </pre>
+   *
+   * Protobuf type {@code routeguide.RouteSummary}
    */
   public static final class Builder extends
       com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -391,7 +397,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.examples.routeguide.RouteSummary) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -402,21 +408,21 @@
 
     private int pointCount_ ;
     /**
-     * <code>optional int32 point_count = 1;</code>
-     *
      * <pre>
      * The number of points received.
      * </pre>
+     *
+     * <code>optional int32 point_count = 1;</code>
      */
     public int getPointCount() {
       return pointCount_;
     }
     /**
-     * <code>optional int32 point_count = 1;</code>
-     *
      * <pre>
      * The number of points received.
      * </pre>
+     *
+     * <code>optional int32 point_count = 1;</code>
      */
     public Builder setPointCount(int value) {
       
@@ -425,11 +431,11 @@
       return this;
     }
     /**
-     * <code>optional int32 point_count = 1;</code>
-     *
      * <pre>
      * The number of points received.
      * </pre>
+     *
+     * <code>optional int32 point_count = 1;</code>
      */
     public Builder clearPointCount() {
       
@@ -440,21 +446,21 @@
 
     private int featureCount_ ;
     /**
-     * <code>optional int32 feature_count = 2;</code>
-     *
      * <pre>
      * The number of known features passed while traversing the route.
      * </pre>
+     *
+     * <code>optional int32 feature_count = 2;</code>
      */
     public int getFeatureCount() {
       return featureCount_;
     }
     /**
-     * <code>optional int32 feature_count = 2;</code>
-     *
      * <pre>
      * The number of known features passed while traversing the route.
      * </pre>
+     *
+     * <code>optional int32 feature_count = 2;</code>
      */
     public Builder setFeatureCount(int value) {
       
@@ -463,11 +469,11 @@
       return this;
     }
     /**
-     * <code>optional int32 feature_count = 2;</code>
-     *
      * <pre>
      * The number of known features passed while traversing the route.
      * </pre>
+     *
+     * <code>optional int32 feature_count = 2;</code>
      */
     public Builder clearFeatureCount() {
       
@@ -478,21 +484,21 @@
 
     private int distance_ ;
     /**
-     * <code>optional int32 distance = 3;</code>
-     *
      * <pre>
      * The distance covered in metres.
      * </pre>
+     *
+     * <code>optional int32 distance = 3;</code>
      */
     public int getDistance() {
       return distance_;
     }
     /**
-     * <code>optional int32 distance = 3;</code>
-     *
      * <pre>
      * The distance covered in metres.
      * </pre>
+     *
+     * <code>optional int32 distance = 3;</code>
      */
     public Builder setDistance(int value) {
       
@@ -501,11 +507,11 @@
       return this;
     }
     /**
-     * <code>optional int32 distance = 3;</code>
-     *
      * <pre>
      * The distance covered in metres.
      * </pre>
+     *
+     * <code>optional int32 distance = 3;</code>
      */
     public Builder clearDistance() {
       
@@ -516,21 +522,21 @@
 
     private int elapsedTime_ ;
     /**
-     * <code>optional int32 elapsed_time = 4;</code>
-     *
      * <pre>
      * The duration of the traversal in seconds.
      * </pre>
+     *
+     * <code>optional int32 elapsed_time = 4;</code>
      */
     public int getElapsedTime() {
       return elapsedTime_;
     }
     /**
-     * <code>optional int32 elapsed_time = 4;</code>
-     *
      * <pre>
      * The duration of the traversal in seconds.
      * </pre>
+     *
+     * <code>optional int32 elapsed_time = 4;</code>
      */
     public Builder setElapsedTime(int value) {
       
@@ -539,11 +545,11 @@
       return this;
     }
     /**
-     * <code>optional int32 elapsed_time = 4;</code>
-     *
      * <pre>
      * The duration of the traversal in seconds.
      * </pre>
+     *
+     * <code>optional int32 elapsed_time = 4;</code>
      */
     public Builder clearElapsedTime() {
       
@@ -581,16 +587,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new RouteSummary(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteSummaryOrBuilder.java b/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteSummaryOrBuilder.java
index bdffc55..a92146a 100644
--- a/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteSummaryOrBuilder.java
+++ b/examples/src/generated/main/java/io/grpc/examples/routeguide/RouteSummaryOrBuilder.java
@@ -8,38 +8,38 @@
     com.google.protobuf.MessageOrBuilder {
 
   /**
-   * <code>optional int32 point_count = 1;</code>
-   *
    * <pre>
    * The number of points received.
    * </pre>
+   *
+   * <code>optional int32 point_count = 1;</code>
    */
   int getPointCount();
 
   /**
-   * <code>optional int32 feature_count = 2;</code>
-   *
    * <pre>
    * The number of known features passed while traversing the route.
    * </pre>
+   *
+   * <code>optional int32 feature_count = 2;</code>
    */
   int getFeatureCount();
 
   /**
-   * <code>optional int32 distance = 3;</code>
-   *
    * <pre>
    * The distance covered in metres.
    * </pre>
+   *
+   * <code>optional int32 distance = 3;</code>
    */
   int getDistance();
 
   /**
-   * <code>optional int32 elapsed_time = 4;</code>
-   *
    * <pre>
    * The duration of the traversal in seconds.
    * </pre>
+   *
+   * <code>optional int32 elapsed_time = 4;</code>
    */
   int getElapsedTime();
 }
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/ClientStats.java b/grpclb/src/generated/main/java/io/grpc/grpclb/ClientStats.java
index 6076858..a733021 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/ClientStats.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/ClientStats.java
@@ -4,12 +4,12 @@
 package io.grpc.grpclb;
 
 /**
- * Protobuf type {@code grpc.lb.v1.ClientStats}
- *
  * <pre>
  * Contains client level statistics that are useful to load balancing. Each
  * count should be reset to zero after reporting the stats.
  * </pre>
+ *
+ * Protobuf type {@code grpc.lb.v1.ClientStats}
  */
 public  final class ClientStats extends
     com.google.protobuf.GeneratedMessage implements
@@ -32,7 +32,8 @@
   }
   private ClientStats(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -67,11 +68,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -91,11 +91,11 @@
   public static final int TOTAL_REQUESTS_FIELD_NUMBER = 1;
   private long totalRequests_;
   /**
-   * <code>optional int64 total_requests = 1;</code>
-   *
    * <pre>
    * The total number of requests sent by the client since the last report.
    * </pre>
+   *
+   * <code>optional int64 total_requests = 1;</code>
    */
   public long getTotalRequests() {
     return totalRequests_;
@@ -104,11 +104,11 @@
   public static final int CLIENT_RPC_ERRORS_FIELD_NUMBER = 2;
   private long clientRpcErrors_;
   /**
-   * <code>optional int64 client_rpc_errors = 2;</code>
-   *
    * <pre>
    * The number of client rpc errors since the last report.
    * </pre>
+   *
+   * <code>optional int64 client_rpc_errors = 2;</code>
    */
   public long getClientRpcErrors() {
     return clientRpcErrors_;
@@ -117,11 +117,11 @@
   public static final int DROPPED_REQUESTS_FIELD_NUMBER = 3;
   private long droppedRequests_;
   /**
-   * <code>optional int64 dropped_requests = 3;</code>
-   *
    * <pre>
    * The number of dropped requests since the last report.
    * </pre>
+   *
+   * <code>optional int64 dropped_requests = 3;</code>
    */
   public long getDroppedRequests() {
     return droppedRequests_;
@@ -195,34 +195,40 @@
   }
   public static io.grpc.grpclb.ClientStats parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.ClientStats parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.grpclb.ClientStats parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.ClientStats parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.grpclb.ClientStats parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.ClientStats parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -244,12 +250,12 @@
     return builder;
   }
   /**
-   * Protobuf type {@code grpc.lb.v1.ClientStats}
-   *
    * <pre>
    * Contains client level statistics that are useful to load balancing. Each
    * count should be reset to zero after reporting the stats.
    * </pre>
+   *
+   * Protobuf type {@code grpc.lb.v1.ClientStats}
    */
   public static final class Builder extends
       com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -355,7 +361,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.grpclb.ClientStats) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -366,21 +372,21 @@
 
     private long totalRequests_ ;
     /**
-     * <code>optional int64 total_requests = 1;</code>
-     *
      * <pre>
      * The total number of requests sent by the client since the last report.
      * </pre>
+     *
+     * <code>optional int64 total_requests = 1;</code>
      */
     public long getTotalRequests() {
       return totalRequests_;
     }
     /**
-     * <code>optional int64 total_requests = 1;</code>
-     *
      * <pre>
      * The total number of requests sent by the client since the last report.
      * </pre>
+     *
+     * <code>optional int64 total_requests = 1;</code>
      */
     public Builder setTotalRequests(long value) {
       
@@ -389,11 +395,11 @@
       return this;
     }
     /**
-     * <code>optional int64 total_requests = 1;</code>
-     *
      * <pre>
      * The total number of requests sent by the client since the last report.
      * </pre>
+     *
+     * <code>optional int64 total_requests = 1;</code>
      */
     public Builder clearTotalRequests() {
       
@@ -404,21 +410,21 @@
 
     private long clientRpcErrors_ ;
     /**
-     * <code>optional int64 client_rpc_errors = 2;</code>
-     *
      * <pre>
      * The number of client rpc errors since the last report.
      * </pre>
+     *
+     * <code>optional int64 client_rpc_errors = 2;</code>
      */
     public long getClientRpcErrors() {
       return clientRpcErrors_;
     }
     /**
-     * <code>optional int64 client_rpc_errors = 2;</code>
-     *
      * <pre>
      * The number of client rpc errors since the last report.
      * </pre>
+     *
+     * <code>optional int64 client_rpc_errors = 2;</code>
      */
     public Builder setClientRpcErrors(long value) {
       
@@ -427,11 +433,11 @@
       return this;
     }
     /**
-     * <code>optional int64 client_rpc_errors = 2;</code>
-     *
      * <pre>
      * The number of client rpc errors since the last report.
      * </pre>
+     *
+     * <code>optional int64 client_rpc_errors = 2;</code>
      */
     public Builder clearClientRpcErrors() {
       
@@ -442,21 +448,21 @@
 
     private long droppedRequests_ ;
     /**
-     * <code>optional int64 dropped_requests = 3;</code>
-     *
      * <pre>
      * The number of dropped requests since the last report.
      * </pre>
+     *
+     * <code>optional int64 dropped_requests = 3;</code>
      */
     public long getDroppedRequests() {
       return droppedRequests_;
     }
     /**
-     * <code>optional int64 dropped_requests = 3;</code>
-     *
      * <pre>
      * The number of dropped requests since the last report.
      * </pre>
+     *
+     * <code>optional int64 dropped_requests = 3;</code>
      */
     public Builder setDroppedRequests(long value) {
       
@@ -465,11 +471,11 @@
       return this;
     }
     /**
-     * <code>optional int64 dropped_requests = 3;</code>
-     *
      * <pre>
      * The number of dropped requests since the last report.
      * </pre>
+     *
+     * <code>optional int64 dropped_requests = 3;</code>
      */
     public Builder clearDroppedRequests() {
       
@@ -507,16 +513,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new ClientStats(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/ClientStatsOrBuilder.java b/grpclb/src/generated/main/java/io/grpc/grpclb/ClientStatsOrBuilder.java
index 27f0cfd..fd194b0 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/ClientStatsOrBuilder.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/ClientStatsOrBuilder.java
@@ -8,29 +8,29 @@
     com.google.protobuf.MessageOrBuilder {
 
   /**
-   * <code>optional int64 total_requests = 1;</code>
-   *
    * <pre>
    * The total number of requests sent by the client since the last report.
    * </pre>
+   *
+   * <code>optional int64 total_requests = 1;</code>
    */
   long getTotalRequests();
 
   /**
-   * <code>optional int64 client_rpc_errors = 2;</code>
-   *
    * <pre>
    * The number of client rpc errors since the last report.
    * </pre>
+   *
+   * <code>optional int64 client_rpc_errors = 2;</code>
    */
   long getClientRpcErrors();
 
   /**
-   * <code>optional int64 dropped_requests = 3;</code>
-   *
    * <pre>
    * The number of dropped requests since the last report.
    * </pre>
+   *
+   * <code>optional int64 dropped_requests = 3;</code>
    */
   long getDroppedRequests();
 }
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceRequest.java b/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceRequest.java
index 6208304..f09a492 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceRequest.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceRequest.java
@@ -25,7 +25,8 @@
   }
   private InitialLoadBalanceRequest(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -51,11 +52,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -75,11 +75,11 @@
   public static final int NAME_FIELD_NUMBER = 1;
   private volatile java.lang.Object name_;
   /**
-   * <code>optional string name = 1;</code>
-   *
    * <pre>
    * Name of load balanced service
    * </pre>
+   *
+   * <code>optional string name = 1;</code>
    */
   public java.lang.String getName() {
     java.lang.Object ref = name_;
@@ -94,11 +94,11 @@
     }
   }
   /**
-   * <code>optional string name = 1;</code>
-   *
    * <pre>
    * Name of load balanced service
    * </pre>
+   *
+   * <code>optional string name = 1;</code>
    */
   public com.google.protobuf.ByteString
       getNameBytes() {
@@ -167,34 +167,40 @@
   }
   public static io.grpc.grpclb.InitialLoadBalanceRequest parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.InitialLoadBalanceRequest parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.grpclb.InitialLoadBalanceRequest parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.InitialLoadBalanceRequest parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.grpclb.InitialLoadBalanceRequest parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.InitialLoadBalanceRequest parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -311,7 +317,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.grpclb.InitialLoadBalanceRequest) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -322,11 +328,11 @@
 
     private java.lang.Object name_ = "";
     /**
-     * <code>optional string name = 1;</code>
-     *
      * <pre>
      * Name of load balanced service
      * </pre>
+     *
+     * <code>optional string name = 1;</code>
      */
     public java.lang.String getName() {
       java.lang.Object ref = name_;
@@ -341,11 +347,11 @@
       }
     }
     /**
-     * <code>optional string name = 1;</code>
-     *
      * <pre>
      * Name of load balanced service
      * </pre>
+     *
+     * <code>optional string name = 1;</code>
      */
     public com.google.protobuf.ByteString
         getNameBytes() {
@@ -361,11 +367,11 @@
       }
     }
     /**
-     * <code>optional string name = 1;</code>
-     *
      * <pre>
      * Name of load balanced service
      * </pre>
+     *
+     * <code>optional string name = 1;</code>
      */
     public Builder setName(
         java.lang.String value) {
@@ -378,11 +384,11 @@
       return this;
     }
     /**
-     * <code>optional string name = 1;</code>
-     *
      * <pre>
      * Name of load balanced service
      * </pre>
+     *
+     * <code>optional string name = 1;</code>
      */
     public Builder clearName() {
       
@@ -391,11 +397,11 @@
       return this;
     }
     /**
-     * <code>optional string name = 1;</code>
-     *
      * <pre>
      * Name of load balanced service
      * </pre>
+     *
+     * <code>optional string name = 1;</code>
      */
     public Builder setNameBytes(
         com.google.protobuf.ByteString value) {
@@ -438,16 +444,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new InitialLoadBalanceRequest(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceRequestOrBuilder.java b/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceRequestOrBuilder.java
index 95da8de..122e698 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceRequestOrBuilder.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceRequestOrBuilder.java
@@ -8,19 +8,19 @@
     com.google.protobuf.MessageOrBuilder {
 
   /**
-   * <code>optional string name = 1;</code>
-   *
    * <pre>
    * Name of load balanced service
    * </pre>
+   *
+   * <code>optional string name = 1;</code>
    */
   java.lang.String getName();
   /**
-   * <code>optional string name = 1;</code>
-   *
    * <pre>
    * Name of load balanced service
    * </pre>
+   *
+   * <code>optional string name = 1;</code>
    */
   com.google.protobuf.ByteString
       getNameBytes();
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceResponse.java b/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceResponse.java
index c7aa0c8..b65fa70 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceResponse.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceResponse.java
@@ -24,7 +24,8 @@
   }
   private InitialLoadBalanceResponse(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -63,11 +64,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -90,16 +90,23 @@
       implements com.google.protobuf.Internal.EnumLite {
     LOAD_BALANCER_DELEGATE(2),
     INITIALRESPONSETYPE_NOT_SET(0);
-    private int value = 0;
+    private final int value;
     private InitialResponseTypeCase(int value) {
       this.value = value;
     }
+    /**
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
     public static InitialResponseTypeCase valueOf(int value) {
+      return forNumber(value);
+    }
+
+    public static InitialResponseTypeCase forNumber(int value) {
       switch (value) {
         case 2: return LOAD_BALANCER_DELEGATE;
         case 0: return INITIALRESPONSETYPE_NOT_SET;
-        default: throw new java.lang.IllegalArgumentException(
-          "Value is undefined for this oneof enum.");
+        default: return null;
       }
     }
     public int getNumber() {
@@ -109,20 +116,20 @@
 
   public InitialResponseTypeCase
   getInitialResponseTypeCase() {
-    return InitialResponseTypeCase.valueOf(
+    return InitialResponseTypeCase.forNumber(
         initialResponseTypeCase_);
   }
 
   public static final int LOAD_BALANCER_DELEGATE_FIELD_NUMBER = 2;
   /**
-   * <code>optional string load_balancer_delegate = 2;</code>
-   *
    * <pre>
    * This is an application layer redirect that indicates the client should
    * use the specified server for load balancing. When this field is set in
    * the response, the client should open a separate connection to the
    * load_balancer_delegate and call the BalanceLoad method.
    * </pre>
+   *
+   * <code>optional string load_balancer_delegate = 2;</code>
    */
   public java.lang.String getLoadBalancerDelegate() {
     java.lang.Object ref = "";
@@ -142,14 +149,14 @@
     }
   }
   /**
-   * <code>optional string load_balancer_delegate = 2;</code>
-   *
    * <pre>
    * This is an application layer redirect that indicates the client should
    * use the specified server for load balancing. When this field is set in
    * the response, the client should open a separate connection to the
    * load_balancer_delegate and call the BalanceLoad method.
    * </pre>
+   *
+   * <code>optional string load_balancer_delegate = 2;</code>
    */
   public com.google.protobuf.ByteString
       getLoadBalancerDelegateBytes() {
@@ -173,37 +180,37 @@
   public static final int CLIENT_STATS_REPORT_INTERVAL_FIELD_NUMBER = 3;
   private com.google.protobuf.Duration clientStatsReportInterval_;
   /**
-   * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-   *
    * <pre>
    * This interval defines how often the client should send the client stats
    * to the load balancer. Stats should only be reported when the duration is
    * positive.
    * </pre>
+   *
+   * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
    */
   public boolean hasClientStatsReportInterval() {
     return clientStatsReportInterval_ != null;
   }
   /**
-   * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-   *
    * <pre>
    * This interval defines how often the client should send the client stats
    * to the load balancer. Stats should only be reported when the duration is
    * positive.
    * </pre>
+   *
+   * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
    */
   public com.google.protobuf.Duration getClientStatsReportInterval() {
     return clientStatsReportInterval_ == null ? com.google.protobuf.Duration.getDefaultInstance() : clientStatsReportInterval_;
   }
   /**
-   * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-   *
    * <pre>
    * This interval defines how often the client should send the client stats
    * to the load balancer. Stats should only be reported when the duration is
    * positive.
    * </pre>
+   *
+   * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
    */
   public com.google.protobuf.DurationOrBuilder getClientStatsReportIntervalOrBuilder() {
     return getClientStatsReportInterval();
@@ -269,34 +276,40 @@
   }
   public static io.grpc.grpclb.InitialLoadBalanceResponse parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.InitialLoadBalanceResponse parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.grpclb.InitialLoadBalanceResponse parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.InitialLoadBalanceResponse parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.grpclb.InitialLoadBalanceResponse parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.InitialLoadBalanceResponse parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -437,7 +450,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.grpclb.InitialLoadBalanceResponse) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -449,7 +462,7 @@
     private java.lang.Object initialResponseType_;
     public InitialResponseTypeCase
         getInitialResponseTypeCase() {
-      return InitialResponseTypeCase.valueOf(
+      return InitialResponseTypeCase.forNumber(
           initialResponseTypeCase_);
     }
 
@@ -462,14 +475,14 @@
 
 
     /**
-     * <code>optional string load_balancer_delegate = 2;</code>
-     *
      * <pre>
      * This is an application layer redirect that indicates the client should
      * use the specified server for load balancing. When this field is set in
      * the response, the client should open a separate connection to the
      * load_balancer_delegate and call the BalanceLoad method.
      * </pre>
+     *
+     * <code>optional string load_balancer_delegate = 2;</code>
      */
     public java.lang.String getLoadBalancerDelegate() {
       java.lang.Object ref = "";
@@ -489,14 +502,14 @@
       }
     }
     /**
-     * <code>optional string load_balancer_delegate = 2;</code>
-     *
      * <pre>
      * This is an application layer redirect that indicates the client should
      * use the specified server for load balancing. When this field is set in
      * the response, the client should open a separate connection to the
      * load_balancer_delegate and call the BalanceLoad method.
      * </pre>
+     *
+     * <code>optional string load_balancer_delegate = 2;</code>
      */
     public com.google.protobuf.ByteString
         getLoadBalancerDelegateBytes() {
@@ -517,14 +530,14 @@
       }
     }
     /**
-     * <code>optional string load_balancer_delegate = 2;</code>
-     *
      * <pre>
      * This is an application layer redirect that indicates the client should
      * use the specified server for load balancing. When this field is set in
      * the response, the client should open a separate connection to the
      * load_balancer_delegate and call the BalanceLoad method.
      * </pre>
+     *
+     * <code>optional string load_balancer_delegate = 2;</code>
      */
     public Builder setLoadBalancerDelegate(
         java.lang.String value) {
@@ -537,14 +550,14 @@
       return this;
     }
     /**
-     * <code>optional string load_balancer_delegate = 2;</code>
-     *
      * <pre>
      * This is an application layer redirect that indicates the client should
      * use the specified server for load balancing. When this field is set in
      * the response, the client should open a separate connection to the
      * load_balancer_delegate and call the BalanceLoad method.
      * </pre>
+     *
+     * <code>optional string load_balancer_delegate = 2;</code>
      */
     public Builder clearLoadBalancerDelegate() {
       if (initialResponseTypeCase_ == 2) {
@@ -555,14 +568,14 @@
       return this;
     }
     /**
-     * <code>optional string load_balancer_delegate = 2;</code>
-     *
      * <pre>
      * This is an application layer redirect that indicates the client should
      * use the specified server for load balancing. When this field is set in
      * the response, the client should open a separate connection to the
      * load_balancer_delegate and call the BalanceLoad method.
      * </pre>
+     *
+     * <code>optional string load_balancer_delegate = 2;</code>
      */
     public Builder setLoadBalancerDelegateBytes(
         com.google.protobuf.ByteString value) {
@@ -580,25 +593,25 @@
     private com.google.protobuf.SingleFieldBuilder<
         com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder> clientStatsReportIntervalBuilder_;
     /**
-     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-     *
      * <pre>
      * This interval defines how often the client should send the client stats
      * to the load balancer. Stats should only be reported when the duration is
      * positive.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
      */
     public boolean hasClientStatsReportInterval() {
       return clientStatsReportIntervalBuilder_ != null || clientStatsReportInterval_ != null;
     }
     /**
-     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-     *
      * <pre>
      * This interval defines how often the client should send the client stats
      * to the load balancer. Stats should only be reported when the duration is
      * positive.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
      */
     public com.google.protobuf.Duration getClientStatsReportInterval() {
       if (clientStatsReportIntervalBuilder_ == null) {
@@ -608,13 +621,13 @@
       }
     }
     /**
-     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-     *
      * <pre>
      * This interval defines how often the client should send the client stats
      * to the load balancer. Stats should only be reported when the duration is
      * positive.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
      */
     public Builder setClientStatsReportInterval(com.google.protobuf.Duration value) {
       if (clientStatsReportIntervalBuilder_ == null) {
@@ -630,13 +643,13 @@
       return this;
     }
     /**
-     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-     *
      * <pre>
      * This interval defines how often the client should send the client stats
      * to the load balancer. Stats should only be reported when the duration is
      * positive.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
      */
     public Builder setClientStatsReportInterval(
         com.google.protobuf.Duration.Builder builderForValue) {
@@ -650,13 +663,13 @@
       return this;
     }
     /**
-     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-     *
      * <pre>
      * This interval defines how often the client should send the client stats
      * to the load balancer. Stats should only be reported when the duration is
      * positive.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
      */
     public Builder mergeClientStatsReportInterval(com.google.protobuf.Duration value) {
       if (clientStatsReportIntervalBuilder_ == null) {
@@ -674,13 +687,13 @@
       return this;
     }
     /**
-     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-     *
      * <pre>
      * This interval defines how often the client should send the client stats
      * to the load balancer. Stats should only be reported when the duration is
      * positive.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
      */
     public Builder clearClientStatsReportInterval() {
       if (clientStatsReportIntervalBuilder_ == null) {
@@ -694,13 +707,13 @@
       return this;
     }
     /**
-     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-     *
      * <pre>
      * This interval defines how often the client should send the client stats
      * to the load balancer. Stats should only be reported when the duration is
      * positive.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
      */
     public com.google.protobuf.Duration.Builder getClientStatsReportIntervalBuilder() {
       
@@ -708,13 +721,13 @@
       return getClientStatsReportIntervalFieldBuilder().getBuilder();
     }
     /**
-     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-     *
      * <pre>
      * This interval defines how often the client should send the client stats
      * to the load balancer. Stats should only be reported when the duration is
      * positive.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
      */
     public com.google.protobuf.DurationOrBuilder getClientStatsReportIntervalOrBuilder() {
       if (clientStatsReportIntervalBuilder_ != null) {
@@ -725,13 +738,13 @@
       }
     }
     /**
-     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-     *
      * <pre>
      * This interval defines how often the client should send the client stats
      * to the load balancer. Stats should only be reported when the duration is
      * positive.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
      */
     private com.google.protobuf.SingleFieldBuilder<
         com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder> 
@@ -776,16 +789,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new InitialLoadBalanceResponse(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceResponseOrBuilder.java b/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceResponseOrBuilder.java
index 77b06c8..7b49502 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceResponseOrBuilder.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/InitialLoadBalanceResponseOrBuilder.java
@@ -8,57 +8,57 @@
     com.google.protobuf.MessageOrBuilder {
 
   /**
-   * <code>optional string load_balancer_delegate = 2;</code>
-   *
    * <pre>
    * This is an application layer redirect that indicates the client should
    * use the specified server for load balancing. When this field is set in
    * the response, the client should open a separate connection to the
    * load_balancer_delegate and call the BalanceLoad method.
    * </pre>
+   *
+   * <code>optional string load_balancer_delegate = 2;</code>
    */
   java.lang.String getLoadBalancerDelegate();
   /**
-   * <code>optional string load_balancer_delegate = 2;</code>
-   *
    * <pre>
    * This is an application layer redirect that indicates the client should
    * use the specified server for load balancing. When this field is set in
    * the response, the client should open a separate connection to the
    * load_balancer_delegate and call the BalanceLoad method.
    * </pre>
+   *
+   * <code>optional string load_balancer_delegate = 2;</code>
    */
   com.google.protobuf.ByteString
       getLoadBalancerDelegateBytes();
 
   /**
-   * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-   *
    * <pre>
    * This interval defines how often the client should send the client stats
    * to the load balancer. Stats should only be reported when the duration is
    * positive.
    * </pre>
+   *
+   * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
    */
   boolean hasClientStatsReportInterval();
   /**
-   * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-   *
    * <pre>
    * This interval defines how often the client should send the client stats
    * to the load balancer. Stats should only be reported when the duration is
    * positive.
    * </pre>
+   *
+   * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
    */
   com.google.protobuf.Duration getClientStatsReportInterval();
   /**
-   * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
-   *
    * <pre>
    * This interval defines how often the client should send the client stats
    * to the load balancer. Stats should only be reported when the duration is
    * positive.
    * </pre>
+   *
+   * <code>optional .google.protobuf.Duration client_stats_report_interval = 3;</code>
    */
   com.google.protobuf.DurationOrBuilder getClientStatsReportIntervalOrBuilder();
 
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceRequest.java b/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceRequest.java
index 60b1c5a..1473a81 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceRequest.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceRequest.java
@@ -24,7 +24,8 @@
   }
   private LoadBalanceRequest(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -72,11 +73,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -100,17 +100,24 @@
     INITIAL_REQUEST(1),
     CLIENT_STATS(2),
     LOADBALANCEREQUESTTYPE_NOT_SET(0);
-    private int value = 0;
+    private final int value;
     private LoadBalanceRequestTypeCase(int value) {
       this.value = value;
     }
+    /**
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
     public static LoadBalanceRequestTypeCase valueOf(int value) {
+      return forNumber(value);
+    }
+
+    public static LoadBalanceRequestTypeCase forNumber(int value) {
       switch (value) {
         case 1: return INITIAL_REQUEST;
         case 2: return CLIENT_STATS;
         case 0: return LOADBALANCEREQUESTTYPE_NOT_SET;
-        default: throw new java.lang.IllegalArgumentException(
-          "Value is undefined for this oneof enum.");
+        default: return null;
       }
     }
     public int getNumber() {
@@ -120,17 +127,17 @@
 
   public LoadBalanceRequestTypeCase
   getLoadBalanceRequestTypeCase() {
-    return LoadBalanceRequestTypeCase.valueOf(
+    return LoadBalanceRequestTypeCase.forNumber(
         loadBalanceRequestTypeCase_);
   }
 
   public static final int INITIAL_REQUEST_FIELD_NUMBER = 1;
   /**
-   * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
-   *
    * <pre>
    * This message should be sent on the first request to the load balancer.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
    */
   public io.grpc.grpclb.InitialLoadBalanceRequest getInitialRequest() {
     if (loadBalanceRequestTypeCase_ == 1) {
@@ -139,11 +146,11 @@
     return io.grpc.grpclb.InitialLoadBalanceRequest.getDefaultInstance();
   }
   /**
-   * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
-   *
    * <pre>
    * This message should be sent on the first request to the load balancer.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
    */
   public io.grpc.grpclb.InitialLoadBalanceRequestOrBuilder getInitialRequestOrBuilder() {
     if (loadBalanceRequestTypeCase_ == 1) {
@@ -154,12 +161,12 @@
 
   public static final int CLIENT_STATS_FIELD_NUMBER = 2;
   /**
-   * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
-   *
    * <pre>
    * The client stats should be periodically reported to the load balancer
    * based on the duration defined in the InitialLoadBalanceResponse.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
    */
   public io.grpc.grpclb.ClientStats getClientStats() {
     if (loadBalanceRequestTypeCase_ == 2) {
@@ -168,12 +175,12 @@
     return io.grpc.grpclb.ClientStats.getDefaultInstance();
   }
   /**
-   * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
-   *
    * <pre>
    * The client stats should be periodically reported to the load balancer
    * based on the duration defined in the InitialLoadBalanceResponse.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
    */
   public io.grpc.grpclb.ClientStatsOrBuilder getClientStatsOrBuilder() {
     if (loadBalanceRequestTypeCase_ == 2) {
@@ -243,34 +250,40 @@
   }
   public static io.grpc.grpclb.LoadBalanceRequest parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.LoadBalanceRequest parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.grpclb.LoadBalanceRequest parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.LoadBalanceRequest parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.grpclb.LoadBalanceRequest parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.LoadBalanceRequest parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -410,7 +423,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.grpclb.LoadBalanceRequest) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -422,7 +435,7 @@
     private java.lang.Object loadBalanceRequestType_;
     public LoadBalanceRequestTypeCase
         getLoadBalanceRequestTypeCase() {
-      return LoadBalanceRequestTypeCase.valueOf(
+      return LoadBalanceRequestTypeCase.forNumber(
           loadBalanceRequestTypeCase_);
     }
 
@@ -437,11 +450,11 @@
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.grpclb.InitialLoadBalanceRequest, io.grpc.grpclb.InitialLoadBalanceRequest.Builder, io.grpc.grpclb.InitialLoadBalanceRequestOrBuilder> initialRequestBuilder_;
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first request to the load balancer.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
      */
     public io.grpc.grpclb.InitialLoadBalanceRequest getInitialRequest() {
       if (initialRequestBuilder_ == null) {
@@ -457,11 +470,11 @@
       }
     }
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first request to the load balancer.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
      */
     public Builder setInitialRequest(io.grpc.grpclb.InitialLoadBalanceRequest value) {
       if (initialRequestBuilder_ == null) {
@@ -477,11 +490,11 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first request to the load balancer.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
      */
     public Builder setInitialRequest(
         io.grpc.grpclb.InitialLoadBalanceRequest.Builder builderForValue) {
@@ -495,11 +508,11 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first request to the load balancer.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
      */
     public Builder mergeInitialRequest(io.grpc.grpclb.InitialLoadBalanceRequest value) {
       if (initialRequestBuilder_ == null) {
@@ -521,11 +534,11 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first request to the load balancer.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
      */
     public Builder clearInitialRequest() {
       if (initialRequestBuilder_ == null) {
@@ -544,21 +557,21 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first request to the load balancer.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
      */
     public io.grpc.grpclb.InitialLoadBalanceRequest.Builder getInitialRequestBuilder() {
       return getInitialRequestFieldBuilder().getBuilder();
     }
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first request to the load balancer.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
      */
     public io.grpc.grpclb.InitialLoadBalanceRequestOrBuilder getInitialRequestOrBuilder() {
       if ((loadBalanceRequestTypeCase_ == 1) && (initialRequestBuilder_ != null)) {
@@ -571,11 +584,11 @@
       }
     }
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first request to the load balancer.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
      */
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.grpclb.InitialLoadBalanceRequest, io.grpc.grpclb.InitialLoadBalanceRequest.Builder, io.grpc.grpclb.InitialLoadBalanceRequestOrBuilder> 
@@ -599,12 +612,12 @@
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.grpclb.ClientStats, io.grpc.grpclb.ClientStats.Builder, io.grpc.grpclb.ClientStatsOrBuilder> clientStatsBuilder_;
     /**
-     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
-     *
      * <pre>
      * The client stats should be periodically reported to the load balancer
      * based on the duration defined in the InitialLoadBalanceResponse.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
      */
     public io.grpc.grpclb.ClientStats getClientStats() {
       if (clientStatsBuilder_ == null) {
@@ -620,12 +633,12 @@
       }
     }
     /**
-     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
-     *
      * <pre>
      * The client stats should be periodically reported to the load balancer
      * based on the duration defined in the InitialLoadBalanceResponse.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
      */
     public Builder setClientStats(io.grpc.grpclb.ClientStats value) {
       if (clientStatsBuilder_ == null) {
@@ -641,12 +654,12 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
-     *
      * <pre>
      * The client stats should be periodically reported to the load balancer
      * based on the duration defined in the InitialLoadBalanceResponse.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
      */
     public Builder setClientStats(
         io.grpc.grpclb.ClientStats.Builder builderForValue) {
@@ -660,12 +673,12 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
-     *
      * <pre>
      * The client stats should be periodically reported to the load balancer
      * based on the duration defined in the InitialLoadBalanceResponse.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
      */
     public Builder mergeClientStats(io.grpc.grpclb.ClientStats value) {
       if (clientStatsBuilder_ == null) {
@@ -687,12 +700,12 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
-     *
      * <pre>
      * The client stats should be periodically reported to the load balancer
      * based on the duration defined in the InitialLoadBalanceResponse.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
      */
     public Builder clearClientStats() {
       if (clientStatsBuilder_ == null) {
@@ -711,23 +724,23 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
-     *
      * <pre>
      * The client stats should be periodically reported to the load balancer
      * based on the duration defined in the InitialLoadBalanceResponse.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
      */
     public io.grpc.grpclb.ClientStats.Builder getClientStatsBuilder() {
       return getClientStatsFieldBuilder().getBuilder();
     }
     /**
-     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
-     *
      * <pre>
      * The client stats should be periodically reported to the load balancer
      * based on the duration defined in the InitialLoadBalanceResponse.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
      */
     public io.grpc.grpclb.ClientStatsOrBuilder getClientStatsOrBuilder() {
       if ((loadBalanceRequestTypeCase_ == 2) && (clientStatsBuilder_ != null)) {
@@ -740,12 +753,12 @@
       }
     }
     /**
-     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
-     *
      * <pre>
      * The client stats should be periodically reported to the load balancer
      * based on the duration defined in the InitialLoadBalanceResponse.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
      */
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.grpclb.ClientStats, io.grpc.grpclb.ClientStats.Builder, io.grpc.grpclb.ClientStatsOrBuilder> 
@@ -795,16 +808,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new LoadBalanceRequest(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceRequestOrBuilder.java b/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceRequestOrBuilder.java
index 4a1f99e..2b417db 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceRequestOrBuilder.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceRequestOrBuilder.java
@@ -8,38 +8,38 @@
     com.google.protobuf.MessageOrBuilder {
 
   /**
-   * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
-   *
    * <pre>
    * This message should be sent on the first request to the load balancer.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
    */
   io.grpc.grpclb.InitialLoadBalanceRequest getInitialRequest();
   /**
-   * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
-   *
    * <pre>
    * This message should be sent on the first request to the load balancer.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.InitialLoadBalanceRequest initial_request = 1;</code>
    */
   io.grpc.grpclb.InitialLoadBalanceRequestOrBuilder getInitialRequestOrBuilder();
 
   /**
-   * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
-   *
    * <pre>
    * The client stats should be periodically reported to the load balancer
    * based on the duration defined in the InitialLoadBalanceResponse.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
    */
   io.grpc.grpclb.ClientStats getClientStats();
   /**
-   * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
-   *
    * <pre>
    * The client stats should be periodically reported to the load balancer
    * based on the duration defined in the InitialLoadBalanceResponse.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.ClientStats client_stats = 2;</code>
    */
   io.grpc.grpclb.ClientStatsOrBuilder getClientStatsOrBuilder();
 
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceResponse.java b/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceResponse.java
index 0444117..422a922 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceResponse.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceResponse.java
@@ -24,7 +24,8 @@
   }
   private LoadBalanceResponse(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -72,11 +73,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -100,17 +100,24 @@
     INITIAL_RESPONSE(1),
     SERVER_LIST(2),
     LOADBALANCERESPONSETYPE_NOT_SET(0);
-    private int value = 0;
+    private final int value;
     private LoadBalanceResponseTypeCase(int value) {
       this.value = value;
     }
+    /**
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
     public static LoadBalanceResponseTypeCase valueOf(int value) {
+      return forNumber(value);
+    }
+
+    public static LoadBalanceResponseTypeCase forNumber(int value) {
       switch (value) {
         case 1: return INITIAL_RESPONSE;
         case 2: return SERVER_LIST;
         case 0: return LOADBALANCERESPONSETYPE_NOT_SET;
-        default: throw new java.lang.IllegalArgumentException(
-          "Value is undefined for this oneof enum.");
+        default: return null;
       }
     }
     public int getNumber() {
@@ -120,17 +127,17 @@
 
   public LoadBalanceResponseTypeCase
   getLoadBalanceResponseTypeCase() {
-    return LoadBalanceResponseTypeCase.valueOf(
+    return LoadBalanceResponseTypeCase.forNumber(
         loadBalanceResponseTypeCase_);
   }
 
   public static final int INITIAL_RESPONSE_FIELD_NUMBER = 1;
   /**
-   * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
-   *
    * <pre>
    * This message should be sent on the first response to the client.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
    */
   public io.grpc.grpclb.InitialLoadBalanceResponse getInitialResponse() {
     if (loadBalanceResponseTypeCase_ == 1) {
@@ -139,11 +146,11 @@
     return io.grpc.grpclb.InitialLoadBalanceResponse.getDefaultInstance();
   }
   /**
-   * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
-   *
    * <pre>
    * This message should be sent on the first response to the client.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
    */
   public io.grpc.grpclb.InitialLoadBalanceResponseOrBuilder getInitialResponseOrBuilder() {
     if (loadBalanceResponseTypeCase_ == 1) {
@@ -154,12 +161,12 @@
 
   public static final int SERVER_LIST_FIELD_NUMBER = 2;
   /**
-   * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
-   *
    * <pre>
    * Contains the list of servers selected by the load balancer. The client
    * should send requests to these servers in the specified order.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
    */
   public io.grpc.grpclb.ServerList getServerList() {
     if (loadBalanceResponseTypeCase_ == 2) {
@@ -168,12 +175,12 @@
     return io.grpc.grpclb.ServerList.getDefaultInstance();
   }
   /**
-   * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
-   *
    * <pre>
    * Contains the list of servers selected by the load balancer. The client
    * should send requests to these servers in the specified order.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
    */
   public io.grpc.grpclb.ServerListOrBuilder getServerListOrBuilder() {
     if (loadBalanceResponseTypeCase_ == 2) {
@@ -243,34 +250,40 @@
   }
   public static io.grpc.grpclb.LoadBalanceResponse parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.LoadBalanceResponse parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.grpclb.LoadBalanceResponse parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.LoadBalanceResponse parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.grpclb.LoadBalanceResponse parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.LoadBalanceResponse parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -410,7 +423,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.grpclb.LoadBalanceResponse) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -422,7 +435,7 @@
     private java.lang.Object loadBalanceResponseType_;
     public LoadBalanceResponseTypeCase
         getLoadBalanceResponseTypeCase() {
-      return LoadBalanceResponseTypeCase.valueOf(
+      return LoadBalanceResponseTypeCase.forNumber(
           loadBalanceResponseTypeCase_);
     }
 
@@ -437,11 +450,11 @@
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.grpclb.InitialLoadBalanceResponse, io.grpc.grpclb.InitialLoadBalanceResponse.Builder, io.grpc.grpclb.InitialLoadBalanceResponseOrBuilder> initialResponseBuilder_;
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first response to the client.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
      */
     public io.grpc.grpclb.InitialLoadBalanceResponse getInitialResponse() {
       if (initialResponseBuilder_ == null) {
@@ -457,11 +470,11 @@
       }
     }
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first response to the client.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
      */
     public Builder setInitialResponse(io.grpc.grpclb.InitialLoadBalanceResponse value) {
       if (initialResponseBuilder_ == null) {
@@ -477,11 +490,11 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first response to the client.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
      */
     public Builder setInitialResponse(
         io.grpc.grpclb.InitialLoadBalanceResponse.Builder builderForValue) {
@@ -495,11 +508,11 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first response to the client.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
      */
     public Builder mergeInitialResponse(io.grpc.grpclb.InitialLoadBalanceResponse value) {
       if (initialResponseBuilder_ == null) {
@@ -521,11 +534,11 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first response to the client.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
      */
     public Builder clearInitialResponse() {
       if (initialResponseBuilder_ == null) {
@@ -544,21 +557,21 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first response to the client.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
      */
     public io.grpc.grpclb.InitialLoadBalanceResponse.Builder getInitialResponseBuilder() {
       return getInitialResponseFieldBuilder().getBuilder();
     }
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first response to the client.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
      */
     public io.grpc.grpclb.InitialLoadBalanceResponseOrBuilder getInitialResponseOrBuilder() {
       if ((loadBalanceResponseTypeCase_ == 1) && (initialResponseBuilder_ != null)) {
@@ -571,11 +584,11 @@
       }
     }
     /**
-     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
-     *
      * <pre>
      * This message should be sent on the first response to the client.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
      */
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.grpclb.InitialLoadBalanceResponse, io.grpc.grpclb.InitialLoadBalanceResponse.Builder, io.grpc.grpclb.InitialLoadBalanceResponseOrBuilder> 
@@ -599,12 +612,12 @@
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.grpclb.ServerList, io.grpc.grpclb.ServerList.Builder, io.grpc.grpclb.ServerListOrBuilder> serverListBuilder_;
     /**
-     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
-     *
      * <pre>
      * Contains the list of servers selected by the load balancer. The client
      * should send requests to these servers in the specified order.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
      */
     public io.grpc.grpclb.ServerList getServerList() {
       if (serverListBuilder_ == null) {
@@ -620,12 +633,12 @@
       }
     }
     /**
-     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
-     *
      * <pre>
      * Contains the list of servers selected by the load balancer. The client
      * should send requests to these servers in the specified order.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
      */
     public Builder setServerList(io.grpc.grpclb.ServerList value) {
       if (serverListBuilder_ == null) {
@@ -641,12 +654,12 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
-     *
      * <pre>
      * Contains the list of servers selected by the load balancer. The client
      * should send requests to these servers in the specified order.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
      */
     public Builder setServerList(
         io.grpc.grpclb.ServerList.Builder builderForValue) {
@@ -660,12 +673,12 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
-     *
      * <pre>
      * Contains the list of servers selected by the load balancer. The client
      * should send requests to these servers in the specified order.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
      */
     public Builder mergeServerList(io.grpc.grpclb.ServerList value) {
       if (serverListBuilder_ == null) {
@@ -687,12 +700,12 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
-     *
      * <pre>
      * Contains the list of servers selected by the load balancer. The client
      * should send requests to these servers in the specified order.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
      */
     public Builder clearServerList() {
       if (serverListBuilder_ == null) {
@@ -711,23 +724,23 @@
       return this;
     }
     /**
-     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
-     *
      * <pre>
      * Contains the list of servers selected by the load balancer. The client
      * should send requests to these servers in the specified order.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
      */
     public io.grpc.grpclb.ServerList.Builder getServerListBuilder() {
       return getServerListFieldBuilder().getBuilder();
     }
     /**
-     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
-     *
      * <pre>
      * Contains the list of servers selected by the load balancer. The client
      * should send requests to these servers in the specified order.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
      */
     public io.grpc.grpclb.ServerListOrBuilder getServerListOrBuilder() {
       if ((loadBalanceResponseTypeCase_ == 2) && (serverListBuilder_ != null)) {
@@ -740,12 +753,12 @@
       }
     }
     /**
-     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
-     *
      * <pre>
      * Contains the list of servers selected by the load balancer. The client
      * should send requests to these servers in the specified order.
      * </pre>
+     *
+     * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
      */
     private com.google.protobuf.SingleFieldBuilder<
         io.grpc.grpclb.ServerList, io.grpc.grpclb.ServerList.Builder, io.grpc.grpclb.ServerListOrBuilder> 
@@ -795,16 +808,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new LoadBalanceResponse(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceResponseOrBuilder.java b/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceResponseOrBuilder.java
index 463cb3d..18a7653 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceResponseOrBuilder.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalanceResponseOrBuilder.java
@@ -8,38 +8,38 @@
     com.google.protobuf.MessageOrBuilder {
 
   /**
-   * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
-   *
    * <pre>
    * This message should be sent on the first response to the client.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
    */
   io.grpc.grpclb.InitialLoadBalanceResponse getInitialResponse();
   /**
-   * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
-   *
    * <pre>
    * This message should be sent on the first response to the client.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.InitialLoadBalanceResponse initial_response = 1;</code>
    */
   io.grpc.grpclb.InitialLoadBalanceResponseOrBuilder getInitialResponseOrBuilder();
 
   /**
-   * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
-   *
    * <pre>
    * Contains the list of servers selected by the load balancer. The client
    * should send requests to these servers in the specified order.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
    */
   io.grpc.grpclb.ServerList getServerList();
   /**
-   * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
-   *
    * <pre>
    * Contains the list of servers selected by the load balancer. The client
    * should send requests to these servers in the specified order.
    * </pre>
+   *
+   * <code>optional .grpc.lb.v1.ServerList server_list = 2;</code>
    */
   io.grpc.grpclb.ServerListOrBuilder getServerListOrBuilder();
 
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalancerProto.java b/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalancerProto.java
index 0720a54..0cf679f 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalancerProto.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/LoadBalancerProto.java
@@ -8,39 +8,39 @@
   public static void registerAllExtensions(
       com.google.protobuf.ExtensionRegistry registry) {
   }
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_lb_v1_LoadBalanceRequest_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_lb_v1_LoadBalanceRequest_fieldAccessorTable;
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_lb_v1_InitialLoadBalanceRequest_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_lb_v1_InitialLoadBalanceRequest_fieldAccessorTable;
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_lb_v1_ClientStats_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_lb_v1_ClientStats_fieldAccessorTable;
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_lb_v1_LoadBalanceResponse_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_lb_v1_LoadBalanceResponse_fieldAccessorTable;
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_lb_v1_InitialLoadBalanceResponse_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_lb_v1_InitialLoadBalanceResponse_fieldAccessorTable;
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_lb_v1_ServerList_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_lb_v1_ServerList_fieldAccessorTable;
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_lb_v1_Server_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_lb_v1_Server_fieldAccessorTable;
 
@@ -48,7 +48,7 @@
       getDescriptor() {
     return descriptor;
   }
-  private static com.google.protobuf.Descriptors.FileDescriptor
+  private static  com.google.protobuf.Descriptors.FileDescriptor
       descriptor;
   static {
     java.lang.String[] descriptorData = {
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/Server.java b/grpclb/src/generated/main/java/io/grpc/grpclb/Server.java
index 1eb8826..8e876d2 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/Server.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/Server.java
@@ -28,7 +28,8 @@
   }
   private Server(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -69,11 +70,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -93,12 +93,12 @@
   public static final int IP_ADDRESS_FIELD_NUMBER = 1;
   private com.google.protobuf.ByteString ipAddress_;
   /**
-   * <code>optional bytes ip_address = 1;</code>
-   *
    * <pre>
    * A resolved address for the server, serialized in network-byte-order. It may
    * either be an IPv4 or IPv6 address.
    * </pre>
+   *
+   * <code>optional bytes ip_address = 1;</code>
    */
   public com.google.protobuf.ByteString getIpAddress() {
     return ipAddress_;
@@ -107,11 +107,11 @@
   public static final int PORT_FIELD_NUMBER = 2;
   private int port_;
   /**
-   * <code>optional int32 port = 2;</code>
-   *
    * <pre>
    * A resolved port number for the server.
    * </pre>
+   *
+   * <code>optional int32 port = 2;</code>
    */
   public int getPort() {
     return port_;
@@ -120,13 +120,13 @@
   public static final int LOAD_BALANCE_TOKEN_FIELD_NUMBER = 3;
   private volatile java.lang.Object loadBalanceToken_;
   /**
-   * <code>optional string load_balance_token = 3;</code>
-   *
    * <pre>
    * An opaque token that is passed from the client to the server in metadata.
    * The server may expect this token to indicate that the request from the
    * client was load balanced.
    * </pre>
+   *
+   * <code>optional string load_balance_token = 3;</code>
    */
   public java.lang.String getLoadBalanceToken() {
     java.lang.Object ref = loadBalanceToken_;
@@ -141,13 +141,13 @@
     }
   }
   /**
-   * <code>optional string load_balance_token = 3;</code>
-   *
    * <pre>
    * An opaque token that is passed from the client to the server in metadata.
    * The server may expect this token to indicate that the request from the
    * client was load balanced.
    * </pre>
+   *
+   * <code>optional string load_balance_token = 3;</code>
    */
   public com.google.protobuf.ByteString
       getLoadBalanceTokenBytes() {
@@ -166,12 +166,12 @@
   public static final int DROP_REQUEST_FIELD_NUMBER = 4;
   private boolean dropRequest_;
   /**
-   * <code>optional bool drop_request = 4;</code>
-   *
    * <pre>
    * Indicates whether this particular request should be dropped by the client
    * when this server is chosen from the list.
    * </pre>
+   *
+   * <code>optional bool drop_request = 4;</code>
    */
   public boolean getDropRequest() {
     return dropRequest_;
@@ -251,34 +251,40 @@
   }
   public static io.grpc.grpclb.Server parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.Server parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.grpclb.Server parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.Server parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.grpclb.Server parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.Server parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -413,7 +419,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.grpclb.Server) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -424,23 +430,23 @@
 
     private com.google.protobuf.ByteString ipAddress_ = com.google.protobuf.ByteString.EMPTY;
     /**
-     * <code>optional bytes ip_address = 1;</code>
-     *
      * <pre>
      * A resolved address for the server, serialized in network-byte-order. It may
      * either be an IPv4 or IPv6 address.
      * </pre>
+     *
+     * <code>optional bytes ip_address = 1;</code>
      */
     public com.google.protobuf.ByteString getIpAddress() {
       return ipAddress_;
     }
     /**
-     * <code>optional bytes ip_address = 1;</code>
-     *
      * <pre>
      * A resolved address for the server, serialized in network-byte-order. It may
      * either be an IPv4 or IPv6 address.
      * </pre>
+     *
+     * <code>optional bytes ip_address = 1;</code>
      */
     public Builder setIpAddress(com.google.protobuf.ByteString value) {
       if (value == null) {
@@ -452,12 +458,12 @@
       return this;
     }
     /**
-     * <code>optional bytes ip_address = 1;</code>
-     *
      * <pre>
      * A resolved address for the server, serialized in network-byte-order. It may
      * either be an IPv4 or IPv6 address.
      * </pre>
+     *
+     * <code>optional bytes ip_address = 1;</code>
      */
     public Builder clearIpAddress() {
       
@@ -468,21 +474,21 @@
 
     private int port_ ;
     /**
-     * <code>optional int32 port = 2;</code>
-     *
      * <pre>
      * A resolved port number for the server.
      * </pre>
+     *
+     * <code>optional int32 port = 2;</code>
      */
     public int getPort() {
       return port_;
     }
     /**
-     * <code>optional int32 port = 2;</code>
-     *
      * <pre>
      * A resolved port number for the server.
      * </pre>
+     *
+     * <code>optional int32 port = 2;</code>
      */
     public Builder setPort(int value) {
       
@@ -491,11 +497,11 @@
       return this;
     }
     /**
-     * <code>optional int32 port = 2;</code>
-     *
      * <pre>
      * A resolved port number for the server.
      * </pre>
+     *
+     * <code>optional int32 port = 2;</code>
      */
     public Builder clearPort() {
       
@@ -506,13 +512,13 @@
 
     private java.lang.Object loadBalanceToken_ = "";
     /**
-     * <code>optional string load_balance_token = 3;</code>
-     *
      * <pre>
      * An opaque token that is passed from the client to the server in metadata.
      * The server may expect this token to indicate that the request from the
      * client was load balanced.
      * </pre>
+     *
+     * <code>optional string load_balance_token = 3;</code>
      */
     public java.lang.String getLoadBalanceToken() {
       java.lang.Object ref = loadBalanceToken_;
@@ -527,13 +533,13 @@
       }
     }
     /**
-     * <code>optional string load_balance_token = 3;</code>
-     *
      * <pre>
      * An opaque token that is passed from the client to the server in metadata.
      * The server may expect this token to indicate that the request from the
      * client was load balanced.
      * </pre>
+     *
+     * <code>optional string load_balance_token = 3;</code>
      */
     public com.google.protobuf.ByteString
         getLoadBalanceTokenBytes() {
@@ -549,13 +555,13 @@
       }
     }
     /**
-     * <code>optional string load_balance_token = 3;</code>
-     *
      * <pre>
      * An opaque token that is passed from the client to the server in metadata.
      * The server may expect this token to indicate that the request from the
      * client was load balanced.
      * </pre>
+     *
+     * <code>optional string load_balance_token = 3;</code>
      */
     public Builder setLoadBalanceToken(
         java.lang.String value) {
@@ -568,13 +574,13 @@
       return this;
     }
     /**
-     * <code>optional string load_balance_token = 3;</code>
-     *
      * <pre>
      * An opaque token that is passed from the client to the server in metadata.
      * The server may expect this token to indicate that the request from the
      * client was load balanced.
      * </pre>
+     *
+     * <code>optional string load_balance_token = 3;</code>
      */
     public Builder clearLoadBalanceToken() {
       
@@ -583,13 +589,13 @@
       return this;
     }
     /**
-     * <code>optional string load_balance_token = 3;</code>
-     *
      * <pre>
      * An opaque token that is passed from the client to the server in metadata.
      * The server may expect this token to indicate that the request from the
      * client was load balanced.
      * </pre>
+     *
+     * <code>optional string load_balance_token = 3;</code>
      */
     public Builder setLoadBalanceTokenBytes(
         com.google.protobuf.ByteString value) {
@@ -605,23 +611,23 @@
 
     private boolean dropRequest_ ;
     /**
-     * <code>optional bool drop_request = 4;</code>
-     *
      * <pre>
      * Indicates whether this particular request should be dropped by the client
      * when this server is chosen from the list.
      * </pre>
+     *
+     * <code>optional bool drop_request = 4;</code>
      */
     public boolean getDropRequest() {
       return dropRequest_;
     }
     /**
-     * <code>optional bool drop_request = 4;</code>
-     *
      * <pre>
      * Indicates whether this particular request should be dropped by the client
      * when this server is chosen from the list.
      * </pre>
+     *
+     * <code>optional bool drop_request = 4;</code>
      */
     public Builder setDropRequest(boolean value) {
       
@@ -630,12 +636,12 @@
       return this;
     }
     /**
-     * <code>optional bool drop_request = 4;</code>
-     *
      * <pre>
      * Indicates whether this particular request should be dropped by the client
      * when this server is chosen from the list.
      * </pre>
+     *
+     * <code>optional bool drop_request = 4;</code>
      */
     public Builder clearDropRequest() {
       
@@ -673,16 +679,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new Server(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/ServerList.java b/grpclb/src/generated/main/java/io/grpc/grpclb/ServerList.java
index 9599427..69a66d2 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/ServerList.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/ServerList.java
@@ -25,7 +25,8 @@
   }
   private ServerList(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -66,11 +67,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) {
         servers_ = java.util.Collections.unmodifiableList(servers_);
@@ -94,67 +94,67 @@
   public static final int SERVERS_FIELD_NUMBER = 1;
   private java.util.List<io.grpc.grpclb.Server> servers_;
   /**
-   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-   *
    * <pre>
    * Contains a list of servers selected by the load balancer. The list will
    * be updated when server resolutions change or as needed to balance load
    * across more servers. The client should consume the server list in order
    * unless instructed otherwise via the client_config.
    * </pre>
+   *
+   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
    */
   public java.util.List<io.grpc.grpclb.Server> getServersList() {
     return servers_;
   }
   /**
-   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-   *
    * <pre>
    * Contains a list of servers selected by the load balancer. The list will
    * be updated when server resolutions change or as needed to balance load
    * across more servers. The client should consume the server list in order
    * unless instructed otherwise via the client_config.
    * </pre>
+   *
+   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
    */
   public java.util.List<? extends io.grpc.grpclb.ServerOrBuilder> 
       getServersOrBuilderList() {
     return servers_;
   }
   /**
-   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-   *
    * <pre>
    * Contains a list of servers selected by the load balancer. The list will
    * be updated when server resolutions change or as needed to balance load
    * across more servers. The client should consume the server list in order
    * unless instructed otherwise via the client_config.
    * </pre>
+   *
+   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
    */
   public int getServersCount() {
     return servers_.size();
   }
   /**
-   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-   *
    * <pre>
    * Contains a list of servers selected by the load balancer. The list will
    * be updated when server resolutions change or as needed to balance load
    * across more servers. The client should consume the server list in order
    * unless instructed otherwise via the client_config.
    * </pre>
+   *
+   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
    */
   public io.grpc.grpclb.Server getServers(int index) {
     return servers_.get(index);
   }
   /**
-   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-   *
    * <pre>
    * Contains a list of servers selected by the load balancer. The list will
    * be updated when server resolutions change or as needed to balance load
    * across more servers. The client should consume the server list in order
    * unless instructed otherwise via the client_config.
    * </pre>
+   *
+   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
    */
   public io.grpc.grpclb.ServerOrBuilder getServersOrBuilder(
       int index) {
@@ -164,40 +164,40 @@
   public static final int EXPIRATION_INTERVAL_FIELD_NUMBER = 3;
   private com.google.protobuf.Duration expirationInterval_;
   /**
-   * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-   *
    * <pre>
    * Indicates the amount of time that the client should consider this server
    * list as valid. It may be considered stale after waiting this interval of
    * time after receiving the list. If the interval is not positive, the
    * client can assume the list is valid until the next list is received.
    * </pre>
+   *
+   * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
    */
   public boolean hasExpirationInterval() {
     return expirationInterval_ != null;
   }
   /**
-   * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-   *
    * <pre>
    * Indicates the amount of time that the client should consider this server
    * list as valid. It may be considered stale after waiting this interval of
    * time after receiving the list. If the interval is not positive, the
    * client can assume the list is valid until the next list is received.
    * </pre>
+   *
+   * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
    */
   public com.google.protobuf.Duration getExpirationInterval() {
     return expirationInterval_ == null ? com.google.protobuf.Duration.getDefaultInstance() : expirationInterval_;
   }
   /**
-   * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-   *
    * <pre>
    * Indicates the amount of time that the client should consider this server
    * list as valid. It may be considered stale after waiting this interval of
    * time after receiving the list. If the interval is not positive, the
    * client can assume the list is valid until the next list is received.
    * </pre>
+   *
+   * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
    */
   public com.google.protobuf.DurationOrBuilder getExpirationIntervalOrBuilder() {
     return getExpirationInterval();
@@ -264,34 +264,40 @@
   }
   public static io.grpc.grpclb.ServerList parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.ServerList parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.grpclb.ServerList parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.ServerList parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.grpclb.ServerList parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.grpclb.ServerList parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -460,7 +466,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.grpclb.ServerList) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -483,14 +489,14 @@
         io.grpc.grpclb.Server, io.grpc.grpclb.Server.Builder, io.grpc.grpclb.ServerOrBuilder> serversBuilder_;
 
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public java.util.List<io.grpc.grpclb.Server> getServersList() {
       if (serversBuilder_ == null) {
@@ -500,14 +506,14 @@
       }
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public int getServersCount() {
       if (serversBuilder_ == null) {
@@ -517,14 +523,14 @@
       }
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public io.grpc.grpclb.Server getServers(int index) {
       if (serversBuilder_ == null) {
@@ -534,14 +540,14 @@
       }
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public Builder setServers(
         int index, io.grpc.grpclb.Server value) {
@@ -558,14 +564,14 @@
       return this;
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public Builder setServers(
         int index, io.grpc.grpclb.Server.Builder builderForValue) {
@@ -579,14 +585,14 @@
       return this;
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public Builder addServers(io.grpc.grpclb.Server value) {
       if (serversBuilder_ == null) {
@@ -602,14 +608,14 @@
       return this;
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public Builder addServers(
         int index, io.grpc.grpclb.Server value) {
@@ -626,14 +632,14 @@
       return this;
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public Builder addServers(
         io.grpc.grpclb.Server.Builder builderForValue) {
@@ -647,14 +653,14 @@
       return this;
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public Builder addServers(
         int index, io.grpc.grpclb.Server.Builder builderForValue) {
@@ -668,14 +674,14 @@
       return this;
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public Builder addAllServers(
         java.lang.Iterable<? extends io.grpc.grpclb.Server> values) {
@@ -690,14 +696,14 @@
       return this;
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public Builder clearServers() {
       if (serversBuilder_ == null) {
@@ -710,14 +716,14 @@
       return this;
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public Builder removeServers(int index) {
       if (serversBuilder_ == null) {
@@ -730,28 +736,28 @@
       return this;
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public io.grpc.grpclb.Server.Builder getServersBuilder(
         int index) {
       return getServersFieldBuilder().getBuilder(index);
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public io.grpc.grpclb.ServerOrBuilder getServersOrBuilder(
         int index) {
@@ -761,14 +767,14 @@
       }
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public java.util.List<? extends io.grpc.grpclb.ServerOrBuilder> 
          getServersOrBuilderList() {
@@ -779,28 +785,28 @@
       }
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public io.grpc.grpclb.Server.Builder addServersBuilder() {
       return getServersFieldBuilder().addBuilder(
           io.grpc.grpclb.Server.getDefaultInstance());
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public io.grpc.grpclb.Server.Builder addServersBuilder(
         int index) {
@@ -808,14 +814,14 @@
           index, io.grpc.grpclb.Server.getDefaultInstance());
     }
     /**
-     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-     *
      * <pre>
      * Contains a list of servers selected by the load balancer. The list will
      * be updated when server resolutions change or as needed to balance load
      * across more servers. The client should consume the server list in order
      * unless instructed otherwise via the client_config.
      * </pre>
+     *
+     * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
      */
     public java.util.List<io.grpc.grpclb.Server.Builder> 
          getServersBuilderList() {
@@ -840,27 +846,27 @@
     private com.google.protobuf.SingleFieldBuilder<
         com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder> expirationIntervalBuilder_;
     /**
-     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-     *
      * <pre>
      * Indicates the amount of time that the client should consider this server
      * list as valid. It may be considered stale after waiting this interval of
      * time after receiving the list. If the interval is not positive, the
      * client can assume the list is valid until the next list is received.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
      */
     public boolean hasExpirationInterval() {
       return expirationIntervalBuilder_ != null || expirationInterval_ != null;
     }
     /**
-     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-     *
      * <pre>
      * Indicates the amount of time that the client should consider this server
      * list as valid. It may be considered stale after waiting this interval of
      * time after receiving the list. If the interval is not positive, the
      * client can assume the list is valid until the next list is received.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
      */
     public com.google.protobuf.Duration getExpirationInterval() {
       if (expirationIntervalBuilder_ == null) {
@@ -870,14 +876,14 @@
       }
     }
     /**
-     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-     *
      * <pre>
      * Indicates the amount of time that the client should consider this server
      * list as valid. It may be considered stale after waiting this interval of
      * time after receiving the list. If the interval is not positive, the
      * client can assume the list is valid until the next list is received.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
      */
     public Builder setExpirationInterval(com.google.protobuf.Duration value) {
       if (expirationIntervalBuilder_ == null) {
@@ -893,14 +899,14 @@
       return this;
     }
     /**
-     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-     *
      * <pre>
      * Indicates the amount of time that the client should consider this server
      * list as valid. It may be considered stale after waiting this interval of
      * time after receiving the list. If the interval is not positive, the
      * client can assume the list is valid until the next list is received.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
      */
     public Builder setExpirationInterval(
         com.google.protobuf.Duration.Builder builderForValue) {
@@ -914,14 +920,14 @@
       return this;
     }
     /**
-     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-     *
      * <pre>
      * Indicates the amount of time that the client should consider this server
      * list as valid. It may be considered stale after waiting this interval of
      * time after receiving the list. If the interval is not positive, the
      * client can assume the list is valid until the next list is received.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
      */
     public Builder mergeExpirationInterval(com.google.protobuf.Duration value) {
       if (expirationIntervalBuilder_ == null) {
@@ -939,14 +945,14 @@
       return this;
     }
     /**
-     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-     *
      * <pre>
      * Indicates the amount of time that the client should consider this server
      * list as valid. It may be considered stale after waiting this interval of
      * time after receiving the list. If the interval is not positive, the
      * client can assume the list is valid until the next list is received.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
      */
     public Builder clearExpirationInterval() {
       if (expirationIntervalBuilder_ == null) {
@@ -960,14 +966,14 @@
       return this;
     }
     /**
-     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-     *
      * <pre>
      * Indicates the amount of time that the client should consider this server
      * list as valid. It may be considered stale after waiting this interval of
      * time after receiving the list. If the interval is not positive, the
      * client can assume the list is valid until the next list is received.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
      */
     public com.google.protobuf.Duration.Builder getExpirationIntervalBuilder() {
       
@@ -975,14 +981,14 @@
       return getExpirationIntervalFieldBuilder().getBuilder();
     }
     /**
-     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-     *
      * <pre>
      * Indicates the amount of time that the client should consider this server
      * list as valid. It may be considered stale after waiting this interval of
      * time after receiving the list. If the interval is not positive, the
      * client can assume the list is valid until the next list is received.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
      */
     public com.google.protobuf.DurationOrBuilder getExpirationIntervalOrBuilder() {
       if (expirationIntervalBuilder_ != null) {
@@ -993,14 +999,14 @@
       }
     }
     /**
-     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-     *
      * <pre>
      * Indicates the amount of time that the client should consider this server
      * list as valid. It may be considered stale after waiting this interval of
      * time after receiving the list. If the interval is not positive, the
      * client can assume the list is valid until the next list is received.
      * </pre>
+     *
+     * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
      */
     private com.google.protobuf.SingleFieldBuilder<
         com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder> 
@@ -1045,16 +1051,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new ServerList(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/ServerListOrBuilder.java b/grpclb/src/generated/main/java/io/grpc/grpclb/ServerListOrBuilder.java
index 8610e10..6d12cc8 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/ServerListOrBuilder.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/ServerListOrBuilder.java
@@ -8,95 +8,95 @@
     com.google.protobuf.MessageOrBuilder {
 
   /**
-   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-   *
    * <pre>
    * Contains a list of servers selected by the load balancer. The list will
    * be updated when server resolutions change or as needed to balance load
    * across more servers. The client should consume the server list in order
    * unless instructed otherwise via the client_config.
    * </pre>
+   *
+   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
    */
   java.util.List<io.grpc.grpclb.Server> 
       getServersList();
   /**
-   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-   *
    * <pre>
    * Contains a list of servers selected by the load balancer. The list will
    * be updated when server resolutions change or as needed to balance load
    * across more servers. The client should consume the server list in order
    * unless instructed otherwise via the client_config.
    * </pre>
+   *
+   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
    */
   io.grpc.grpclb.Server getServers(int index);
   /**
-   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-   *
    * <pre>
    * Contains a list of servers selected by the load balancer. The list will
    * be updated when server resolutions change or as needed to balance load
    * across more servers. The client should consume the server list in order
    * unless instructed otherwise via the client_config.
    * </pre>
+   *
+   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
    */
   int getServersCount();
   /**
-   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-   *
    * <pre>
    * Contains a list of servers selected by the load balancer. The list will
    * be updated when server resolutions change or as needed to balance load
    * across more servers. The client should consume the server list in order
    * unless instructed otherwise via the client_config.
    * </pre>
+   *
+   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
    */
   java.util.List<? extends io.grpc.grpclb.ServerOrBuilder> 
       getServersOrBuilderList();
   /**
-   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
-   *
    * <pre>
    * Contains a list of servers selected by the load balancer. The list will
    * be updated when server resolutions change or as needed to balance load
    * across more servers. The client should consume the server list in order
    * unless instructed otherwise via the client_config.
    * </pre>
+   *
+   * <code>repeated .grpc.lb.v1.Server servers = 1;</code>
    */
   io.grpc.grpclb.ServerOrBuilder getServersOrBuilder(
       int index);
 
   /**
-   * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-   *
    * <pre>
    * Indicates the amount of time that the client should consider this server
    * list as valid. It may be considered stale after waiting this interval of
    * time after receiving the list. If the interval is not positive, the
    * client can assume the list is valid until the next list is received.
    * </pre>
+   *
+   * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
    */
   boolean hasExpirationInterval();
   /**
-   * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-   *
    * <pre>
    * Indicates the amount of time that the client should consider this server
    * list as valid. It may be considered stale after waiting this interval of
    * time after receiving the list. If the interval is not positive, the
    * client can assume the list is valid until the next list is received.
    * </pre>
+   *
+   * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
    */
   com.google.protobuf.Duration getExpirationInterval();
   /**
-   * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
-   *
    * <pre>
    * Indicates the amount of time that the client should consider this server
    * list as valid. It may be considered stale after waiting this interval of
    * time after receiving the list. If the interval is not positive, the
    * client can assume the list is valid until the next list is received.
    * </pre>
+   *
+   * <code>optional .google.protobuf.Duration expiration_interval = 3;</code>
    */
   com.google.protobuf.DurationOrBuilder getExpirationIntervalOrBuilder();
 }
diff --git a/grpclb/src/generated/main/java/io/grpc/grpclb/ServerOrBuilder.java b/grpclb/src/generated/main/java/io/grpc/grpclb/ServerOrBuilder.java
index 9918f75..d8b76a9 100644
--- a/grpclb/src/generated/main/java/io/grpc/grpclb/ServerOrBuilder.java
+++ b/grpclb/src/generated/main/java/io/grpc/grpclb/ServerOrBuilder.java
@@ -8,53 +8,53 @@
     com.google.protobuf.MessageOrBuilder {
 
   /**
-   * <code>optional bytes ip_address = 1;</code>
-   *
    * <pre>
    * A resolved address for the server, serialized in network-byte-order. It may
    * either be an IPv4 or IPv6 address.
    * </pre>
+   *
+   * <code>optional bytes ip_address = 1;</code>
    */
   com.google.protobuf.ByteString getIpAddress();
 
   /**
-   * <code>optional int32 port = 2;</code>
-   *
    * <pre>
    * A resolved port number for the server.
    * </pre>
+   *
+   * <code>optional int32 port = 2;</code>
    */
   int getPort();
 
   /**
-   * <code>optional string load_balance_token = 3;</code>
-   *
    * <pre>
    * An opaque token that is passed from the client to the server in metadata.
    * The server may expect this token to indicate that the request from the
    * client was load balanced.
    * </pre>
+   *
+   * <code>optional string load_balance_token = 3;</code>
    */
   java.lang.String getLoadBalanceToken();
   /**
-   * <code>optional string load_balance_token = 3;</code>
-   *
    * <pre>
    * An opaque token that is passed from the client to the server in metadata.
    * The server may expect this token to indicate that the request from the
    * client was load balanced.
    * </pre>
+   *
+   * <code>optional string load_balance_token = 3;</code>
    */
   com.google.protobuf.ByteString
       getLoadBalanceTokenBytes();
 
   /**
-   * <code>optional bool drop_request = 4;</code>
-   *
    * <pre>
    * Indicates whether this particular request should be dropped by the client
    * when this server is chosen from the list.
    * </pre>
+   *
+   * <code>optional bool drop_request = 4;</code>
    */
   boolean getDropRequest();
 }
diff --git a/interop-testing/src/generated/main/java/com/google/protobuf/EmptyProtos.java b/interop-testing/src/generated/main/java/com/google/protobuf/EmptyProtos.java
index e1b0b21..02cde0c 100644
--- a/interop-testing/src/generated/main/java/com/google/protobuf/EmptyProtos.java
+++ b/interop-testing/src/generated/main/java/com/google/protobuf/EmptyProtos.java
@@ -13,8 +13,6 @@
       com.google.protobuf.MessageOrBuilder {
   }
   /**
-   * Protobuf type {@code grpc.testing.Empty}
-   *
    * <pre>
    * An empty message that you can re-use to avoid defining duplicated empty
    * messages in your project. A typical example is to use it as argument or the
@@ -23,6 +21,8 @@
    *     rpc Bar (grpc.testing.Empty) returns (grpc.testing.Empty) { };
    *   };
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.Empty}
    */
   public  static final class Empty extends
       com.google.protobuf.GeneratedMessage implements
@@ -42,7 +42,8 @@
     }
     private Empty(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
@@ -64,11 +65,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
@@ -135,34 +135,40 @@
     }
     public static com.google.protobuf.EmptyProtos.Empty parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static com.google.protobuf.EmptyProtos.Empty parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static com.google.protobuf.EmptyProtos.Empty parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static com.google.protobuf.EmptyProtos.Empty parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static com.google.protobuf.EmptyProtos.Empty parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static com.google.protobuf.EmptyProtos.Empty parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -184,8 +190,6 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.Empty}
-     *
      * <pre>
      * An empty message that you can re-use to avoid defining duplicated empty
      * messages in your project. A typical example is to use it as argument or the
@@ -194,6 +198,8 @@
      *     rpc Bar (grpc.testing.Empty) returns (grpc.testing.Empty) { };
      *   };
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.Empty}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -282,7 +288,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (com.google.protobuf.EmptyProtos.Empty) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -310,16 +316,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new Empty(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -338,9 +335,9 @@
 
   }
 
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_Empty_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_Empty_fieldAccessorTable;
 
@@ -348,7 +345,7 @@
       getDescriptor() {
     return descriptor;
   }
-  private static com.google.protobuf.Descriptors.FileDescriptor
+  private static  com.google.protobuf.Descriptors.FileDescriptor
       descriptor;
   static {
     java.lang.String[] descriptorData = {
diff --git a/interop-testing/src/generated/main/java/io/grpc/testing/integration/Messages.java b/interop-testing/src/generated/main/java/io/grpc/testing/integration/Messages.java
index 647407b..9e857ae 100644
--- a/interop-testing/src/generated/main/java/io/grpc/testing/integration/Messages.java
+++ b/interop-testing/src/generated/main/java/io/grpc/testing/integration/Messages.java
@@ -9,76 +9,84 @@
       com.google.protobuf.ExtensionRegistry registry) {
   }
   /**
-   * Protobuf enum {@code grpc.testing.PayloadType}
-   *
    * <pre>
    * The type of payload that should be returned.
    * </pre>
+   *
+   * Protobuf enum {@code grpc.testing.PayloadType}
    */
   public enum PayloadType
       implements com.google.protobuf.ProtocolMessageEnum {
     /**
-     * <code>COMPRESSABLE = 0;</code>
-     *
      * <pre>
      * Compressable text format.
      * </pre>
-     */
-    COMPRESSABLE(0, 0),
-    /**
-     * <code>UNCOMPRESSABLE = 1;</code>
      *
+     * <code>COMPRESSABLE = 0;</code>
+     */
+    COMPRESSABLE(0),
+    /**
      * <pre>
      * Uncompressable binary format.
      * </pre>
-     */
-    UNCOMPRESSABLE(1, 1),
-    /**
-     * <code>RANDOM = 2;</code>
      *
+     * <code>UNCOMPRESSABLE = 1;</code>
+     */
+    UNCOMPRESSABLE(1),
+    /**
      * <pre>
      * Randomly chosen from all other formats defined in this enum.
      * </pre>
+     *
+     * <code>RANDOM = 2;</code>
      */
-    RANDOM(2, 2),
-    UNRECOGNIZED(-1, -1),
+    RANDOM(2),
+    UNRECOGNIZED(-1),
     ;
 
     /**
-     * <code>COMPRESSABLE = 0;</code>
-     *
      * <pre>
      * Compressable text format.
      * </pre>
+     *
+     * <code>COMPRESSABLE = 0;</code>
      */
     public static final int COMPRESSABLE_VALUE = 0;
     /**
-     * <code>UNCOMPRESSABLE = 1;</code>
-     *
      * <pre>
      * Uncompressable binary format.
      * </pre>
+     *
+     * <code>UNCOMPRESSABLE = 1;</code>
      */
     public static final int UNCOMPRESSABLE_VALUE = 1;
     /**
-     * <code>RANDOM = 2;</code>
-     *
      * <pre>
      * Randomly chosen from all other formats defined in this enum.
      * </pre>
+     *
+     * <code>RANDOM = 2;</code>
      */
     public static final int RANDOM_VALUE = 2;
 
 
     public final int getNumber() {
-      if (index == -1) {
+      if (this == UNRECOGNIZED) {
         throw new java.lang.IllegalArgumentException(
             "Can't get the number of an unknown enum value.");
       }
       return value;
     }
 
+    /**
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
     public static PayloadType valueOf(int value) {
+      return forNumber(value);
+    }
+
+    public static PayloadType forNumber(int value) {
       switch (value) {
         case 0: return COMPRESSABLE;
         case 1: return UNCOMPRESSABLE;
@@ -95,13 +103,13 @@
         PayloadType> internalValueMap =
           new com.google.protobuf.Internal.EnumLiteMap<PayloadType>() {
             public PayloadType findValueByNumber(int number) {
-              return PayloadType.valueOf(number);
+              return PayloadType.forNumber(number);
             }
           };
 
     public final com.google.protobuf.Descriptors.EnumValueDescriptor
         getValueDescriptor() {
-      return getDescriptor().getValues().get(index);
+      return getDescriptor().getValues().get(ordinal());
     }
     public final com.google.protobuf.Descriptors.EnumDescriptor
         getDescriptorForType() {
@@ -126,11 +134,9 @@
       return VALUES[desc.getIndex()];
     }
 
-    private final int index;
     private final int value;
 
-    private PayloadType(int index, int value) {
-      this.index = index;
+    private PayloadType(int value) {
       this.value = value;
     }
 
@@ -138,39 +144,39 @@
   }
 
   /**
-   * Protobuf enum {@code grpc.testing.CompressionType}
-   *
    * <pre>
    * Compression algorithms
    * </pre>
+   *
+   * Protobuf enum {@code grpc.testing.CompressionType}
    */
   public enum CompressionType
       implements com.google.protobuf.ProtocolMessageEnum {
     /**
-     * <code>NONE = 0;</code>
-     *
      * <pre>
      * No compression
      * </pre>
+     *
+     * <code>NONE = 0;</code>
      */
-    NONE(0, 0),
+    NONE(0),
     /**
      * <code>GZIP = 1;</code>
      */
-    GZIP(1, 1),
+    GZIP(1),
     /**
      * <code>DEFLATE = 2;</code>
      */
-    DEFLATE(2, 2),
-    UNRECOGNIZED(-1, -1),
+    DEFLATE(2),
+    UNRECOGNIZED(-1),
     ;
 
     /**
-     * <code>NONE = 0;</code>
-     *
      * <pre>
      * No compression
      * </pre>
+     *
+     * <code>NONE = 0;</code>
      */
     public static final int NONE_VALUE = 0;
     /**
@@ -184,14 +190,22 @@
 
 
     public final int getNumber() {
-      if (index == -1) {
+      if (this == UNRECOGNIZED) {
         throw new java.lang.IllegalArgumentException(
             "Can't get the number of an unknown enum value.");
       }
       return value;
     }
 
+    /**
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
     public static CompressionType valueOf(int value) {
+      return forNumber(value);
+    }
+
+    public static CompressionType forNumber(int value) {
       switch (value) {
         case 0: return NONE;
         case 1: return GZIP;
@@ -208,13 +222,13 @@
         CompressionType> internalValueMap =
           new com.google.protobuf.Internal.EnumLiteMap<CompressionType>() {
             public CompressionType findValueByNumber(int number) {
-              return CompressionType.valueOf(number);
+              return CompressionType.forNumber(number);
             }
           };
 
     public final com.google.protobuf.Descriptors.EnumValueDescriptor
         getValueDescriptor() {
-      return getDescriptor().getValues().get(index);
+      return getDescriptor().getValues().get(ordinal());
     }
     public final com.google.protobuf.Descriptors.EnumDescriptor
         getDescriptorForType() {
@@ -239,11 +253,9 @@
       return VALUES[desc.getIndex()];
     }
 
-    private final int index;
     private final int value;
 
-    private CompressionType(int index, int value) {
-      this.index = index;
+    private CompressionType(int value) {
       this.value = value;
     }
 
@@ -255,37 +267,37 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional .grpc.testing.PayloadType type = 1;</code>
-     *
      * <pre>
      * The type of data in body.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType type = 1;</code>
      */
     int getTypeValue();
     /**
-     * <code>optional .grpc.testing.PayloadType type = 1;</code>
-     *
      * <pre>
      * The type of data in body.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType type = 1;</code>
      */
     io.grpc.testing.integration.Messages.PayloadType getType();
 
     /**
-     * <code>optional bytes body = 2;</code>
-     *
      * <pre>
      * Primary contents of payload.
      * </pre>
+     *
+     * <code>optional bytes body = 2;</code>
      */
     com.google.protobuf.ByteString getBody();
   }
   /**
-   * Protobuf type {@code grpc.testing.Payload}
-   *
    * <pre>
    * A block of data, to simply increase gRPC message size.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.Payload}
    */
   public  static final class Payload extends
       com.google.protobuf.GeneratedMessage implements
@@ -307,7 +319,8 @@
     }
     private Payload(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -338,11 +351,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -362,35 +374,35 @@
     public static final int TYPE_FIELD_NUMBER = 1;
     private int type_;
     /**
-     * <code>optional .grpc.testing.PayloadType type = 1;</code>
-     *
      * <pre>
      * The type of data in body.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType type = 1;</code>
      */
     public int getTypeValue() {
       return type_;
     }
     /**
-     * <code>optional .grpc.testing.PayloadType type = 1;</code>
-     *
      * <pre>
      * The type of data in body.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType type = 1;</code>
      */
     public io.grpc.testing.integration.Messages.PayloadType getType() {
-      io.grpc.testing.integration.Messages.PayloadType result = io.grpc.testing.integration.Messages.PayloadType.valueOf(type_);
+      io.grpc.testing.integration.Messages.PayloadType result = io.grpc.testing.integration.Messages.PayloadType.forNumber(type_);
       return result == null ? io.grpc.testing.integration.Messages.PayloadType.UNRECOGNIZED : result;
     }
 
     public static final int BODY_FIELD_NUMBER = 2;
     private com.google.protobuf.ByteString body_;
     /**
-     * <code>optional bytes body = 2;</code>
-     *
      * <pre>
      * Primary contents of payload.
      * </pre>
+     *
+     * <code>optional bytes body = 2;</code>
      */
     public com.google.protobuf.ByteString getBody() {
       return body_;
@@ -457,34 +469,40 @@
     }
     public static io.grpc.testing.integration.Messages.Payload parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.Payload parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.Payload parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.Payload parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.Payload parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.Payload parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -506,11 +524,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.Payload}
-     *
      * <pre>
      * A block of data, to simply increase gRPC message size.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.Payload}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -610,7 +628,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Messages.Payload) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -621,21 +639,21 @@
 
       private int type_ = 0;
       /**
-       * <code>optional .grpc.testing.PayloadType type = 1;</code>
-       *
        * <pre>
        * The type of data in body.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType type = 1;</code>
        */
       public int getTypeValue() {
         return type_;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType type = 1;</code>
-       *
        * <pre>
        * The type of data in body.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType type = 1;</code>
        */
       public Builder setTypeValue(int value) {
         type_ = value;
@@ -643,22 +661,22 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType type = 1;</code>
-       *
        * <pre>
        * The type of data in body.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType type = 1;</code>
        */
       public io.grpc.testing.integration.Messages.PayloadType getType() {
-        io.grpc.testing.integration.Messages.PayloadType result = io.grpc.testing.integration.Messages.PayloadType.valueOf(type_);
+        io.grpc.testing.integration.Messages.PayloadType result = io.grpc.testing.integration.Messages.PayloadType.forNumber(type_);
         return result == null ? io.grpc.testing.integration.Messages.PayloadType.UNRECOGNIZED : result;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType type = 1;</code>
-       *
        * <pre>
        * The type of data in body.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType type = 1;</code>
        */
       public Builder setType(io.grpc.testing.integration.Messages.PayloadType value) {
         if (value == null) {
@@ -670,11 +688,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType type = 1;</code>
-       *
        * <pre>
        * The type of data in body.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType type = 1;</code>
        */
       public Builder clearType() {
         
@@ -685,21 +703,21 @@
 
       private com.google.protobuf.ByteString body_ = com.google.protobuf.ByteString.EMPTY;
       /**
-       * <code>optional bytes body = 2;</code>
-       *
        * <pre>
        * Primary contents of payload.
        * </pre>
+       *
+       * <code>optional bytes body = 2;</code>
        */
       public com.google.protobuf.ByteString getBody() {
         return body_;
       }
       /**
-       * <code>optional bytes body = 2;</code>
-       *
        * <pre>
        * Primary contents of payload.
        * </pre>
+       *
+       * <code>optional bytes body = 2;</code>
        */
       public Builder setBody(com.google.protobuf.ByteString value) {
         if (value == null) {
@@ -711,11 +729,11 @@
         return this;
       }
       /**
-       * <code>optional bytes body = 2;</code>
-       *
        * <pre>
        * Primary contents of payload.
        * </pre>
+       *
+       * <code>optional bytes body = 2;</code>
        */
       public Builder clearBody() {
         
@@ -753,16 +771,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new Payload(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -801,12 +810,12 @@
         getMessageBytes();
   }
   /**
-   * Protobuf type {@code grpc.testing.EchoStatus}
-   *
    * <pre>
    * A protobuf representation for grpc status. This is used by test
    * clients to specify a status that the server should attempt to return.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.EchoStatus}
    */
   public  static final class EchoStatus extends
       com.google.protobuf.GeneratedMessage implements
@@ -828,7 +837,8 @@
     }
     private EchoStatus(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -859,11 +869,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -983,34 +992,40 @@
     }
     public static io.grpc.testing.integration.Messages.EchoStatus parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.EchoStatus parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.EchoStatus parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.EchoStatus parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.EchoStatus parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.EchoStatus parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -1032,12 +1047,12 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.EchoStatus}
-     *
      * <pre>
      * A protobuf representation for grpc status. This is used by test
      * clients to specify a status that the server should attempt to return.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.EchoStatus}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -1138,7 +1153,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Messages.EchoStatus) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -1271,16 +1286,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new EchoStatus(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -1304,125 +1310,125 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, server randomly chooses one from other formats.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     int getResponseTypeValue();
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, server randomly chooses one from other formats.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     io.grpc.testing.integration.Messages.PayloadType getResponseType();
 
     /**
-     * <code>optional int32 response_size = 2;</code>
-     *
      * <pre>
      * Desired payload size in the response from the server.
      * If response_type is COMPRESSABLE, this denotes the size before compression.
      * </pre>
+     *
+     * <code>optional int32 response_size = 2;</code>
      */
     int getResponseSize();
 
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     boolean hasPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     io.grpc.testing.integration.Messages.Payload getPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder();
 
     /**
-     * <code>optional bool fill_username = 4;</code>
-     *
      * <pre>
      * Whether SimpleResponse should include username.
      * </pre>
+     *
+     * <code>optional bool fill_username = 4;</code>
      */
     boolean getFillUsername();
 
     /**
-     * <code>optional bool fill_oauth_scope = 5;</code>
-     *
      * <pre>
      * Whether SimpleResponse should include OAuth scope.
      * </pre>
+     *
+     * <code>optional bool fill_oauth_scope = 5;</code>
      */
     boolean getFillOauthScope();
 
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     int getResponseCompressionValue();
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     io.grpc.testing.integration.Messages.CompressionType getResponseCompression();
 
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     boolean hasResponseStatus();
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     io.grpc.testing.integration.Messages.EchoStatus getResponseStatus();
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     io.grpc.testing.integration.Messages.EchoStatusOrBuilder getResponseStatusOrBuilder();
   }
   /**
-   * Protobuf type {@code grpc.testing.SimpleRequest}
-   *
    * <pre>
    * Unary request.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.SimpleRequest}
    */
   public  static final class SimpleRequest extends
       com.google.protobuf.GeneratedMessage implements
@@ -1447,7 +1453,8 @@
     }
     private SimpleRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -1520,11 +1527,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -1544,38 +1550,38 @@
     public static final int RESPONSE_TYPE_FIELD_NUMBER = 1;
     private int responseType_;
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, server randomly chooses one from other formats.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     public int getResponseTypeValue() {
       return responseType_;
     }
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, server randomly chooses one from other formats.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     public io.grpc.testing.integration.Messages.PayloadType getResponseType() {
-      io.grpc.testing.integration.Messages.PayloadType result = io.grpc.testing.integration.Messages.PayloadType.valueOf(responseType_);
+      io.grpc.testing.integration.Messages.PayloadType result = io.grpc.testing.integration.Messages.PayloadType.forNumber(responseType_);
       return result == null ? io.grpc.testing.integration.Messages.PayloadType.UNRECOGNIZED : result;
     }
 
     public static final int RESPONSE_SIZE_FIELD_NUMBER = 2;
     private int responseSize_;
     /**
-     * <code>optional int32 response_size = 2;</code>
-     *
      * <pre>
      * Desired payload size in the response from the server.
      * If response_type is COMPRESSABLE, this denotes the size before compression.
      * </pre>
+     *
+     * <code>optional int32 response_size = 2;</code>
      */
     public int getResponseSize() {
       return responseSize_;
@@ -1584,31 +1590,31 @@
     public static final int PAYLOAD_FIELD_NUMBER = 3;
     private io.grpc.testing.integration.Messages.Payload payload_;
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     public boolean hasPayload() {
       return payload_ != null;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     public io.grpc.testing.integration.Messages.Payload getPayload() {
       return payload_ == null ? io.grpc.testing.integration.Messages.Payload.getDefaultInstance() : payload_;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     public io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder() {
       return getPayload();
@@ -1617,11 +1623,11 @@
     public static final int FILL_USERNAME_FIELD_NUMBER = 4;
     private boolean fillUsername_;
     /**
-     * <code>optional bool fill_username = 4;</code>
-     *
      * <pre>
      * Whether SimpleResponse should include username.
      * </pre>
+     *
+     * <code>optional bool fill_username = 4;</code>
      */
     public boolean getFillUsername() {
       return fillUsername_;
@@ -1630,11 +1636,11 @@
     public static final int FILL_OAUTH_SCOPE_FIELD_NUMBER = 5;
     private boolean fillOauthScope_;
     /**
-     * <code>optional bool fill_oauth_scope = 5;</code>
-     *
      * <pre>
      * Whether SimpleResponse should include OAuth scope.
      * </pre>
+     *
+     * <code>optional bool fill_oauth_scope = 5;</code>
      */
     public boolean getFillOauthScope() {
       return fillOauthScope_;
@@ -1643,55 +1649,55 @@
     public static final int RESPONSE_COMPRESSION_FIELD_NUMBER = 6;
     private int responseCompression_;
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     public int getResponseCompressionValue() {
       return responseCompression_;
     }
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     public io.grpc.testing.integration.Messages.CompressionType getResponseCompression() {
-      io.grpc.testing.integration.Messages.CompressionType result = io.grpc.testing.integration.Messages.CompressionType.valueOf(responseCompression_);
+      io.grpc.testing.integration.Messages.CompressionType result = io.grpc.testing.integration.Messages.CompressionType.forNumber(responseCompression_);
       return result == null ? io.grpc.testing.integration.Messages.CompressionType.UNRECOGNIZED : result;
     }
 
     public static final int RESPONSE_STATUS_FIELD_NUMBER = 7;
     private io.grpc.testing.integration.Messages.EchoStatus responseStatus_;
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     public boolean hasResponseStatus() {
       return responseStatus_ != null;
     }
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     public io.grpc.testing.integration.Messages.EchoStatus getResponseStatus() {
       return responseStatus_ == null ? io.grpc.testing.integration.Messages.EchoStatus.getDefaultInstance() : responseStatus_;
     }
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     public io.grpc.testing.integration.Messages.EchoStatusOrBuilder getResponseStatusOrBuilder() {
       return getResponseStatus();
@@ -1793,34 +1799,40 @@
     }
     public static io.grpc.testing.integration.Messages.SimpleRequest parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.SimpleRequest parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.SimpleRequest parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.SimpleRequest parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.SimpleRequest parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.SimpleRequest parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -1842,11 +1854,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.SimpleRequest}
-     *
      * <pre>
      * Unary request.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.SimpleRequest}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -1992,7 +2004,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Messages.SimpleRequest) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -2003,23 +2015,23 @@
 
       private int responseType_ = 0;
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, server randomly chooses one from other formats.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public int getResponseTypeValue() {
         return responseType_;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, server randomly chooses one from other formats.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public Builder setResponseTypeValue(int value) {
         responseType_ = value;
@@ -2027,24 +2039,24 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, server randomly chooses one from other formats.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public io.grpc.testing.integration.Messages.PayloadType getResponseType() {
-        io.grpc.testing.integration.Messages.PayloadType result = io.grpc.testing.integration.Messages.PayloadType.valueOf(responseType_);
+        io.grpc.testing.integration.Messages.PayloadType result = io.grpc.testing.integration.Messages.PayloadType.forNumber(responseType_);
         return result == null ? io.grpc.testing.integration.Messages.PayloadType.UNRECOGNIZED : result;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, server randomly chooses one from other formats.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public Builder setResponseType(io.grpc.testing.integration.Messages.PayloadType value) {
         if (value == null) {
@@ -2056,12 +2068,12 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, server randomly chooses one from other formats.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public Builder clearResponseType() {
         
@@ -2072,23 +2084,23 @@
 
       private int responseSize_ ;
       /**
-       * <code>optional int32 response_size = 2;</code>
-       *
        * <pre>
        * Desired payload size in the response from the server.
        * If response_type is COMPRESSABLE, this denotes the size before compression.
        * </pre>
+       *
+       * <code>optional int32 response_size = 2;</code>
        */
       public int getResponseSize() {
         return responseSize_;
       }
       /**
-       * <code>optional int32 response_size = 2;</code>
-       *
        * <pre>
        * Desired payload size in the response from the server.
        * If response_type is COMPRESSABLE, this denotes the size before compression.
        * </pre>
+       *
+       * <code>optional int32 response_size = 2;</code>
        */
       public Builder setResponseSize(int value) {
         
@@ -2097,12 +2109,12 @@
         return this;
       }
       /**
-       * <code>optional int32 response_size = 2;</code>
-       *
        * <pre>
        * Desired payload size in the response from the server.
        * If response_type is COMPRESSABLE, this denotes the size before compression.
        * </pre>
+       *
+       * <code>optional int32 response_size = 2;</code>
        */
       public Builder clearResponseSize() {
         
@@ -2115,21 +2127,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.testing.integration.Messages.Payload, io.grpc.testing.integration.Messages.Payload.Builder, io.grpc.testing.integration.Messages.PayloadOrBuilder> payloadBuilder_;
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public boolean hasPayload() {
         return payloadBuilder_ != null || payload_ != null;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public io.grpc.testing.integration.Messages.Payload getPayload() {
         if (payloadBuilder_ == null) {
@@ -2139,11 +2151,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder setPayload(io.grpc.testing.integration.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -2159,11 +2171,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder setPayload(
           io.grpc.testing.integration.Messages.Payload.Builder builderForValue) {
@@ -2177,11 +2189,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder mergePayload(io.grpc.testing.integration.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -2199,11 +2211,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder clearPayload() {
         if (payloadBuilder_ == null) {
@@ -2217,11 +2229,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public io.grpc.testing.integration.Messages.Payload.Builder getPayloadBuilder() {
         
@@ -2229,11 +2241,11 @@
         return getPayloadFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder() {
         if (payloadBuilder_ != null) {
@@ -2244,11 +2256,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.testing.integration.Messages.Payload, io.grpc.testing.integration.Messages.Payload.Builder, io.grpc.testing.integration.Messages.PayloadOrBuilder> 
@@ -2266,21 +2278,21 @@
 
       private boolean fillUsername_ ;
       /**
-       * <code>optional bool fill_username = 4;</code>
-       *
        * <pre>
        * Whether SimpleResponse should include username.
        * </pre>
+       *
+       * <code>optional bool fill_username = 4;</code>
        */
       public boolean getFillUsername() {
         return fillUsername_;
       }
       /**
-       * <code>optional bool fill_username = 4;</code>
-       *
        * <pre>
        * Whether SimpleResponse should include username.
        * </pre>
+       *
+       * <code>optional bool fill_username = 4;</code>
        */
       public Builder setFillUsername(boolean value) {
         
@@ -2289,11 +2301,11 @@
         return this;
       }
       /**
-       * <code>optional bool fill_username = 4;</code>
-       *
        * <pre>
        * Whether SimpleResponse should include username.
        * </pre>
+       *
+       * <code>optional bool fill_username = 4;</code>
        */
       public Builder clearFillUsername() {
         
@@ -2304,21 +2316,21 @@
 
       private boolean fillOauthScope_ ;
       /**
-       * <code>optional bool fill_oauth_scope = 5;</code>
-       *
        * <pre>
        * Whether SimpleResponse should include OAuth scope.
        * </pre>
+       *
+       * <code>optional bool fill_oauth_scope = 5;</code>
        */
       public boolean getFillOauthScope() {
         return fillOauthScope_;
       }
       /**
-       * <code>optional bool fill_oauth_scope = 5;</code>
-       *
        * <pre>
        * Whether SimpleResponse should include OAuth scope.
        * </pre>
+       *
+       * <code>optional bool fill_oauth_scope = 5;</code>
        */
       public Builder setFillOauthScope(boolean value) {
         
@@ -2327,11 +2339,11 @@
         return this;
       }
       /**
-       * <code>optional bool fill_oauth_scope = 5;</code>
-       *
        * <pre>
        * Whether SimpleResponse should include OAuth scope.
        * </pre>
+       *
+       * <code>optional bool fill_oauth_scope = 5;</code>
        */
       public Builder clearFillOauthScope() {
         
@@ -2342,21 +2354,21 @@
 
       private int responseCompression_ = 0;
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public int getResponseCompressionValue() {
         return responseCompression_;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public Builder setResponseCompressionValue(int value) {
         responseCompression_ = value;
@@ -2364,22 +2376,22 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public io.grpc.testing.integration.Messages.CompressionType getResponseCompression() {
-        io.grpc.testing.integration.Messages.CompressionType result = io.grpc.testing.integration.Messages.CompressionType.valueOf(responseCompression_);
+        io.grpc.testing.integration.Messages.CompressionType result = io.grpc.testing.integration.Messages.CompressionType.forNumber(responseCompression_);
         return result == null ? io.grpc.testing.integration.Messages.CompressionType.UNRECOGNIZED : result;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public Builder setResponseCompression(io.grpc.testing.integration.Messages.CompressionType value) {
         if (value == null) {
@@ -2391,11 +2403,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public Builder clearResponseCompression() {
         
@@ -2408,21 +2420,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.testing.integration.Messages.EchoStatus, io.grpc.testing.integration.Messages.EchoStatus.Builder, io.grpc.testing.integration.Messages.EchoStatusOrBuilder> responseStatusBuilder_;
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public boolean hasResponseStatus() {
         return responseStatusBuilder_ != null || responseStatus_ != null;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public io.grpc.testing.integration.Messages.EchoStatus getResponseStatus() {
         if (responseStatusBuilder_ == null) {
@@ -2432,11 +2444,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder setResponseStatus(io.grpc.testing.integration.Messages.EchoStatus value) {
         if (responseStatusBuilder_ == null) {
@@ -2452,11 +2464,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder setResponseStatus(
           io.grpc.testing.integration.Messages.EchoStatus.Builder builderForValue) {
@@ -2470,11 +2482,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder mergeResponseStatus(io.grpc.testing.integration.Messages.EchoStatus value) {
         if (responseStatusBuilder_ == null) {
@@ -2492,11 +2504,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder clearResponseStatus() {
         if (responseStatusBuilder_ == null) {
@@ -2510,11 +2522,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public io.grpc.testing.integration.Messages.EchoStatus.Builder getResponseStatusBuilder() {
         
@@ -2522,11 +2534,11 @@
         return getResponseStatusFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public io.grpc.testing.integration.Messages.EchoStatusOrBuilder getResponseStatusOrBuilder() {
         if (responseStatusBuilder_ != null) {
@@ -2537,11 +2549,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.testing.integration.Messages.EchoStatus, io.grpc.testing.integration.Messages.EchoStatus.Builder, io.grpc.testing.integration.Messages.EchoStatusOrBuilder> 
@@ -2586,16 +2598,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new SimpleRequest(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -2619,74 +2622,74 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase message size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     boolean hasPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase message size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     io.grpc.testing.integration.Messages.Payload getPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase message size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder();
 
     /**
-     * <code>optional string username = 2;</code>
-     *
      * <pre>
      * The user the request came from, for verifying authentication was
      * successful when the client expected it.
      * </pre>
+     *
+     * <code>optional string username = 2;</code>
      */
     java.lang.String getUsername();
     /**
-     * <code>optional string username = 2;</code>
-     *
      * <pre>
      * The user the request came from, for verifying authentication was
      * successful when the client expected it.
      * </pre>
+     *
+     * <code>optional string username = 2;</code>
      */
     com.google.protobuf.ByteString
         getUsernameBytes();
 
     /**
-     * <code>optional string oauth_scope = 3;</code>
-     *
      * <pre>
      * OAuth scope.
      * </pre>
+     *
+     * <code>optional string oauth_scope = 3;</code>
      */
     java.lang.String getOauthScope();
     /**
-     * <code>optional string oauth_scope = 3;</code>
-     *
      * <pre>
      * OAuth scope.
      * </pre>
+     *
+     * <code>optional string oauth_scope = 3;</code>
      */
     com.google.protobuf.ByteString
         getOauthScopeBytes();
   }
   /**
-   * Protobuf type {@code grpc.testing.SimpleResponse}
-   *
    * <pre>
    * Unary response, as configured by the request.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.SimpleResponse}
    */
   public  static final class SimpleResponse extends
       com.google.protobuf.GeneratedMessage implements
@@ -2708,7 +2711,8 @@
     }
     private SimpleResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -2753,11 +2757,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -2777,31 +2780,31 @@
     public static final int PAYLOAD_FIELD_NUMBER = 1;
     private io.grpc.testing.integration.Messages.Payload payload_;
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase message size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public boolean hasPayload() {
       return payload_ != null;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase message size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public io.grpc.testing.integration.Messages.Payload getPayload() {
       return payload_ == null ? io.grpc.testing.integration.Messages.Payload.getDefaultInstance() : payload_;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase message size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder() {
       return getPayload();
@@ -2810,12 +2813,12 @@
     public static final int USERNAME_FIELD_NUMBER = 2;
     private volatile java.lang.Object username_;
     /**
-     * <code>optional string username = 2;</code>
-     *
      * <pre>
      * The user the request came from, for verifying authentication was
      * successful when the client expected it.
      * </pre>
+     *
+     * <code>optional string username = 2;</code>
      */
     public java.lang.String getUsername() {
       java.lang.Object ref = username_;
@@ -2830,12 +2833,12 @@
       }
     }
     /**
-     * <code>optional string username = 2;</code>
-     *
      * <pre>
      * The user the request came from, for verifying authentication was
      * successful when the client expected it.
      * </pre>
+     *
+     * <code>optional string username = 2;</code>
      */
     public com.google.protobuf.ByteString
         getUsernameBytes() {
@@ -2854,11 +2857,11 @@
     public static final int OAUTH_SCOPE_FIELD_NUMBER = 3;
     private volatile java.lang.Object oauthScope_;
     /**
-     * <code>optional string oauth_scope = 3;</code>
-     *
      * <pre>
      * OAuth scope.
      * </pre>
+     *
+     * <code>optional string oauth_scope = 3;</code>
      */
     public java.lang.String getOauthScope() {
       java.lang.Object ref = oauthScope_;
@@ -2873,11 +2876,11 @@
       }
     }
     /**
-     * <code>optional string oauth_scope = 3;</code>
-     *
      * <pre>
      * OAuth scope.
      * </pre>
+     *
+     * <code>optional string oauth_scope = 3;</code>
      */
     public com.google.protobuf.ByteString
         getOauthScopeBytes() {
@@ -2959,34 +2962,40 @@
     }
     public static io.grpc.testing.integration.Messages.SimpleResponse parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.SimpleResponse parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.SimpleResponse parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.SimpleResponse parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.SimpleResponse parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.SimpleResponse parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -3008,11 +3017,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.SimpleResponse}
-     *
      * <pre>
      * Unary response, as configured by the request.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.SimpleResponse}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -3128,7 +3137,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Messages.SimpleResponse) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -3141,21 +3150,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.testing.integration.Messages.Payload, io.grpc.testing.integration.Messages.Payload.Builder, io.grpc.testing.integration.Messages.PayloadOrBuilder> payloadBuilder_;
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public boolean hasPayload() {
         return payloadBuilder_ != null || payload_ != null;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.testing.integration.Messages.Payload getPayload() {
         if (payloadBuilder_ == null) {
@@ -3165,11 +3174,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder setPayload(io.grpc.testing.integration.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -3185,11 +3194,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder setPayload(
           io.grpc.testing.integration.Messages.Payload.Builder builderForValue) {
@@ -3203,11 +3212,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder mergePayload(io.grpc.testing.integration.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -3225,11 +3234,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder clearPayload() {
         if (payloadBuilder_ == null) {
@@ -3243,11 +3252,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.testing.integration.Messages.Payload.Builder getPayloadBuilder() {
         
@@ -3255,11 +3264,11 @@
         return getPayloadFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder() {
         if (payloadBuilder_ != null) {
@@ -3270,11 +3279,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase message size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.testing.integration.Messages.Payload, io.grpc.testing.integration.Messages.Payload.Builder, io.grpc.testing.integration.Messages.PayloadOrBuilder> 
@@ -3292,12 +3301,12 @@
 
       private java.lang.Object username_ = "";
       /**
-       * <code>optional string username = 2;</code>
-       *
        * <pre>
        * The user the request came from, for verifying authentication was
        * successful when the client expected it.
        * </pre>
+       *
+       * <code>optional string username = 2;</code>
        */
       public java.lang.String getUsername() {
         java.lang.Object ref = username_;
@@ -3312,12 +3321,12 @@
         }
       }
       /**
-       * <code>optional string username = 2;</code>
-       *
        * <pre>
        * The user the request came from, for verifying authentication was
        * successful when the client expected it.
        * </pre>
+       *
+       * <code>optional string username = 2;</code>
        */
       public com.google.protobuf.ByteString
           getUsernameBytes() {
@@ -3333,12 +3342,12 @@
         }
       }
       /**
-       * <code>optional string username = 2;</code>
-       *
        * <pre>
        * The user the request came from, for verifying authentication was
        * successful when the client expected it.
        * </pre>
+       *
+       * <code>optional string username = 2;</code>
        */
       public Builder setUsername(
           java.lang.String value) {
@@ -3351,12 +3360,12 @@
         return this;
       }
       /**
-       * <code>optional string username = 2;</code>
-       *
        * <pre>
        * The user the request came from, for verifying authentication was
        * successful when the client expected it.
        * </pre>
+       *
+       * <code>optional string username = 2;</code>
        */
       public Builder clearUsername() {
         
@@ -3365,12 +3374,12 @@
         return this;
       }
       /**
-       * <code>optional string username = 2;</code>
-       *
        * <pre>
        * The user the request came from, for verifying authentication was
        * successful when the client expected it.
        * </pre>
+       *
+       * <code>optional string username = 2;</code>
        */
       public Builder setUsernameBytes(
           com.google.protobuf.ByteString value) {
@@ -3386,11 +3395,11 @@
 
       private java.lang.Object oauthScope_ = "";
       /**
-       * <code>optional string oauth_scope = 3;</code>
-       *
        * <pre>
        * OAuth scope.
        * </pre>
+       *
+       * <code>optional string oauth_scope = 3;</code>
        */
       public java.lang.String getOauthScope() {
         java.lang.Object ref = oauthScope_;
@@ -3405,11 +3414,11 @@
         }
       }
       /**
-       * <code>optional string oauth_scope = 3;</code>
-       *
        * <pre>
        * OAuth scope.
        * </pre>
+       *
+       * <code>optional string oauth_scope = 3;</code>
        */
       public com.google.protobuf.ByteString
           getOauthScopeBytes() {
@@ -3425,11 +3434,11 @@
         }
       }
       /**
-       * <code>optional string oauth_scope = 3;</code>
-       *
        * <pre>
        * OAuth scope.
        * </pre>
+       *
+       * <code>optional string oauth_scope = 3;</code>
        */
       public Builder setOauthScope(
           java.lang.String value) {
@@ -3442,11 +3451,11 @@
         return this;
       }
       /**
-       * <code>optional string oauth_scope = 3;</code>
-       *
        * <pre>
        * OAuth scope.
        * </pre>
+       *
+       * <code>optional string oauth_scope = 3;</code>
        */
       public Builder clearOauthScope() {
         
@@ -3455,11 +3464,11 @@
         return this;
       }
       /**
-       * <code>optional string oauth_scope = 3;</code>
-       *
        * <pre>
        * OAuth scope.
        * </pre>
+       *
+       * <code>optional string oauth_scope = 3;</code>
        */
       public Builder setOauthScopeBytes(
           com.google.protobuf.ByteString value) {
@@ -3502,16 +3511,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new SimpleResponse(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -3566,7 +3566,8 @@
     }
     private SimpleContext(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -3592,11 +3593,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -3700,34 +3700,40 @@
     }
     public static io.grpc.testing.integration.Messages.SimpleContext parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.SimpleContext parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.SimpleContext parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.SimpleContext parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.SimpleContext parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.SimpleContext parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -3844,7 +3850,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Messages.SimpleContext) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -3951,16 +3957,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new SimpleContext(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -3984,36 +3981,36 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     boolean hasPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     io.grpc.testing.integration.Messages.Payload getPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder();
   }
   /**
-   * Protobuf type {@code grpc.testing.StreamingInputCallRequest}
-   *
    * <pre>
    * Client-streaming request.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.StreamingInputCallRequest}
    */
   public  static final class StreamingInputCallRequest extends
       com.google.protobuf.GeneratedMessage implements
@@ -4033,7 +4030,8 @@
     }
     private StreamingInputCallRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -4066,11 +4064,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -4090,31 +4087,31 @@
     public static final int PAYLOAD_FIELD_NUMBER = 1;
     private io.grpc.testing.integration.Messages.Payload payload_;
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public boolean hasPayload() {
       return payload_ != null;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public io.grpc.testing.integration.Messages.Payload getPayload() {
       return payload_ == null ? io.grpc.testing.integration.Messages.Payload.getDefaultInstance() : payload_;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder() {
       return getPayload();
@@ -4174,34 +4171,40 @@
     }
     public static io.grpc.testing.integration.Messages.StreamingInputCallRequest parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.StreamingInputCallRequest parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.StreamingInputCallRequest parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.StreamingInputCallRequest parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.StreamingInputCallRequest parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.StreamingInputCallRequest parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -4223,11 +4226,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.StreamingInputCallRequest}
-     *
      * <pre>
      * Client-streaming request.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.StreamingInputCallRequest}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -4329,7 +4332,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Messages.StreamingInputCallRequest) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -4342,21 +4345,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.testing.integration.Messages.Payload, io.grpc.testing.integration.Messages.Payload.Builder, io.grpc.testing.integration.Messages.PayloadOrBuilder> payloadBuilder_;
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public boolean hasPayload() {
         return payloadBuilder_ != null || payload_ != null;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.testing.integration.Messages.Payload getPayload() {
         if (payloadBuilder_ == null) {
@@ -4366,11 +4369,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder setPayload(io.grpc.testing.integration.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -4386,11 +4389,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder setPayload(
           io.grpc.testing.integration.Messages.Payload.Builder builderForValue) {
@@ -4404,11 +4407,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder mergePayload(io.grpc.testing.integration.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -4426,11 +4429,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder clearPayload() {
         if (payloadBuilder_ == null) {
@@ -4444,11 +4447,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.testing.integration.Messages.Payload.Builder getPayloadBuilder() {
         
@@ -4456,11 +4459,11 @@
         return getPayloadFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder() {
         if (payloadBuilder_ != null) {
@@ -4471,11 +4474,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.testing.integration.Messages.Payload, io.grpc.testing.integration.Messages.Payload.Builder, io.grpc.testing.integration.Messages.PayloadOrBuilder> 
@@ -4520,16 +4523,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new StreamingInputCallRequest(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -4553,20 +4547,20 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional int32 aggregated_payload_size = 1;</code>
-     *
      * <pre>
      * Aggregated size of payloads received from the client.
      * </pre>
+     *
+     * <code>optional int32 aggregated_payload_size = 1;</code>
      */
     int getAggregatedPayloadSize();
   }
   /**
-   * Protobuf type {@code grpc.testing.StreamingInputCallResponse}
-   *
    * <pre>
    * Client-streaming response.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.StreamingInputCallResponse}
    */
   public  static final class StreamingInputCallResponse extends
       com.google.protobuf.GeneratedMessage implements
@@ -4587,7 +4581,8 @@
     }
     private StreamingInputCallResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -4612,11 +4607,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -4636,11 +4630,11 @@
     public static final int AGGREGATED_PAYLOAD_SIZE_FIELD_NUMBER = 1;
     private int aggregatedPayloadSize_;
     /**
-     * <code>optional int32 aggregated_payload_size = 1;</code>
-     *
      * <pre>
      * Aggregated size of payloads received from the client.
      * </pre>
+     *
+     * <code>optional int32 aggregated_payload_size = 1;</code>
      */
     public int getAggregatedPayloadSize() {
       return aggregatedPayloadSize_;
@@ -4700,34 +4694,40 @@
     }
     public static io.grpc.testing.integration.Messages.StreamingInputCallResponse parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.StreamingInputCallResponse parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.StreamingInputCallResponse parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.StreamingInputCallResponse parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.StreamingInputCallResponse parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.StreamingInputCallResponse parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -4749,11 +4749,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.StreamingInputCallResponse}
-     *
      * <pre>
      * Client-streaming response.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.StreamingInputCallResponse}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -4847,7 +4847,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Messages.StreamingInputCallResponse) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -4858,21 +4858,21 @@
 
       private int aggregatedPayloadSize_ ;
       /**
-       * <code>optional int32 aggregated_payload_size = 1;</code>
-       *
        * <pre>
        * Aggregated size of payloads received from the client.
        * </pre>
+       *
+       * <code>optional int32 aggregated_payload_size = 1;</code>
        */
       public int getAggregatedPayloadSize() {
         return aggregatedPayloadSize_;
       }
       /**
-       * <code>optional int32 aggregated_payload_size = 1;</code>
-       *
        * <pre>
        * Aggregated size of payloads received from the client.
        * </pre>
+       *
+       * <code>optional int32 aggregated_payload_size = 1;</code>
        */
       public Builder setAggregatedPayloadSize(int value) {
         
@@ -4881,11 +4881,11 @@
         return this;
       }
       /**
-       * <code>optional int32 aggregated_payload_size = 1;</code>
-       *
        * <pre>
        * Aggregated size of payloads received from the client.
        * </pre>
+       *
+       * <code>optional int32 aggregated_payload_size = 1;</code>
        */
       public Builder clearAggregatedPayloadSize() {
         
@@ -4923,16 +4923,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new StreamingInputCallResponse(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -4956,31 +4947,31 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional int32 size = 1;</code>
-     *
      * <pre>
      * Desired payload sizes in responses from the server.
      * If response_type is COMPRESSABLE, this denotes the size before compression.
      * </pre>
+     *
+     * <code>optional int32 size = 1;</code>
      */
     int getSize();
 
     /**
-     * <code>optional int32 interval_us = 2;</code>
-     *
      * <pre>
      * Desired interval between consecutive responses in the response stream in
      * microseconds.
      * </pre>
+     *
+     * <code>optional int32 interval_us = 2;</code>
      */
     int getIntervalUs();
   }
   /**
-   * Protobuf type {@code grpc.testing.ResponseParameters}
-   *
    * <pre>
    * Configuration for a particular response.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.ResponseParameters}
    */
   public  static final class ResponseParameters extends
       com.google.protobuf.GeneratedMessage implements
@@ -5002,7 +4993,8 @@
     }
     private ResponseParameters(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -5032,11 +5024,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -5056,12 +5047,12 @@
     public static final int SIZE_FIELD_NUMBER = 1;
     private int size_;
     /**
-     * <code>optional int32 size = 1;</code>
-     *
      * <pre>
      * Desired payload sizes in responses from the server.
      * If response_type is COMPRESSABLE, this denotes the size before compression.
      * </pre>
+     *
+     * <code>optional int32 size = 1;</code>
      */
     public int getSize() {
       return size_;
@@ -5070,12 +5061,12 @@
     public static final int INTERVAL_US_FIELD_NUMBER = 2;
     private int intervalUs_;
     /**
-     * <code>optional int32 interval_us = 2;</code>
-     *
      * <pre>
      * Desired interval between consecutive responses in the response stream in
      * microseconds.
      * </pre>
+     *
+     * <code>optional int32 interval_us = 2;</code>
      */
     public int getIntervalUs() {
       return intervalUs_;
@@ -5142,34 +5133,40 @@
     }
     public static io.grpc.testing.integration.Messages.ResponseParameters parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.ResponseParameters parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.ResponseParameters parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.ResponseParameters parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.ResponseParameters parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.ResponseParameters parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -5191,11 +5188,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.ResponseParameters}
-     *
      * <pre>
      * Configuration for a particular response.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.ResponseParameters}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -5295,7 +5292,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Messages.ResponseParameters) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -5306,23 +5303,23 @@
 
       private int size_ ;
       /**
-       * <code>optional int32 size = 1;</code>
-       *
        * <pre>
        * Desired payload sizes in responses from the server.
        * If response_type is COMPRESSABLE, this denotes the size before compression.
        * </pre>
+       *
+       * <code>optional int32 size = 1;</code>
        */
       public int getSize() {
         return size_;
       }
       /**
-       * <code>optional int32 size = 1;</code>
-       *
        * <pre>
        * Desired payload sizes in responses from the server.
        * If response_type is COMPRESSABLE, this denotes the size before compression.
        * </pre>
+       *
+       * <code>optional int32 size = 1;</code>
        */
       public Builder setSize(int value) {
         
@@ -5331,12 +5328,12 @@
         return this;
       }
       /**
-       * <code>optional int32 size = 1;</code>
-       *
        * <pre>
        * Desired payload sizes in responses from the server.
        * If response_type is COMPRESSABLE, this denotes the size before compression.
        * </pre>
+       *
+       * <code>optional int32 size = 1;</code>
        */
       public Builder clearSize() {
         
@@ -5347,23 +5344,23 @@
 
       private int intervalUs_ ;
       /**
-       * <code>optional int32 interval_us = 2;</code>
-       *
        * <pre>
        * Desired interval between consecutive responses in the response stream in
        * microseconds.
        * </pre>
+       *
+       * <code>optional int32 interval_us = 2;</code>
        */
       public int getIntervalUs() {
         return intervalUs_;
       }
       /**
-       * <code>optional int32 interval_us = 2;</code>
-       *
        * <pre>
        * Desired interval between consecutive responses in the response stream in
        * microseconds.
        * </pre>
+       *
+       * <code>optional int32 interval_us = 2;</code>
        */
       public Builder setIntervalUs(int value) {
         
@@ -5372,12 +5369,12 @@
         return this;
       }
       /**
-       * <code>optional int32 interval_us = 2;</code>
-       *
        * <pre>
        * Desired interval between consecutive responses in the response stream in
        * microseconds.
        * </pre>
+       *
+       * <code>optional int32 interval_us = 2;</code>
        */
       public Builder clearIntervalUs() {
         
@@ -5415,16 +5412,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ResponseParameters(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -5448,145 +5436,145 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, the payload from each response in the stream
      * might be of different types. This is to simulate a mixed type of payload
      * stream.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     int getResponseTypeValue();
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, the payload from each response in the stream
      * might be of different types. This is to simulate a mixed type of payload
      * stream.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     io.grpc.testing.integration.Messages.PayloadType getResponseType();
 
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     java.util.List<io.grpc.testing.integration.Messages.ResponseParameters> 
         getResponseParametersList();
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     io.grpc.testing.integration.Messages.ResponseParameters getResponseParameters(int index);
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     int getResponseParametersCount();
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     java.util.List<? extends io.grpc.testing.integration.Messages.ResponseParametersOrBuilder> 
         getResponseParametersOrBuilderList();
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     io.grpc.testing.integration.Messages.ResponseParametersOrBuilder getResponseParametersOrBuilder(
         int index);
 
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     boolean hasPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     io.grpc.testing.integration.Messages.Payload getPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder();
 
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     int getResponseCompressionValue();
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     io.grpc.testing.integration.Messages.CompressionType getResponseCompression();
 
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     boolean hasResponseStatus();
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     io.grpc.testing.integration.Messages.EchoStatus getResponseStatus();
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     io.grpc.testing.integration.Messages.EchoStatusOrBuilder getResponseStatusOrBuilder();
   }
   /**
-   * Protobuf type {@code grpc.testing.StreamingOutputCallRequest}
-   *
    * <pre>
    * Server-streaming request.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.StreamingOutputCallRequest}
    */
   public  static final class StreamingOutputCallRequest extends
       com.google.protobuf.GeneratedMessage implements
@@ -5609,7 +5597,8 @@
     }
     private StreamingOutputCallRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -5675,11 +5664,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
           responseParameters_ = java.util.Collections.unmodifiableList(responseParameters_);
@@ -5703,82 +5691,82 @@
     public static final int RESPONSE_TYPE_FIELD_NUMBER = 1;
     private int responseType_;
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, the payload from each response in the stream
      * might be of different types. This is to simulate a mixed type of payload
      * stream.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     public int getResponseTypeValue() {
       return responseType_;
     }
     /**
-     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-     *
      * <pre>
      * Desired payload type in the response from the server.
      * If response_type is RANDOM, the payload from each response in the stream
      * might be of different types. This is to simulate a mixed type of payload
      * stream.
      * </pre>
+     *
+     * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
      */
     public io.grpc.testing.integration.Messages.PayloadType getResponseType() {
-      io.grpc.testing.integration.Messages.PayloadType result = io.grpc.testing.integration.Messages.PayloadType.valueOf(responseType_);
+      io.grpc.testing.integration.Messages.PayloadType result = io.grpc.testing.integration.Messages.PayloadType.forNumber(responseType_);
       return result == null ? io.grpc.testing.integration.Messages.PayloadType.UNRECOGNIZED : result;
     }
 
     public static final int RESPONSE_PARAMETERS_FIELD_NUMBER = 2;
     private java.util.List<io.grpc.testing.integration.Messages.ResponseParameters> responseParameters_;
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     public java.util.List<io.grpc.testing.integration.Messages.ResponseParameters> getResponseParametersList() {
       return responseParameters_;
     }
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     public java.util.List<? extends io.grpc.testing.integration.Messages.ResponseParametersOrBuilder> 
         getResponseParametersOrBuilderList() {
       return responseParameters_;
     }
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     public int getResponseParametersCount() {
       return responseParameters_.size();
     }
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     public io.grpc.testing.integration.Messages.ResponseParameters getResponseParameters(int index) {
       return responseParameters_.get(index);
     }
     /**
-     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-     *
      * <pre>
      * Configuration for each expected response message.
      * </pre>
+     *
+     * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
      */
     public io.grpc.testing.integration.Messages.ResponseParametersOrBuilder getResponseParametersOrBuilder(
         int index) {
@@ -5788,31 +5776,31 @@
     public static final int PAYLOAD_FIELD_NUMBER = 3;
     private io.grpc.testing.integration.Messages.Payload payload_;
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     public boolean hasPayload() {
       return payload_ != null;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     public io.grpc.testing.integration.Messages.Payload getPayload() {
       return payload_ == null ? io.grpc.testing.integration.Messages.Payload.getDefaultInstance() : payload_;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 3;</code>
-     *
      * <pre>
      * Optional input payload sent along with the request.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 3;</code>
      */
     public io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder() {
       return getPayload();
@@ -5821,55 +5809,55 @@
     public static final int RESPONSE_COMPRESSION_FIELD_NUMBER = 6;
     private int responseCompression_;
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     public int getResponseCompressionValue() {
       return responseCompression_;
     }
     /**
-     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-     *
      * <pre>
      * Compression algorithm to be used by the server for the response (stream)
      * </pre>
+     *
+     * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
      */
     public io.grpc.testing.integration.Messages.CompressionType getResponseCompression() {
-      io.grpc.testing.integration.Messages.CompressionType result = io.grpc.testing.integration.Messages.CompressionType.valueOf(responseCompression_);
+      io.grpc.testing.integration.Messages.CompressionType result = io.grpc.testing.integration.Messages.CompressionType.forNumber(responseCompression_);
       return result == null ? io.grpc.testing.integration.Messages.CompressionType.UNRECOGNIZED : result;
     }
 
     public static final int RESPONSE_STATUS_FIELD_NUMBER = 7;
     private io.grpc.testing.integration.Messages.EchoStatus responseStatus_;
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     public boolean hasResponseStatus() {
       return responseStatus_ != null;
     }
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     public io.grpc.testing.integration.Messages.EchoStatus getResponseStatus() {
       return responseStatus_ == null ? io.grpc.testing.integration.Messages.EchoStatus.getDefaultInstance() : responseStatus_;
     }
     /**
-     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-     *
      * <pre>
      * Whether server should return a given status
      * </pre>
+     *
+     * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
      */
     public io.grpc.testing.integration.Messages.EchoStatusOrBuilder getResponseStatusOrBuilder() {
       return getResponseStatus();
@@ -5957,34 +5945,40 @@
     }
     public static io.grpc.testing.integration.Messages.StreamingOutputCallRequest parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.StreamingOutputCallRequest parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.StreamingOutputCallRequest parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.StreamingOutputCallRequest parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.StreamingOutputCallRequest parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.StreamingOutputCallRequest parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -6006,11 +6000,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.StreamingOutputCallRequest}
-     *
      * <pre>
      * Server-streaming request.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.StreamingOutputCallRequest}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -6183,7 +6177,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Messages.StreamingOutputCallRequest) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -6195,27 +6189,27 @@
 
       private int responseType_ = 0;
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, the payload from each response in the stream
        * might be of different types. This is to simulate a mixed type of payload
        * stream.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public int getResponseTypeValue() {
         return responseType_;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, the payload from each response in the stream
        * might be of different types. This is to simulate a mixed type of payload
        * stream.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public Builder setResponseTypeValue(int value) {
         responseType_ = value;
@@ -6223,28 +6217,28 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, the payload from each response in the stream
        * might be of different types. This is to simulate a mixed type of payload
        * stream.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public io.grpc.testing.integration.Messages.PayloadType getResponseType() {
-        io.grpc.testing.integration.Messages.PayloadType result = io.grpc.testing.integration.Messages.PayloadType.valueOf(responseType_);
+        io.grpc.testing.integration.Messages.PayloadType result = io.grpc.testing.integration.Messages.PayloadType.forNumber(responseType_);
         return result == null ? io.grpc.testing.integration.Messages.PayloadType.UNRECOGNIZED : result;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, the payload from each response in the stream
        * might be of different types. This is to simulate a mixed type of payload
        * stream.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public Builder setResponseType(io.grpc.testing.integration.Messages.PayloadType value) {
         if (value == null) {
@@ -6256,14 +6250,14 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
-       *
        * <pre>
        * Desired payload type in the response from the server.
        * If response_type is RANDOM, the payload from each response in the stream
        * might be of different types. This is to simulate a mixed type of payload
        * stream.
        * </pre>
+       *
+       * <code>optional .grpc.testing.PayloadType response_type = 1;</code>
        */
       public Builder clearResponseType() {
         
@@ -6285,11 +6279,11 @@
           io.grpc.testing.integration.Messages.ResponseParameters, io.grpc.testing.integration.Messages.ResponseParameters.Builder, io.grpc.testing.integration.Messages.ResponseParametersOrBuilder> responseParametersBuilder_;
 
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public java.util.List<io.grpc.testing.integration.Messages.ResponseParameters> getResponseParametersList() {
         if (responseParametersBuilder_ == null) {
@@ -6299,11 +6293,11 @@
         }
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public int getResponseParametersCount() {
         if (responseParametersBuilder_ == null) {
@@ -6313,11 +6307,11 @@
         }
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public io.grpc.testing.integration.Messages.ResponseParameters getResponseParameters(int index) {
         if (responseParametersBuilder_ == null) {
@@ -6327,11 +6321,11 @@
         }
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder setResponseParameters(
           int index, io.grpc.testing.integration.Messages.ResponseParameters value) {
@@ -6348,11 +6342,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder setResponseParameters(
           int index, io.grpc.testing.integration.Messages.ResponseParameters.Builder builderForValue) {
@@ -6366,11 +6360,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder addResponseParameters(io.grpc.testing.integration.Messages.ResponseParameters value) {
         if (responseParametersBuilder_ == null) {
@@ -6386,11 +6380,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder addResponseParameters(
           int index, io.grpc.testing.integration.Messages.ResponseParameters value) {
@@ -6407,11 +6401,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder addResponseParameters(
           io.grpc.testing.integration.Messages.ResponseParameters.Builder builderForValue) {
@@ -6425,11 +6419,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder addResponseParameters(
           int index, io.grpc.testing.integration.Messages.ResponseParameters.Builder builderForValue) {
@@ -6443,11 +6437,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder addAllResponseParameters(
           java.lang.Iterable<? extends io.grpc.testing.integration.Messages.ResponseParameters> values) {
@@ -6462,11 +6456,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder clearResponseParameters() {
         if (responseParametersBuilder_ == null) {
@@ -6479,11 +6473,11 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public Builder removeResponseParameters(int index) {
         if (responseParametersBuilder_ == null) {
@@ -6496,22 +6490,22 @@
         return this;
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public io.grpc.testing.integration.Messages.ResponseParameters.Builder getResponseParametersBuilder(
           int index) {
         return getResponseParametersFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public io.grpc.testing.integration.Messages.ResponseParametersOrBuilder getResponseParametersOrBuilder(
           int index) {
@@ -6521,11 +6515,11 @@
         }
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public java.util.List<? extends io.grpc.testing.integration.Messages.ResponseParametersOrBuilder> 
            getResponseParametersOrBuilderList() {
@@ -6536,22 +6530,22 @@
         }
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public io.grpc.testing.integration.Messages.ResponseParameters.Builder addResponseParametersBuilder() {
         return getResponseParametersFieldBuilder().addBuilder(
             io.grpc.testing.integration.Messages.ResponseParameters.getDefaultInstance());
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public io.grpc.testing.integration.Messages.ResponseParameters.Builder addResponseParametersBuilder(
           int index) {
@@ -6559,11 +6553,11 @@
             index, io.grpc.testing.integration.Messages.ResponseParameters.getDefaultInstance());
       }
       /**
-       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
-       *
        * <pre>
        * Configuration for each expected response message.
        * </pre>
+       *
+       * <code>repeated .grpc.testing.ResponseParameters response_parameters = 2;</code>
        */
       public java.util.List<io.grpc.testing.integration.Messages.ResponseParameters.Builder> 
            getResponseParametersBuilderList() {
@@ -6588,21 +6582,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.testing.integration.Messages.Payload, io.grpc.testing.integration.Messages.Payload.Builder, io.grpc.testing.integration.Messages.PayloadOrBuilder> payloadBuilder_;
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public boolean hasPayload() {
         return payloadBuilder_ != null || payload_ != null;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public io.grpc.testing.integration.Messages.Payload getPayload() {
         if (payloadBuilder_ == null) {
@@ -6612,11 +6606,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder setPayload(io.grpc.testing.integration.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -6632,11 +6626,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder setPayload(
           io.grpc.testing.integration.Messages.Payload.Builder builderForValue) {
@@ -6650,11 +6644,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder mergePayload(io.grpc.testing.integration.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -6672,11 +6666,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public Builder clearPayload() {
         if (payloadBuilder_ == null) {
@@ -6690,11 +6684,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public io.grpc.testing.integration.Messages.Payload.Builder getPayloadBuilder() {
         
@@ -6702,11 +6696,11 @@
         return getPayloadFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       public io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder() {
         if (payloadBuilder_ != null) {
@@ -6717,11 +6711,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 3;</code>
-       *
        * <pre>
        * Optional input payload sent along with the request.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 3;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.testing.integration.Messages.Payload, io.grpc.testing.integration.Messages.Payload.Builder, io.grpc.testing.integration.Messages.PayloadOrBuilder> 
@@ -6739,21 +6733,21 @@
 
       private int responseCompression_ = 0;
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public int getResponseCompressionValue() {
         return responseCompression_;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public Builder setResponseCompressionValue(int value) {
         responseCompression_ = value;
@@ -6761,22 +6755,22 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public io.grpc.testing.integration.Messages.CompressionType getResponseCompression() {
-        io.grpc.testing.integration.Messages.CompressionType result = io.grpc.testing.integration.Messages.CompressionType.valueOf(responseCompression_);
+        io.grpc.testing.integration.Messages.CompressionType result = io.grpc.testing.integration.Messages.CompressionType.forNumber(responseCompression_);
         return result == null ? io.grpc.testing.integration.Messages.CompressionType.UNRECOGNIZED : result;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public Builder setResponseCompression(io.grpc.testing.integration.Messages.CompressionType value) {
         if (value == null) {
@@ -6788,11 +6782,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
-       *
        * <pre>
        * Compression algorithm to be used by the server for the response (stream)
        * </pre>
+       *
+       * <code>optional .grpc.testing.CompressionType response_compression = 6;</code>
        */
       public Builder clearResponseCompression() {
         
@@ -6805,21 +6799,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.testing.integration.Messages.EchoStatus, io.grpc.testing.integration.Messages.EchoStatus.Builder, io.grpc.testing.integration.Messages.EchoStatusOrBuilder> responseStatusBuilder_;
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public boolean hasResponseStatus() {
         return responseStatusBuilder_ != null || responseStatus_ != null;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public io.grpc.testing.integration.Messages.EchoStatus getResponseStatus() {
         if (responseStatusBuilder_ == null) {
@@ -6829,11 +6823,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder setResponseStatus(io.grpc.testing.integration.Messages.EchoStatus value) {
         if (responseStatusBuilder_ == null) {
@@ -6849,11 +6843,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder setResponseStatus(
           io.grpc.testing.integration.Messages.EchoStatus.Builder builderForValue) {
@@ -6867,11 +6861,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder mergeResponseStatus(io.grpc.testing.integration.Messages.EchoStatus value) {
         if (responseStatusBuilder_ == null) {
@@ -6889,11 +6883,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public Builder clearResponseStatus() {
         if (responseStatusBuilder_ == null) {
@@ -6907,11 +6901,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public io.grpc.testing.integration.Messages.EchoStatus.Builder getResponseStatusBuilder() {
         
@@ -6919,11 +6913,11 @@
         return getResponseStatusFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       public io.grpc.testing.integration.Messages.EchoStatusOrBuilder getResponseStatusOrBuilder() {
         if (responseStatusBuilder_ != null) {
@@ -6934,11 +6928,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
-       *
        * <pre>
        * Whether server should return a given status
        * </pre>
+       *
+       * <code>optional .grpc.testing.EchoStatus response_status = 7;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.testing.integration.Messages.EchoStatus, io.grpc.testing.integration.Messages.EchoStatus.Builder, io.grpc.testing.integration.Messages.EchoStatusOrBuilder> 
@@ -6983,16 +6977,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new StreamingOutputCallRequest(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -7016,36 +7001,36 @@
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase response size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     boolean hasPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase response size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     io.grpc.testing.integration.Messages.Payload getPayload();
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase response size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder();
   }
   /**
-   * Protobuf type {@code grpc.testing.StreamingOutputCallResponse}
-   *
    * <pre>
    * Server-streaming response, as configured by the request and parameters.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.StreamingOutputCallResponse}
    */
   public  static final class StreamingOutputCallResponse extends
       com.google.protobuf.GeneratedMessage implements
@@ -7065,7 +7050,8 @@
     }
     private StreamingOutputCallResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -7098,11 +7084,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -7122,31 +7107,31 @@
     public static final int PAYLOAD_FIELD_NUMBER = 1;
     private io.grpc.testing.integration.Messages.Payload payload_;
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase response size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public boolean hasPayload() {
       return payload_ != null;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase response size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public io.grpc.testing.integration.Messages.Payload getPayload() {
       return payload_ == null ? io.grpc.testing.integration.Messages.Payload.getDefaultInstance() : payload_;
     }
     /**
-     * <code>optional .grpc.testing.Payload payload = 1;</code>
-     *
      * <pre>
      * Payload to increase response size.
      * </pre>
+     *
+     * <code>optional .grpc.testing.Payload payload = 1;</code>
      */
     public io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder() {
       return getPayload();
@@ -7206,34 +7191,40 @@
     }
     public static io.grpc.testing.integration.Messages.StreamingOutputCallResponse parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.StreamingOutputCallResponse parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.StreamingOutputCallResponse parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.StreamingOutputCallResponse parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.StreamingOutputCallResponse parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.StreamingOutputCallResponse parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -7255,11 +7246,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.StreamingOutputCallResponse}
-     *
      * <pre>
      * Server-streaming response, as configured by the request and parameters.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.StreamingOutputCallResponse}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -7361,7 +7352,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Messages.StreamingOutputCallResponse) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -7374,21 +7365,21 @@
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.testing.integration.Messages.Payload, io.grpc.testing.integration.Messages.Payload.Builder, io.grpc.testing.integration.Messages.PayloadOrBuilder> payloadBuilder_;
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public boolean hasPayload() {
         return payloadBuilder_ != null || payload_ != null;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.testing.integration.Messages.Payload getPayload() {
         if (payloadBuilder_ == null) {
@@ -7398,11 +7389,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder setPayload(io.grpc.testing.integration.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -7418,11 +7409,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder setPayload(
           io.grpc.testing.integration.Messages.Payload.Builder builderForValue) {
@@ -7436,11 +7427,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder mergePayload(io.grpc.testing.integration.Messages.Payload value) {
         if (payloadBuilder_ == null) {
@@ -7458,11 +7449,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public Builder clearPayload() {
         if (payloadBuilder_ == null) {
@@ -7476,11 +7467,11 @@
         return this;
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.testing.integration.Messages.Payload.Builder getPayloadBuilder() {
         
@@ -7488,11 +7479,11 @@
         return getPayloadFieldBuilder().getBuilder();
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       public io.grpc.testing.integration.Messages.PayloadOrBuilder getPayloadOrBuilder() {
         if (payloadBuilder_ != null) {
@@ -7503,11 +7494,11 @@
         }
       }
       /**
-       * <code>optional .grpc.testing.Payload payload = 1;</code>
-       *
        * <pre>
        * Payload to increase response size.
        * </pre>
+       *
+       * <code>optional .grpc.testing.Payload payload = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilder<
           io.grpc.testing.integration.Messages.Payload, io.grpc.testing.integration.Messages.Payload.Builder, io.grpc.testing.integration.Messages.PayloadOrBuilder> 
@@ -7552,16 +7543,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new StreamingOutputCallResponse(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -7590,12 +7572,12 @@
     int getMaxReconnectBackoffMs();
   }
   /**
-   * Protobuf type {@code grpc.testing.ReconnectParams}
-   *
    * <pre>
    * For reconnect interop test only.
    * Client tells server what reconnection parameters it used.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.ReconnectParams}
    */
   public  static final class ReconnectParams extends
       com.google.protobuf.GeneratedMessage implements
@@ -7616,7 +7598,8 @@
     }
     private ReconnectParams(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -7641,11 +7624,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -7725,34 +7707,40 @@
     }
     public static io.grpc.testing.integration.Messages.ReconnectParams parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.ReconnectParams parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.ReconnectParams parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.ReconnectParams parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.ReconnectParams parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.ReconnectParams parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -7774,12 +7762,12 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.ReconnectParams}
-     *
      * <pre>
      * For reconnect interop test only.
      * Client tells server what reconnection parameters it used.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.ReconnectParams}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -7873,7 +7861,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Messages.ReconnectParams) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -7937,16 +7925,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ReconnectParams(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -7988,13 +7967,13 @@
     int getBackoffMs(int index);
   }
   /**
-   * Protobuf type {@code grpc.testing.ReconnectInfo}
-   *
    * <pre>
    * For reconnect interop test only.
    * Server tells client whether its reconnects are following the spec and the
    * reconnect backoffs it saw.
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.ReconnectInfo}
    */
   public  static final class ReconnectInfo extends
       com.google.protobuf.GeneratedMessage implements
@@ -8016,7 +7995,8 @@
     }
     private ReconnectInfo(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -8062,11 +8042,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) {
           backoffMs_ = java.util.Collections.unmodifiableList(backoffMs_);
@@ -8195,34 +8174,40 @@
     }
     public static io.grpc.testing.integration.Messages.ReconnectInfo parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.ReconnectInfo parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.ReconnectInfo parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.ReconnectInfo parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Messages.ReconnectInfo parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Messages.ReconnectInfo parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -8244,13 +8229,13 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.ReconnectInfo}
-     *
      * <pre>
      * For reconnect interop test only.
      * Server tells client whether its reconnects are following the spec and the
      * reconnect backoffs it saw.
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.ReconnectInfo}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -8364,7 +8349,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Messages.ReconnectInfo) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -8495,16 +8480,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new ReconnectInfo(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -8523,64 +8499,64 @@
 
   }
 
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_Payload_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_Payload_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_EchoStatus_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_EchoStatus_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_SimpleRequest_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_SimpleRequest_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_SimpleResponse_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_SimpleResponse_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_SimpleContext_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_SimpleContext_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_StreamingInputCallRequest_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_StreamingInputCallRequest_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_StreamingInputCallResponse_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_StreamingInputCallResponse_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ResponseParameters_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ResponseParameters_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_StreamingOutputCallRequest_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_StreamingOutputCallRequest_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_StreamingOutputCallResponse_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_StreamingOutputCallResponse_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ReconnectParams_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ReconnectParams_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_ReconnectInfo_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_ReconnectInfo_fieldAccessorTable;
 
@@ -8588,7 +8564,7 @@
       getDescriptor() {
     return descriptor;
   }
-  private static com.google.protobuf.Descriptors.FileDescriptor
+  private static  com.google.protobuf.Descriptors.FileDescriptor
       descriptor;
   static {
     java.lang.String[] descriptorData = {
diff --git a/interop-testing/src/generated/main/java/io/grpc/testing/integration/Metrics.java b/interop-testing/src/generated/main/java/io/grpc/testing/integration/Metrics.java
index f9faf03..de70c66 100644
--- a/interop-testing/src/generated/main/java/io/grpc/testing/integration/Metrics.java
+++ b/interop-testing/src/generated/main/java/io/grpc/testing/integration/Metrics.java
@@ -45,11 +45,11 @@
     public io.grpc.testing.integration.Metrics.GaugeResponse.ValueCase getValueCase();
   }
   /**
-   * Protobuf type {@code grpc.testing.GaugeResponse}
-   *
    * <pre>
    * Reponse message containing the gauge name and value
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.GaugeResponse}
    */
   public  static final class GaugeResponse extends
       com.google.protobuf.GeneratedMessage implements
@@ -70,7 +70,8 @@
     }
     private GaugeResponse(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -112,11 +113,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -141,18 +141,25 @@
       DOUBLE_VALUE(3),
       STRING_VALUE(4),
       VALUE_NOT_SET(0);
-      private int value = 0;
+      private final int value;
       private ValueCase(int value) {
         this.value = value;
       }
+      /**
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
       public static ValueCase valueOf(int value) {
+        return forNumber(value);
+      }
+
+      public static ValueCase forNumber(int value) {
         switch (value) {
           case 2: return LONG_VALUE;
           case 3: return DOUBLE_VALUE;
           case 4: return STRING_VALUE;
           case 0: return VALUE_NOT_SET;
-          default: throw new java.lang.IllegalArgumentException(
-            "Value is undefined for this oneof enum.");
+          default: return null;
         }
       }
       public int getNumber() {
@@ -162,7 +169,7 @@
 
     public ValueCase
     getValueCase() {
-      return ValueCase.valueOf(
+      return ValueCase.forNumber(
           valueCase_);
     }
 
@@ -342,34 +349,40 @@
     }
     public static io.grpc.testing.integration.Metrics.GaugeResponse parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Metrics.GaugeResponse parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Metrics.GaugeResponse parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Metrics.GaugeResponse parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Metrics.GaugeResponse parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Metrics.GaugeResponse parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -391,11 +404,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.GaugeResponse}
-     *
      * <pre>
      * Reponse message containing the gauge name and value
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.GaugeResponse}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -521,7 +534,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Metrics.GaugeResponse) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -533,7 +546,7 @@
       private java.lang.Object value_;
       public ValueCase
           getValueCase() {
-        return ValueCase.valueOf(
+        return ValueCase.forNumber(
             valueCase_);
       }
 
@@ -783,16 +796,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new GaugeResponse(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -826,11 +830,11 @@
         getNameBytes();
   }
   /**
-   * Protobuf type {@code grpc.testing.GaugeRequest}
-   *
    * <pre>
    * Request message containing the gauge name
    * </pre>
+   *
+   * Protobuf type {@code grpc.testing.GaugeRequest}
    */
   public  static final class GaugeRequest extends
       com.google.protobuf.GeneratedMessage implements
@@ -851,7 +855,8 @@
     }
     private GaugeRequest(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       int mutable_bitField0_ = 0;
       try {
@@ -877,11 +882,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -985,34 +989,40 @@
     }
     public static io.grpc.testing.integration.Metrics.GaugeRequest parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Metrics.GaugeRequest parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Metrics.GaugeRequest parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Metrics.GaugeRequest parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Metrics.GaugeRequest parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Metrics.GaugeRequest parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -1034,11 +1044,11 @@
       return builder;
     }
     /**
-     * Protobuf type {@code grpc.testing.GaugeRequest}
-     *
      * <pre>
      * Request message containing the gauge name
      * </pre>
+     *
+     * Protobuf type {@code grpc.testing.GaugeRequest}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessage.Builder<Builder> implements
@@ -1133,7 +1143,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Metrics.GaugeRequest) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -1240,16 +1250,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new GaugeRequest(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -1293,7 +1294,8 @@
     }
     private EmptyMessage(
         com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
       this();
       try {
         boolean done = false;
@@ -1312,11 +1314,10 @@
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw new RuntimeException(e.setUnfinishedMessage(this));
+        throw e.setUnfinishedMessage(this);
       } catch (java.io.IOException e) {
-        throw new RuntimeException(
-            new com.google.protobuf.InvalidProtocolBufferException(
-                e.getMessage()).setUnfinishedMessage(this));
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
       } finally {
         makeExtensionsImmutable();
       }
@@ -1380,34 +1381,40 @@
     }
     public static io.grpc.testing.integration.Metrics.EmptyMessage parseFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Metrics.EmptyMessage parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Metrics.EmptyMessage parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Metrics.EmptyMessage parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
     public static io.grpc.testing.integration.Metrics.EmptyMessage parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
-      return PARSER.parseFrom(input);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input);
     }
     public static io.grpc.testing.integration.Metrics.EmptyMessage parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
-      return PARSER.parseFrom(input, extensionRegistry);
+      return com.google.protobuf.GeneratedMessage
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
     public Builder newBuilderForType() { return newBuilder(); }
@@ -1517,7 +1524,7 @@
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
           parsedMessage = (io.grpc.testing.integration.Metrics.EmptyMessage) e.getUnfinishedMessage();
-          throw e;
+          throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
@@ -1555,16 +1562,7 @@
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        try {
           return new EmptyMessage(input, extensionRegistry);
-        } catch (RuntimeException e) {
-          if (e.getCause() instanceof
-              com.google.protobuf.InvalidProtocolBufferException) {
-            throw (com.google.protobuf.InvalidProtocolBufferException)
-                e.getCause();
-          }
-          throw e;
-        }
       }
     };
 
@@ -1583,19 +1581,19 @@
 
   }
 
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_GaugeResponse_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_GaugeResponse_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_GaugeRequest_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_GaugeRequest_fieldAccessorTable;
-  private static com.google.protobuf.Descriptors.Descriptor
+  private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_testing_EmptyMessage_descriptor;
-  private static
+  private static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_testing_EmptyMessage_fieldAccessorTable;
 
@@ -1603,7 +1601,7 @@
       getDescriptor() {
     return descriptor;
   }
-  private static com.google.protobuf.Descriptors.FileDescriptor
+  private static  com.google.protobuf.Descriptors.FileDescriptor
       descriptor;
   static {
     java.lang.String[] descriptorData = {
diff --git a/interop-testing/src/generated/main/java/io/grpc/testing/integration/Test.java b/interop-testing/src/generated/main/java/io/grpc/testing/integration/Test.java
index 7ecf881..d8e2ee1 100644
--- a/interop-testing/src/generated/main/java/io/grpc/testing/integration/Test.java
+++ b/interop-testing/src/generated/main/java/io/grpc/testing/integration/Test.java
@@ -13,7 +13,7 @@
       getDescriptor() {
     return descriptor;
   }
-  private static com.google.protobuf.Descriptors.FileDescriptor
+  private static  com.google.protobuf.Descriptors.FileDescriptor
       descriptor;
   static {
     java.lang.String[] descriptorData = {
diff --git a/services/src/generated/main/java/io/grpc/health/v1/HealthCheckRequest.java b/services/src/generated/main/java/io/grpc/health/v1/HealthCheckRequest.java
index b06ac1b..99d309c 100644
--- a/services/src/generated/main/java/io/grpc/health/v1/HealthCheckRequest.java
+++ b/services/src/generated/main/java/io/grpc/health/v1/HealthCheckRequest.java
@@ -25,7 +25,8 @@
   }
   private HealthCheckRequest(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -51,11 +52,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -159,34 +159,40 @@
   }
   public static io.grpc.health.v1.HealthCheckRequest parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.health.v1.HealthCheckRequest parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.health.v1.HealthCheckRequest parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.health.v1.HealthCheckRequest parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.health.v1.HealthCheckRequest parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.health.v1.HealthCheckRequest parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -303,7 +309,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.health.v1.HealthCheckRequest) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -410,16 +416,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new HealthCheckRequest(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/services/src/generated/main/java/io/grpc/health/v1/HealthCheckResponse.java b/services/src/generated/main/java/io/grpc/health/v1/HealthCheckResponse.java
index 2f94591..3a0a9ea 100644
--- a/services/src/generated/main/java/io/grpc/health/v1/HealthCheckResponse.java
+++ b/services/src/generated/main/java/io/grpc/health/v1/HealthCheckResponse.java
@@ -25,7 +25,8 @@
   }
   private HealthCheckResponse(
       com.google.protobuf.CodedInputStream input,
-      com.google.protobuf.ExtensionRegistryLite extensionRegistry) {
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
     this();
     int mutable_bitField0_ = 0;
     try {
@@ -51,11 +52,10 @@
         }
       }
     } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-      throw new RuntimeException(e.setUnfinishedMessage(this));
+      throw e.setUnfinishedMessage(this);
     } catch (java.io.IOException e) {
-      throw new RuntimeException(
-          new com.google.protobuf.InvalidProtocolBufferException(
-              e.getMessage()).setUnfinishedMessage(this));
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
     } finally {
       makeExtensionsImmutable();
     }
@@ -80,16 +80,16 @@
     /**
      * <code>UNKNOWN = 0;</code>
      */
-    UNKNOWN(0, 0),
+    UNKNOWN(0),
     /**
      * <code>SERVING = 1;</code>
      */
-    SERVING(1, 1),
+    SERVING(1),
     /**
      * <code>NOT_SERVING = 2;</code>
      */
-    NOT_SERVING(2, 2),
-    UNRECOGNIZED(-1, -1),
+    NOT_SERVING(2),
+    UNRECOGNIZED(-1),
     ;
 
     /**
@@ -107,14 +107,22 @@
 
 
     public final int getNumber() {
-      if (index == -1) {
+      if (this == UNRECOGNIZED) {
         throw new java.lang.IllegalArgumentException(
             "Can't get the number of an unknown enum value.");
       }
       return value;
     }
 
+    /**
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
     public static ServingStatus valueOf(int value) {
+      return forNumber(value);
+    }
+
+    public static ServingStatus forNumber(int value) {
       switch (value) {
         case 0: return UNKNOWN;
         case 1: return SERVING;
@@ -131,13 +139,13 @@
         ServingStatus> internalValueMap =
           new com.google.protobuf.Internal.EnumLiteMap<ServingStatus>() {
             public ServingStatus findValueByNumber(int number) {
-              return ServingStatus.valueOf(number);
+              return ServingStatus.forNumber(number);
             }
           };
 
     public final com.google.protobuf.Descriptors.EnumValueDescriptor
         getValueDescriptor() {
-      return getDescriptor().getValues().get(index);
+      return getDescriptor().getValues().get(ordinal());
     }
     public final com.google.protobuf.Descriptors.EnumDescriptor
         getDescriptorForType() {
@@ -162,11 +170,9 @@
       return VALUES[desc.getIndex()];
     }
 
-    private final int index;
     private final int value;
 
-    private ServingStatus(int index, int value) {
-      this.index = index;
+    private ServingStatus(int value) {
       this.value = value;
     }
 
@@ -185,7 +191,7 @@
    * <code>optional .grpc.health.v1.HealthCheckResponse.ServingStatus status = 1;</code>
    */
   public io.grpc.health.v1.HealthCheckResponse.ServingStatus getStatus() {
-    io.grpc.health.v1.HealthCheckResponse.ServingStatus result = io.grpc.health.v1.HealthCheckResponse.ServingStatus.valueOf(status_);
+    io.grpc.health.v1.HealthCheckResponse.ServingStatus result = io.grpc.health.v1.HealthCheckResponse.ServingStatus.forNumber(status_);
     return result == null ? io.grpc.health.v1.HealthCheckResponse.ServingStatus.UNRECOGNIZED : result;
   }
 
@@ -243,34 +249,40 @@
   }
   public static io.grpc.health.v1.HealthCheckResponse parseFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.health.v1.HealthCheckResponse parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.health.v1.HealthCheckResponse parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input);
   }
   public static io.grpc.health.v1.HealthCheckResponse parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
   public static io.grpc.health.v1.HealthCheckResponse parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
-    return PARSER.parseFrom(input);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input);
   }
   public static io.grpc.health.v1.HealthCheckResponse parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
-    return PARSER.parseFrom(input, extensionRegistry);
+    return com.google.protobuf.GeneratedMessage
+        .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
   public Builder newBuilderForType() { return newBuilder(); }
@@ -386,7 +398,7 @@
         parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
         parsedMessage = (io.grpc.health.v1.HealthCheckResponse) e.getUnfinishedMessage();
-        throw e;
+        throw e.unwrapIOException();
       } finally {
         if (parsedMessage != null) {
           mergeFrom(parsedMessage);
@@ -414,7 +426,7 @@
      * <code>optional .grpc.health.v1.HealthCheckResponse.ServingStatus status = 1;</code>
      */
     public io.grpc.health.v1.HealthCheckResponse.ServingStatus getStatus() {
-      io.grpc.health.v1.HealthCheckResponse.ServingStatus result = io.grpc.health.v1.HealthCheckResponse.ServingStatus.valueOf(status_);
+      io.grpc.health.v1.HealthCheckResponse.ServingStatus result = io.grpc.health.v1.HealthCheckResponse.ServingStatus.forNumber(status_);
       return result == null ? io.grpc.health.v1.HealthCheckResponse.ServingStatus.UNRECOGNIZED : result;
     }
     /**
@@ -468,16 +480,7 @@
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
-      try {
         return new HealthCheckResponse(input, extensionRegistry);
-      } catch (RuntimeException e) {
-        if (e.getCause() instanceof
-            com.google.protobuf.InvalidProtocolBufferException) {
-          throw (com.google.protobuf.InvalidProtocolBufferException)
-              e.getCause();
-        }
-        throw e;
-      }
     }
   };
 
diff --git a/services/src/generated/main/java/io/grpc/health/v1/HealthProto.java b/services/src/generated/main/java/io/grpc/health/v1/HealthProto.java
index 31f1e78..526b98c 100644
--- a/services/src/generated/main/java/io/grpc/health/v1/HealthProto.java
+++ b/services/src/generated/main/java/io/grpc/health/v1/HealthProto.java
@@ -8,14 +8,14 @@
   public static void registerAllExtensions(
       com.google.protobuf.ExtensionRegistry registry) {
   }
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_health_v1_HealthCheckRequest_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_health_v1_HealthCheckRequest_fieldAccessorTable;
-  static com.google.protobuf.Descriptors.Descriptor
+  static final com.google.protobuf.Descriptors.Descriptor
     internal_static_grpc_health_v1_HealthCheckResponse_descriptor;
-  static
+  static final 
     com.google.protobuf.GeneratedMessage.FieldAccessorTable
       internal_static_grpc_health_v1_HealthCheckResponse_fieldAccessorTable;
 
@@ -23,7 +23,7 @@
       getDescriptor() {
     return descriptor;
   }
-  private static com.google.protobuf.Descriptors.FileDescriptor
+  private static  com.google.protobuf.Descriptors.FileDescriptor
       descriptor;
   static {
     java.lang.String[] descriptorData = {
