diff --git a/generate_java_binder.cpp b/generate_java_binder.cpp
index 4d9d708..b9c7674 100644
--- a/generate_java_binder.cpp
+++ b/generate_java_binder.cpp
@@ -662,41 +662,22 @@
   auto _status = std::make_shared<Variable>("boolean", "_status");
   tryStatement->statements->Add(std::make_shared<VariableDeclaration>(_status, call));
 
-  // If the transaction returns false, which means UNKNOWN_TRANSACTION, fall back to the local
-  // method in the default impl, if set before. Otherwise, throw a RuntimeException if the interface
-  // is versioned. We can't throw the exception for unversioned interface because that would be an
-  // app breaking change.
+  // If the transaction returns false, which means UNKNOWN_TRANSACTION, fall
+  // back to the local method in the default impl, if set before.
   vector<string> arg_names;
   for (const auto& arg : method.GetArguments()) {
     arg_names.emplace_back(arg->GetName());
   }
   bool has_return_type = method.GetType().GetName() != "void";
-
-  auto checkDefaultImpl = std::make_shared<IfStatement>();
-  checkDefaultImpl->expression = std::make_shared<LiteralExpression>("getDefaultImpl() != null");
-  if (has_return_type) {
-    checkDefaultImpl->statements->Add(std::make_shared<LiteralStatement>(
-        android::base::StringPrintf("return getDefaultImpl().%s(%s);\n", method.GetName().c_str(),
-                                    Join(arg_names, ", ").c_str())));
-  } else {
-    checkDefaultImpl->statements->Add(std::make_shared<LiteralStatement>(
-        android::base::StringPrintf("getDefaultImpl().%s(%s);\n", method.GetName().c_str(),
-                                    Join(arg_names, ", ").c_str())));
-    checkDefaultImpl->statements->Add(std::make_shared<LiteralStatement>("return;\n"));
-  }
-  if (options.Version() > 0) {
-    checkDefaultImpl->elseif = std::make_shared<IfStatement>();
-    checkDefaultImpl->elseif->statements->Add(
-        std::make_shared<LiteralStatement>(android::base::StringPrintf(
-            "throw new RuntimeException(\"Method %s is unimplemented.\");\n",
-            method.GetName().c_str())));
-  }
-
-  auto checkTransactionError = std::make_shared<IfStatement>();
-  checkTransactionError->expression = std::make_shared<LiteralExpression>("!_status");
-  checkTransactionError->statements->Add(checkDefaultImpl);
-
-  tryStatement->statements->Add(checkTransactionError);
+  tryStatement->statements->Add(std::make_shared<LiteralStatement>(
+      android::base::StringPrintf(has_return_type ? "if (!_status && getDefaultImpl() != null) {\n"
+                                                    "  return getDefaultImpl().%s(%s);\n"
+                                                    "}\n"
+                                                  : "if (!_status && getDefaultImpl() != null) {\n"
+                                                    "  getDefaultImpl().%s(%s);\n"
+                                                    "  return;\n"
+                                                    "}\n",
+                                  method.GetName().c_str(), Join(arg_names, ", ").c_str())));
 
   // throw back exceptions.
   if (_reply) {
diff --git a/tests/java_app/src/android/aidl/tests/TestVersionedInterface.java b/tests/java_app/src/android/aidl/tests/TestVersionedInterface.java
index 06b14a7..b14504b 100644
--- a/tests/java_app/src/android/aidl/tests/TestVersionedInterface.java
+++ b/tests/java_app/src/android/aidl/tests/TestVersionedInterface.java
@@ -16,22 +16,21 @@
 
 package android.aidl.tests;
 
-import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.core.Is.is;
 
+import androidx.test.core.app.ApplicationProvider;
 import android.aidl.versioned.tests.IFooInterface;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.ServiceManager;
-import androidx.test.core.app.ApplicationProvider;
+
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
+import org.junit.runner.RunWith;
 
 @RunWith(JUnit4.class)
 public class TestVersionedInterface {
@@ -54,14 +53,4 @@
     public void testGetInterfaceHash() throws RemoteException {
         assertThat(service.getInterfaceHash(), is("fcd4f9c806cbc8af3694d569fd1de1ecc8cf7d22"));
     }
-
-    @Rule public ExpectedException expectedException = ExpectedException.none();
-
-    @Test
-    public void testUnimplementedMethodTriggersException() throws RemoteException {
-      expectedException.expect(RuntimeException.class);
-      expectedException.expectMessage("Method bar is unimplemented.");
-
-      service.bar();
-    }
 }
diff --git a/tests/test_data_example_interface.cpp b/tests/test_data_example_interface.cpp
index a1c3498..6448dd3 100644
--- a/tests/test_data_example_interface.cpp
+++ b/tests/test_data_example_interface.cpp
@@ -340,10 +340,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_isEnabled, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().isEnabled();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().isEnabled();
           }
           _reply.readException();
           _result = (0!=_reply.readInt());
