[OLINGO-1574] ....
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/TransactionalPersistenceManagerImpl.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/TransactionalPersistenceManagerImpl.java
index e24796e..5b29506 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/TransactionalPersistenceManagerImpl.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/TransactionalPersistenceManagerImpl.java
@@ -78,7 +78,7 @@
     // This should be 202 for service version <= 3.0 and 200 for service version >= 4.0 but it seems that
     // many service implementations are not fully compliant in this respect.
     if (response.getStatusCode() != 202 && response.getStatusCode() != 200) {
-      throw new ODataServerErrorException(new ResponseStatusLine(response));
+      throw new ODataServerErrorException(new ResponseStatusLine(response), response.getRawResponse());
     }
 
     if (!items.isEmpty()) {
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/ODataClientErrorException.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/ODataClientErrorException.java
index 290f59f..ada04b3 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/ODataClientErrorException.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/ODataClientErrorException.java
@@ -23,6 +23,8 @@
 import org.apache.olingo.commons.api.ex.ODataError;
 import org.apache.olingo.commons.api.ex.ODataRuntimeException;
 
+import java.io.InputStream;
+
 /**
  * Represents a client error in OData.
  *
@@ -35,7 +37,9 @@
   private final StatusLine statusLine;
 
   private final ODataError error;
-  
+
+  private final InputStream rawResponse;
+
   private Header[] headerInfo;
 
   /**
@@ -44,10 +48,27 @@
    * @param statusLine request status info.
    */
   public ODataClientErrorException(final StatusLine statusLine) {
-    super(statusLine.toString());
+    this(statusLine, null, null);
+  }
 
-    this.statusLine = statusLine;
-    this.error = null;
+  /**
+   * Constructor
+   *
+   * @param statusLine request status info.
+   * @param rawResponse raw response of the request.
+   */
+  public ODataClientErrorException(final StatusLine statusLine, final InputStream rawResponse) {
+    this(statusLine, null, rawResponse);
+  }
+
+  /**
+   * Constructor
+   *
+   * @param statusLine request status info.
+   * @param error OData error to be wrapped.
+   */
+  public ODataClientErrorException(final StatusLine statusLine, final ODataError error) {
+    this(statusLine, error, null);
   }
 
   /**
@@ -55,8 +76,9 @@
    *
    * @param statusLine request status info.
    * @param error OData error to be wrapped.
+   * @param rawResponse raw response of the request.
    */
-  public ODataClientErrorException(final StatusLine statusLine, final ODataError error) {
+  public ODataClientErrorException(final StatusLine statusLine, final ODataError error, final InputStream rawResponse) {
     super(error == null ?
         statusLine.toString() :
         (error.getCode() == null || error.getCode().isEmpty() ? "" : "(" + error.getCode() + ") ")
@@ -64,6 +86,7 @@
 
     this.statusLine = statusLine;
     this.error = error;
+    this.rawResponse = rawResponse;
   }
 
   /**
@@ -99,4 +122,13 @@
   public Header[] getHeaderInfo() {
     return headerInfo;
   }
+
+  /**
+   * Return raw response from the request (can be null).
+   *
+   * @return raw response from the request (can be null).
+   */
+  public InputStream getRawResponse() {
+    return rawResponse;
+  }
 }
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/ODataServerErrorException.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/ODataServerErrorException.java
index 932e3cb..9141784 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/ODataServerErrorException.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/ODataServerErrorException.java
@@ -21,6 +21,8 @@
 import org.apache.http.StatusLine;
 import org.apache.olingo.commons.api.ex.ODataRuntimeException;
 
+import java.io.InputStream;
+
 /**
  * Represents a server error in OData.
  */
@@ -28,12 +30,34 @@
 
   private static final long serialVersionUID = -6423014532618680135L;
 
+  private InputStream rawResponse;
+
   /**
    * Constructor.
    *
    * @param statusLine request status info.
    */
   public ODataServerErrorException(final StatusLine statusLine) {
+    this(statusLine, null);
+  }
+
+  /**
+   * Constructor.
+   *
+   * @param statusLine request status info.
+   * @param rawResponse raw response of the request.
+   */
+  public ODataServerErrorException(final StatusLine statusLine, final InputStream rawResponse) {
     super(statusLine.toString());
+    this.rawResponse = rawResponse;
+  }
+
+  /**
+   * Return raw response from the request (can be null).
+   *
+   * @return raw response from the request (can be null).
+   */
+  public InputStream getRawResponse() {
+    return rawResponse;
   }
 }
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/header/ODataErrorResponseChecker.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/header/ODataErrorResponseChecker.java
index 1f8413b..0c05af4 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/header/ODataErrorResponseChecker.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/header/ODataErrorResponseChecker.java
@@ -18,6 +18,7 @@
  */
 package org.apache.olingo.client.core.communication.header;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Map;
@@ -31,7 +32,6 @@
 import org.apache.olingo.commons.api.ex.ODataError;
 import org.apache.olingo.commons.api.ex.ODataRuntimeException;
 import org.apache.olingo.commons.api.format.ContentType;
-import org.apache.olingo.client.api.serialization.ODataDeserializerException;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,7 +51,8 @@
       final ODataClient odataClient, final StatusLine statusLine, final InputStream entity,
       final String accept) {
 
-    ODataRuntimeException result = null;
+    ODataRuntimeException result;
+    InputStream entityForException = null;
 
     if (entity == null) {
       result = new ODataClientErrorException(statusLine);
@@ -61,7 +62,9 @@
       ODataError error = new ODataError();
       if (!accept.contains("text/plain")) {
         try {
-          error = odataClient.getReader().readError(entity, contentType);
+          byte[] bytes = IOUtils.toByteArray(entity);
+          entityForException = new ByteArrayInputStream(bytes);
+          error = odataClient.getReader().readError(new ByteArrayInputStream(bytes), contentType);
           if (error != null) {
             Map<String, String> innerError = error.getInnerError();
             if (innerError != null) {
@@ -72,7 +75,7 @@
               }
             }
           }
-        } catch (final RuntimeException | ODataDeserializerException e) {
+        } catch (final RuntimeException | ODataDeserializerException | IOException e) {
           LOG.warn("Error deserializing error response", e);
           error = getGenericError(
               statusLine.getStatusCode(),
@@ -94,9 +97,9 @@
       if (statusLine.getStatusCode() >= 500 && error!= null && 
           (error.getDetails() == null || error.getDetails().isEmpty()) && 
           (error.getInnerError() == null || error.getInnerError().size() == 0)) {
-        result = new ODataServerErrorException(statusLine);
+        result = new ODataServerErrorException(statusLine, entityForException);
       } else {
-        result = new ODataClientErrorException(statusLine, error);
+        result = new ODataClientErrorException(statusLine, error, entityForException);
       }
     }