This is definitely an improvement, but I wonder if it might be better yet if RemoteException didn't include the exception name in its message. It might include it in toString(), as is standard, but not in getMessage(). RemoteException has a field named "className" that already stores the remote exception name. It also redundantly includes the exception name in the exceptions message, since that's created from the value of Throwable#printStackTrace(). Rather RemoteException might parseout just the message (the first line, after the class name) and use that as its message and separately store the remote stack trace in a field, like the class name. Then, even if the exception is not unwrapped, its message and toString() would still match that of the original exception.