@@ -362,10 +360,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getState, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getState();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getState();
           }
           _reply.readException();
           _result = _reply.readInt();
@@ -384,10 +380,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getAddress, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getAddress();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getAddress();
           }
           _reply.readException();
           _result = _reply.readString();
@@ -407,10 +401,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getParcelables, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getParcelables();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getParcelables();
           }
           _reply.readException();
           _result = _reply.createTypedArray(android.foo.ExampleParcelable.CREATOR);
@@ -433,10 +425,8 @@
           _data.writeInt(mode);
           _data.writeInt(duration);
           boolean _status = mRemote.transact(Stub.TRANSACTION_setScanMode, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().setScanMode(mode, duration);
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().setScanMode(mode, duration);
           }
           _reply.readException();
           _result = (0!=_reply.readInt());
@@ -457,11 +447,9 @@
           _data.writeInterfaceToken(DESCRIPTOR);
           _data.writeStrongBinder((((foo!=null))?(foo.asBinder()):(null)));
           boolean _status = mRemote.transact(Stub.TRANSACTION_registerBinder, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              getDefaultImpl().registerBinder(foo);
-              return;
-            }
+          if (!_status && getDefaultImpl() != null) {
+            getDefaultImpl().registerBinder(foo);
+            return;
           }
           _reply.readException();
         }
@@ -478,10 +466,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getRecursiveBinder, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getRecursiveBinder();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getRecursiveBinder();
           }
           _reply.readException();
           _result = android.test.IExampleInterface.Stub.asInterface(_reply.readStrongBinder());
@@ -501,10 +487,8 @@
           _data.writeInterfaceToken(DESCRIPTOR);
           _data.writeStrongBinder((((arg!=null))?(arg.asBinder()):(null)));
           boolean _status = mRemote.transact(Stub.TRANSACTION_takesAnInterface, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().takesAnInterface(arg);
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().takesAnInterface(arg);
           }
           _reply.readException();
           _result = _reply.readInt();
@@ -537,10 +521,8 @@
             _data.writeInt(0);
           }
           boolean _status = mRemote.transact(Stub.TRANSACTION_takesAParcelable, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().takesAParcelable(arg, arg2);
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().takesAParcelable(arg, arg2);
           }
           _reply.readException();
           _result = _reply.readInt();
@@ -878,10 +860,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_isEnabled, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().isEnabled();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().isEnabled();
           }
           _reply.readException();
           _result = (0!=_reply.readInt());
@@ -900,10 +880,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getState, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getState();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getState();
           }
           _reply.readException();
           _result = _reply.readInt();
@@ -922,10 +900,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getAddress, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getAddress();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getAddress();
           }
           _reply.readException();
           _result = _reply.readString();
