diff --git a/base/include/hidl/HidlInternal.h b/base/include/hidl/HidlInternal.h
index 5739137..1d6c035 100644
--- a/base/include/hidl/HidlInternal.h
+++ b/base/include/hidl/HidlInternal.h
@@ -85,6 +85,7 @@
     const T &operator[](size_t index) const {
         return mPointer[index];
     }
+
 private:
     union {
         T* mPointer;
diff --git a/base/include/hidl/HidlSupport.h b/base/include/hidl/HidlSupport.h
index 7477352..a8f0f55 100644
--- a/base/include/hidl/HidlSupport.h
+++ b/base/include/hidl/HidlSupport.h
@@ -28,6 +28,7 @@
 #include <hidl/HidlInternal.h>
 #include <hidl/Status.h>
 #include <map>
+#include <sstream>
 #include <stddef.h>
 #include <tuple>
 #include <type_traits>
@@ -601,7 +602,7 @@
             : mBase(base) {
         }
 
-        const_accessor<T, SIZES...> operator[](size_t index) {
+        const_accessor<T, SIZES...> operator[](size_t index) const {
             return const_accessor<T, SIZES...>(
                     &mBase[index * product<SIZES...>::value]);
         }
@@ -884,6 +885,120 @@
     std::string mInstrumentationLibPrefix;
 };
 
+///////////////////// toString functions
+
+namespace details {
+
+// toString alias for numeric types
+template<typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type>
+inline std::string toString(T t) {
+    return std::to_string(t);
+}
+
+template<typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type>
+inline std::string toHexString(T t, bool prefix = true) {
+    std::ostringstream os;
+    if (prefix) { os << std::showbase; }
+    os << std::hex << t;
+    return os.str();
+}
+
+template<>
+inline std::string toHexString(uint8_t t, bool prefix) {
+    return toHexString(static_cast<int32_t>(t), prefix);
+}
+
+template<>
+inline std::string toHexString(int8_t t, bool prefix) {
+    return toHexString(static_cast<int32_t>(t), prefix);
+}
+
+inline std::string toString(const void *t, bool prefix = true) {
+    return toHexString(reinterpret_cast<uintptr_t>(t), prefix);
+}
+
+// debug string dump. There will be quotes around the string!
+inline std::string toString(const hidl_string &hs) {
+    return std::string{"\""} + hs.c_str() + "\"";
+}
+
+// debug string dump
+inline std::string toString(const hidl_handle &hs) {
+    return toString(hs.getNativeHandle());
+}
+
+inline std::string toString(const hidl_memory &mem) {
+    return std::string{"memory {.name = "} + toString(mem.name()) + ", .size = "
+              + toString(mem.size())
+              + ", .handle = " + toString(mem.handle()) + "}";
+}
+
+inline std::string toString(const sp<hidl_death_recipient> &dr) {
+    return std::string{"death_recipient@"} + toString(dr.get());
+}
+
+template<typename Array>
+std::string arrayToString(const Array &a, size_t size);
+
+// debug string dump, assuming that toString(T) is defined.
+template<typename T>
+std::string toString(const hidl_vec<T> &a) {
+    std::string os;
+    os += "[" + toString(a.size()) + "]";
+    os += arrayToString(a, a.size());
+    return os;
+}
+
+template<size_t SIZE1>
+std::string arraySizeToString() {
+    return std::string{"["} + toString(SIZE1) + "]";
+}
+
+template<typename T, size_t SIZE1>
+std::string toString(const_accessor<T, SIZE1> a) {
+    return arrayToString(a, SIZE1);
+}
+
+template<typename T, size_t SIZE1>
+std::string toString(const hidl_array<T, SIZE1> &a) {
+    return arraySizeToString<SIZE1>()
+            + toString(const_accessor<T, SIZE1>(a.data()));
+}
+
+template<size_t SIZE1, size_t SIZE2, size_t... SIZES>
+std::string arraySizeToString() {
+    return std::string{"["} + toString(SIZE1) + "]" + arraySizeToString<SIZE2, SIZES...>();
+}
+
+
+template<typename T, size_t SIZE1, size_t SIZE2, size_t... SIZES>
+std::string toString(const_accessor<T, SIZE1, SIZE2, SIZES...> a) {
+    return arrayToString(a, SIZE1);
+}
+
+template<typename T, size_t SIZE1, size_t SIZE2, size_t... SIZES>
+std::string toString(const hidl_array<T, SIZE1, SIZE2, SIZES...> &a) {
+    return arraySizeToString<SIZE1, SIZE2, SIZES...>()
+            + toString(const_accessor<T, SIZE1, SIZE2, SIZES...>(a.data()));
+}
+
+template<typename Array>
+std::string arrayToString(const Array &a, size_t size) {
+    std::string os;
+    os += "{";
+    for (size_t i = 0; i < size; ++i) {
+        if (i > 0) {
+            os += ", ";
+        }
+        os += toString(a[i]);
+    }
+    os += "}";
+    return os;
+}
+
+}  // namespace details
+
+
 }  // namespace hardware
 }  // namespace android
 
diff --git a/base/include/hidl/MQDescriptor.h b/base/include/hidl/MQDescriptor.h
index 8cdbd4c..ec063f4 100644
--- a/base/include/hidl/MQDescriptor.h
+++ b/base/include/hidl/MQDescriptor.h
@@ -259,6 +259,26 @@
    */
   return NativeHandle::create(mHandle, false /* ownsHandle */);
 }
+
+namespace details {
+template<typename T, MQFlavor flavor>
+std::string toString(const MQDescriptor<T, flavor> &q) {
+    std::string os;
+    if (flavor & kSynchronizedReadWrite) {
+        os += "fmq_sync";
+    }
+    if (flavor & kUnsynchronizedWrite) {
+        os += "fmq_unsync";
+    }
+    os += " {"
+       + toString(q.getGrantors().size()) + " grantor(s), "
+       + "size = " + toString(q.getSize())
+       + ", .handle = " + toString(q.getNativeHandle().get())
+       + ", .quantum = " + toString(q.getQuantum()) + "}";
+    return os;
+}
+}  // namespace details
+
 }  // namespace hardware
 }  // namespace android
 
