diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4b379fe71e2aeba0a01d845a5917e605e553d235..edfe613cbf68b7b9ddb3e7f24c6b8a0cebed9c10 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
 * bugfix: a race condition during connection setup itself
 * moved __version__ to coolamqp root
 * split `compile_definitions` into a separate package
+* exceptions will display their reply_text correctly if fed a memoryview
 
 # v0.100:
 
diff --git a/coolamqp/exceptions.py b/coolamqp/exceptions.py
index f55e68d732cc6ea6df9cbd841a80c93e57e73b46..34f5404c5dd1229363953b7ec4ea2d0e2b8e10bb 100644
--- a/coolamqp/exceptions.py
+++ b/coolamqp/exceptions.py
@@ -27,11 +27,22 @@ class AMQPError(CoolAMQPError):
         return self.reply_code in HARD_ERRORS
 
     def __str__(self):  # type: () -> str
-        return 'AMQP error %s: %s' % (self.reply_code, self.reply_text)
+        return 'AMQP error %s: %s' % (self.reply_code, self.__get_reply_text())
+
+    def __get_reply_text(self):  # type: () -> str
+        if isinstance(self.reply_text, memoryview):
+            reply_text = self.reply_text.tobytes().decode('utf8')
+        else:
+            reply_text = self.reply_text
+
+        if isinstance(self.reply_text, bytes):
+            reply_text = self.reply_text.decode('utf8')
+
+        return reply_text
 
     def __repr__(self):  # type: () -> str
         return 'AMQPError(' + repr(self.reply_code) + ', ' + repr(
-            self.reply_text) + \
+            self.__get_reply_text()) + \
                ', ' + repr(self.class_id) + ', ' + repr(self.method_id) + ')'
 
     def __init__(self, *args):