@@ -945,10 +921,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getParcelables, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getParcelables();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getParcelables();
           }
           _reply.readException();
           _result = _reply.createTypedArray(android.foo.ExampleParcelable.CREATOR);
@@ -971,10 +945,8 @@
           _data.writeInt(mode);
           _data.writeInt(duration);
           boolean _status = mRemote.transact(Stub.TRANSACTION_setScanMode, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().setScanMode(mode, duration);
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().setScanMode(mode, duration);
           }
           _reply.readException();
           _result = (0!=_reply.readInt());
@@ -995,11 +967,9 @@
           _data.writeInterfaceToken(DESCRIPTOR);
           _data.writeStrongBinder((((foo!=null))?(foo.asBinder()):(null)));
           boolean _status = mRemote.transact(Stub.TRANSACTION_registerBinder, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              getDefaultImpl().registerBinder(foo);
-              return;
-            }
+          if (!_status && getDefaultImpl() != null) {
+            getDefaultImpl().registerBinder(foo);
+            return;
           }
           _reply.readException();
         }
@@ -1016,10 +986,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getRecursiveBinder, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getRecursiveBinder();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getRecursiveBinder();
           }
           _reply.readException();
           _result = android.test.IExampleInterface.Stub.asInterface(_reply.readStrongBinder());
@@ -1039,10 +1007,8 @@
           _data.writeInterfaceToken(DESCRIPTOR);
           _data.writeStrongBinder((((arg!=null))?(arg.asBinder()):(null)));
           boolean _status = mRemote.transact(Stub.TRANSACTION_takesAnInterface, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().takesAnInterface(arg);
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().takesAnInterface(arg);
           }
           _reply.readException();
           _result = _reply.readInt();
@@ -1075,10 +1041,8 @@
             _data.writeInt(0);
           }
           boolean _status = mRemote.transact(Stub.TRANSACTION_takesAParcelable, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().takesAParcelable(arg, arg2);
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().takesAParcelable(arg, arg2);
           }
           _reply.readException();
           _result = _reply.readInt();
@@ -1419,10 +1383,8 @@
           android.os.Trace.traceBegin(android.os.Trace.TRACE_TAG_AIDL, "AIDL::java::IExampleInterface::isEnabled::client");
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_isEnabled, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().isEnabled();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().isEnabled();
           }
           _reply.readException();
           _result = (0!=_reply.readInt());
@@ -1443,10 +1405,8 @@
           android.os.Trace.traceBegin(android.os.Trace.TRACE_TAG_AIDL, "AIDL::java::IExampleInterface::getState::client");
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getState, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getState();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getState();
           }
           _reply.readException();
           _result = _reply.readInt();
@@ -1467,10 +1427,8 @@
           android.os.Trace.traceBegin(android.os.Trace.TRACE_TAG_AIDL, "AIDL::java::IExampleInterface::getAddress::client");
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getAddress, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getAddress();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getAddress();
           }
           _reply.readException();
           _result = _reply.readString();
@@ -1492,10 +1450,8 @@
           android.os.Trace.traceBegin(android.os.Trace.TRACE_TAG_AIDL, "AIDL::java::IExampleInterface::getParcelables::client");
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getParcelables, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getParcelables();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getParcelables();
           }
           _reply.readException();
           _result = _reply.createTypedArray(android.foo.ExampleParcelable.CREATOR);
@@ -1520,10 +1476,8 @@
           _data.writeInt(mode);
           _data.writeInt(duration);
           boolean _status = mRemote.transact(Stub.TRANSACTION_setScanMode, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().setScanMode(mode, duration);
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().setScanMode(mode, duration);
           }
           _reply.readException();
           _result = (0!=_reply.readInt());
@@ -1546,11 +1500,9 @@
           _data.writeInterfaceToken(DESCRIPTOR);
           _data.writeStrongBinder((((foo!=null))?(foo.asBinder()):(null)));
           boolean _status = mRemote.transact(Stub.TRANSACTION_registerBinder, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              getDefaultImpl().registerBinder(foo);
-              return;
-            }
+          if (!_status && getDefaultImpl() != null) {
+            getDefaultImpl().registerBinder(foo);
+            return;
           }
           _reply.readException();
         }
