diff --git a/warden_server/warden_server.py b/warden_server/warden_server.py
index e64431781dbefe9ae7e024dfb51943aaf976b7f2..e52e06b2e25635103b1d2a49cf2c0a52acfdf4df 100755
--- a/warden_server/warden_server.py
+++ b/warden_server/warden_server.py
@@ -47,6 +47,12 @@ from jsonschema import Draft4Validator
 VERSION = "3.0-beta3"
 
 
+class Encoder(json.JSONEncoder):
+    def default(self, o):
+        if isinstance(o, Error):
+            return o.to_dict()
+        return str(o)
+
 class Error(Exception):
 
     def __init__(self, method=None, req_id=None, errors=None, **kwargs):
@@ -108,7 +114,7 @@ class Error(Exception):
         ecopy.pop("message", None)
         ecopy.pop("exc", None)
         if ecopy:
-            out = "Detail: %s" % (json.dumps(ecopy, default=lambda v: str(v)))
+            out = "Detail: %s" % (json.dumps(ecopy, cls=Encoder))
         else:
             out = ""
         return out
@@ -1527,7 +1533,7 @@ class Server(ObjectBase):
 
         if exception:
             status = "%d %s" % exception.get_http_err_msg()
-            output = json.dumps(exception.to_dict(), default=lambda v: str(v))
+            output = json.dumps(exception, cls=Encoder)
             exception.log(self.log)
 
         # Make sure everything is properly encoded - JSON and various function
@@ -1567,9 +1573,7 @@ def json_wrapper(method):
         result = method(self, **args)   # call requested method
 
         try:
-            # 'default': takes care of non JSON serializable objects,
-            # which could (although shouldn't) appear in handler code
-            output = json.dumps(result, default=lambda v: str(v))
+            output = json.dumps(result, cls=Encoder)
         except Exception as e:
             raise self.req.error(message="Serialization error", error=500, exc=sys.exc_info(), args=str(result))