diff --git a/base/Status.cpp b/base/Status.cpp
index e7320a8..449aff3 100644
--- a/base/Status.cpp
+++ b/base/Status.cpp
@@ -13,15 +13,71 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 #define LOG_TAG "HidlStatus"
+#include <android-base/logging.h>
 
 #include <hidl/Status.h>
 
-#include <android-base/logging.h>
+#include <unordered_map>
 
 namespace android {
 namespace hardware {
 
+static std::string statusToString(status_t s) {
+    const std::unordered_map<status_t, std::string> statusStrings{{
+        #define STATUS_TO_STRING_PAIR(STATUS) {STATUS, #STATUS}
+        STATUS_TO_STRING_PAIR(OK),
+        STATUS_TO_STRING_PAIR(UNKNOWN_ERROR),
+        STATUS_TO_STRING_PAIR(NO_MEMORY),
+        STATUS_TO_STRING_PAIR(INVALID_OPERATION),
+        STATUS_TO_STRING_PAIR(BAD_VALUE),
+        STATUS_TO_STRING_PAIR(BAD_TYPE),
+        STATUS_TO_STRING_PAIR(NAME_NOT_FOUND),
+        STATUS_TO_STRING_PAIR(PERMISSION_DENIED),
+        STATUS_TO_STRING_PAIR(NO_INIT),
+        STATUS_TO_STRING_PAIR(ALREADY_EXISTS),
+        STATUS_TO_STRING_PAIR(DEAD_OBJECT),
+        STATUS_TO_STRING_PAIR(FAILED_TRANSACTION),
+        STATUS_TO_STRING_PAIR(BAD_INDEX),
+        STATUS_TO_STRING_PAIR(NOT_ENOUGH_DATA),
+        STATUS_TO_STRING_PAIR(WOULD_BLOCK),
+        STATUS_TO_STRING_PAIR(TIMED_OUT),
+        STATUS_TO_STRING_PAIR(UNKNOWN_TRANSACTION),
+        STATUS_TO_STRING_PAIR(FDS_NOT_ALLOWED),
+        STATUS_TO_STRING_PAIR(UNEXPECTED_NULL)
+    }};
+    auto it = statusStrings.find(s);
+    if (it != statusStrings.end()) {
+        return it->second;
+    }
+    std::string str = std::to_string(s);
+    char *err = strerror(-s);
+    if (err != NULL) {
+        str.append(1, ' ').append(err);
+    }
+    return str;
+}
+
+static std::string exceptionToString(int32_t ex) {
+    const std::unordered_map<int32_t, std::string> exceptionStrings{{
+        #define EXCEPTION_TO_STRING_PAIR(EXCEPTION) {Status::Exception::EXCEPTION, #EXCEPTION}
+        EXCEPTION_TO_STRING_PAIR(EX_NONE),
+        EXCEPTION_TO_STRING_PAIR(EX_SECURITY),
+        EXCEPTION_TO_STRING_PAIR(EX_BAD_PARCELABLE),
+        EXCEPTION_TO_STRING_PAIR(EX_ILLEGAL_ARGUMENT),
+        EXCEPTION_TO_STRING_PAIR(EX_NULL_POINTER),
+        EXCEPTION_TO_STRING_PAIR(EX_ILLEGAL_STATE),
+        EXCEPTION_TO_STRING_PAIR(EX_NETWORK_MAIN_THREAD),
+        EXCEPTION_TO_STRING_PAIR(EX_UNSUPPORTED_OPERATION),
+        EXCEPTION_TO_STRING_PAIR(EX_SERVICE_SPECIFIC),
+        EXCEPTION_TO_STRING_PAIR(EX_HAS_REPLY_HEADER),
+        EXCEPTION_TO_STRING_PAIR(EX_TRANSACTION_FAILED)
+    }};
+    auto it = exceptionStrings.find(ex);
+    return it == exceptionStrings.end() ? std::to_string(ex) : it->second;
+}
+
 Status Status::ok() {
     return Status();
 }
@@ -86,11 +142,11 @@
     if (s.exceptionCode() == Status::EX_NONE) {
         stream << "No error";
     } else {
-        stream << "Status(" << s.exceptionCode() << "): '";
+        stream << "Status(" << exceptionToString(s.exceptionCode()) << "): '";
         if (s.exceptionCode() == Status::EX_SERVICE_SPECIFIC) {
             stream << s.serviceSpecificErrorCode() << ": ";
         } else if (s.exceptionCode() == Status::EX_TRANSACTION_FAILED) {
-            stream << s.transactionError() << ": ";
+            stream << statusToString(s.transactionError()) << ": ";
         }
         stream << s.exceptionMessage() << "'";
     }