@@ -1569,10 +1521,8 @@
           android.os.Trace.traceBegin(android.os.Trace.TRACE_TAG_AIDL, "AIDL::java::IExampleInterface::getRecursiveBinder::client");
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getRecursiveBinder, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getRecursiveBinder();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getRecursiveBinder();
           }
           _reply.readException();
           _result = android.test.IExampleInterface.Stub.asInterface(_reply.readStrongBinder());
@@ -1594,10 +1544,8 @@
           _data.writeInterfaceToken(DESCRIPTOR);
           _data.writeStrongBinder((((arg!=null))?(arg.asBinder()):(null)));
           boolean _status = mRemote.transact(Stub.TRANSACTION_takesAnInterface, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().takesAnInterface(arg);
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().takesAnInterface(arg);
           }
           _reply.readException();
           _result = _reply.readInt();
@@ -1632,10 +1580,8 @@
             _data.writeInt(0);
           }
           boolean _status = mRemote.transact(Stub.TRANSACTION_takesAParcelable, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().takesAParcelable(arg, arg2);
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().takesAParcelable(arg, arg2);
           }
           _reply.readException();
           _result = _reply.readInt();
@@ -1868,10 +1814,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_isEnabled, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().isEnabled();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().isEnabled();
           }
           _reply.readException();
           _result = (0!=_reply.readInt());
@@ -1892,10 +1836,8 @@
           _data.writeInt(a);
           _data.writeInt(b);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getState, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getState(a, b);
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getState(a, b);
           }
           _reply.readException();
           _result = _reply.readInt();
@@ -1914,10 +1856,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getAddress, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getAddress();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getAddress();
           }
           _reply.readException();
           _result = _reply.readString();
@@ -1937,10 +1877,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getParcelables, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getParcelables();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getParcelables();
           }
           _reply.readException();
           _result = _reply.createTypedArray(android.foo.ExampleParcelable.CREATOR);
@@ -1963,10 +1901,8 @@
           _data.writeInt(mode);
           _data.writeInt(duration);
           boolean _status = mRemote.transact(Stub.TRANSACTION_setScanMode, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().setScanMode(mode, duration);
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().setScanMode(mode, duration);
           }
           _reply.readException();
           _result = (0!=_reply.readInt());
@@ -1987,11 +1923,9 @@
           _data.writeInterfaceToken(DESCRIPTOR);
           _data.writeStrongBinder((((foo!=null))?(foo.asBinder()):(null)));
           boolean _status = mRemote.transact(Stub.TRANSACTION_registerBinder, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              getDefaultImpl().registerBinder(foo);
-              return;
-            }
+          if (!_status && getDefaultImpl() != null) {
+            getDefaultImpl().registerBinder(foo);
+            return;
           }
           _reply.readException();
         }
@@ -2008,10 +1942,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getRecursiveBinder, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getRecursiveBinder();
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getRecursiveBinder();
           }
           _reply.readException();
           _result = android.test.IExampleInterface.Stub.asInterface(_reply.readStrongBinder());
@@ -2031,10 +1963,8 @@
           _data.writeInterfaceToken(DESCRIPTOR);
           _data.writeStrongBinder((((arg!=null))?(arg.asBinder()):(null)));
           boolean _status = mRemote.transact(Stub.TRANSACTION_takesAnInterface, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().takesAnInterface(arg);
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().takesAnInterface(arg);
           }
           _reply.readException();
           _result = _reply.readInt();
@@ -2067,10 +1997,8 @@
             _data.writeInt(0);
           }
           boolean _status = mRemote.transact(Stub.TRANSACTION_takesAParcelable, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().takesAParcelable(arg, arg2);
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().takesAParcelable(arg, arg2);
           }
           _reply.readException();
           _result = _reply.readInt();
@@ -2412,13 +2340,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_isEnabled, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().isEnabled();
-            }
-            else {
-              throw new RuntimeException("Method isEnabled is unimplemented.");
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().isEnabled();
           }
           _reply.readException();
           _result = (0!=_reply.readInt());
@@ -2439,13 +2362,8 @@
           _data.writeInt(a);
           _data.writeInt(b);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getState, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getState(a, b);
-            }
-            else {
-              throw new RuntimeException("Method getState is unimplemented.");
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getState(a, b);
           }
           _reply.readException();
           _result = _reply.readInt();
@@ -2464,13 +2382,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getAddress, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getAddress();
-            }
-            else {
-              throw new RuntimeException("Method getAddress is unimplemented.");
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getAddress();
           }
           _reply.readException();
           _result = _reply.readString();
@@ -2490,13 +2403,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getParcelables, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getParcelables();
-            }
-            else {
-              throw new RuntimeException("Method getParcelables is unimplemented.");
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getParcelables();
           }
           _reply.readException();
           _result = _reply.createTypedArray(android.foo.ExampleParcelable.CREATOR);
@@ -2519,13 +2427,8 @@
           _data.writeInt(mode);
           _data.writeInt(duration);
           boolean _status = mRemote.transact(Stub.TRANSACTION_setScanMode, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().setScanMode(mode, duration);
-            }
-            else {
-              throw new RuntimeException("Method setScanMode is unimplemented.");
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().setScanMode(mode, duration);
           }
           _reply.readException();
           _result = (0!=_reply.readInt());
@@ -2546,14 +2449,9 @@
           _data.writeInterfaceToken(DESCRIPTOR);
           _data.writeStrongBinder((((foo!=null))?(foo.asBinder()):(null)));
           boolean _status = mRemote.transact(Stub.TRANSACTION_registerBinder, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              getDefaultImpl().registerBinder(foo);
-              return;
-            }
-            else {
-              throw new RuntimeException("Method registerBinder is unimplemented.");
-            }
+          if (!_status && getDefaultImpl() != null) {
+            getDefaultImpl().registerBinder(foo);
+            return;
           }
           _reply.readException();
         }
@@ -2570,13 +2468,8 @@
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
           boolean _status = mRemote.transact(Stub.TRANSACTION_getRecursiveBinder, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().getRecursiveBinder();
-            }
-            else {
-              throw new RuntimeException("Method getRecursiveBinder is unimplemented.");
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().getRecursiveBinder();
           }
           _reply.readException();
           _result = android.test.IExampleInterface.Stub.asInterface(_reply.readStrongBinder());
@@ -2596,13 +2489,8 @@
           _data.writeInterfaceToken(DESCRIPTOR);
           _data.writeStrongBinder((((arg!=null))?(arg.asBinder()):(null)));
           boolean _status = mRemote.transact(Stub.TRANSACTION_takesAnInterface, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().takesAnInterface(arg);
-            }
-            else {
-              throw new RuntimeException("Method takesAnInterface is unimplemented.");
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().takesAnInterface(arg);
           }
           _reply.readException();
           _result = _reply.readInt();
@@ -2635,13 +2523,8 @@
             _data.writeInt(0);
           }
           boolean _status = mRemote.transact(Stub.TRANSACTION_takesAParcelable, _data, _reply, 0);
-          if (!_status) {
-            if (getDefaultImpl() != null) {
-              return getDefaultImpl().takesAParcelable(arg, arg2);
-            }
-            else {
-              throw new RuntimeException("Method takesAParcelable is unimplemented.");
-            }
+          if (!_status && getDefaultImpl() != null) {
+            return getDefaultImpl().takesAParcelable(arg, arg2);
           }
           _reply.readException();
           _result = _reply.readInt();
