diff --git a/frontend/TestSsiRequestProc.cpp b/frontend/TestSsiRequestProc.cpp
index 9c18b54a591f7cd110e80186dfe1e803a5d698a0..1a7b1f7baaae3043bb4339a71b49ccc33087e0df 100644
--- a/frontend/TestSsiRequestProc.cpp
+++ b/frontend/TestSsiRequestProc.cpp
@@ -14,17 +14,17 @@ void RequestProc<xrdssi::test::Request, xrdssi::test::Result, xrdssi::test::Meta
    // Output message in Json format (for debugging)
 
    std::cerr << "Received message:" << std::endl;
-   std::cerr << MessageToJsonString(request);
+   std::cerr << MessageToJsonString(m_request);
 
    // Set reply
 
-   response.set_result_code(0);
-   response.mutable_response()->set_message_text("This is the reply to " + *request.mutable_message_text());
+   m_response.set_result_code(0);
+   m_response.mutable_response()->set_message_text("This is the reply to " + *m_request.mutable_message_text());
 
    // Output message in Json format (for debugging)
 
    std::cerr << "Preparing response:" << std::endl;
-   std::cerr << MessageToJsonString(response);
+   std::cerr << MessageToJsonString(m_response);
 }
 
 
@@ -38,12 +38,12 @@ void RequestProc<xrdssi::test::Request, xrdssi::test::Result, xrdssi::test::Meta
 {
    // Set metadata
 
-   metadata.set_message_text("Have some metadata");
+   m_metadata.set_message_text("Have some metadata");
 
    // Output message in Json format (for debugging)
 
    std::cerr << "Preparing metadata..." << std::endl;
-   std::cerr << MessageToJsonString(metadata);
+   std::cerr << MessageToJsonString(m_metadata);
 }
 
 
diff --git a/frontend/TestSsiRequestProc.h b/frontend/TestSsiRequestProc.h
index efb81502486f905707f85dbfa19976ef6637122c..d2b6fc68ca496a9b1eb8972f985acb11bb7230c7 100644
--- a/frontend/TestSsiRequestProc.h
+++ b/frontend/TestSsiRequestProc.h
@@ -35,10 +35,10 @@ private:
    void ExecuteAlerts()   { std::cerr << "Called default ExecuteAlerts()" << std::endl; }
    void ExecuteMetadata() { std::cerr << "Called default ExecuteMetadata()" << std::endl; }
 
-   RequestType  request;
-   ResponseType response;
-   MetadataType metadata;
-   AlertType    alert;
+   RequestType  m_request;
+   ResponseType m_response;
+   MetadataType m_metadata;
+   AlertType    m_alert;
 };
 
 
@@ -61,7 +61,7 @@ void RequestProc<RequestType, ResponseType, MetadataType, AlertType>::Execute()
 
    // Deserialize the Request
 
-   if(!request.ParseFromString(request_str))
+   if(!m_request.ParseFromString(request_str))
    {
       throw XrdSsiException("request.ParseFromString() failed");
    }
@@ -86,7 +86,7 @@ void RequestProc<RequestType, ResponseType, MetadataType, AlertType>::Execute()
 
    std::string response_str;
 
-   if(!metadata.SerializeToString(&response_str))
+   if(!m_metadata.SerializeToString(&response_str))
    {
       throw XrdSsiException("metadata.SerializeToString() failed");
    }
@@ -103,7 +103,7 @@ void RequestProc<RequestType, ResponseType, MetadataType, AlertType>::Execute()
 
    // Serialize the Response
 
-   if(!response.SerializeToString(&response_str))
+   if(!m_response.SerializeToString(&response_str))
    {
       throw XrdSsiException("response.SerializeToString() failed");
    }
diff --git a/frontend/TestSsiServiceProvider.cpp b/frontend/TestSsiServiceProvider.cpp
index a6c30e3267af03938035adf319e060e78a0a061b..505641f5e08ae91325ba565efc400b6674efc7bb 100644
--- a/frontend/TestSsiServiceProvider.cpp
+++ b/frontend/TestSsiServiceProvider.cpp
@@ -30,9 +30,7 @@ bool TestSsiServiceProvider::Init(XrdSsiLogger *logP, XrdSsiCluster *clsP, const
 
    // do some initialisation
 
-   initOK = true;
-
-   return initOK;
+   return true;
 }
 
 
diff --git a/frontend/TestSsiServiceProvider.h b/frontend/TestSsiServiceProvider.h
index dba13f03cfeec8e98724e390fdecf68370b8ec26..dda33d90ceae57392336780aa131388353558a69 100644
--- a/frontend/TestSsiServiceProvider.h
+++ b/frontend/TestSsiServiceProvider.h
@@ -34,12 +34,8 @@ public:
 
    // Constructor and destructor
 
-            TestSsiServiceProvider() : initOK(false) {}
+            TestSsiServiceProvider() {}
    virtual ~TestSsiServiceProvider() {}
-
-private:
-
-   bool initOK;
 };
 
 #endif
diff --git a/frontend/XrdSsiException.h b/frontend/XrdSsiException.h
index 0dd36f15d58e8afc23c93dcac24bbe0c22b93b38..307433e7131b61307212285e67d2d360d9e77291 100644
--- a/frontend/XrdSsiException.h
+++ b/frontend/XrdSsiException.h
@@ -12,13 +12,13 @@
 class XrdSsiException : public std::exception
 {
 public:
-   XrdSsiException(const std::string &err_msg) : error_msg(err_msg)     {}
-   XrdSsiException(const XrdSsiErrInfo &eInfo) : error_msg(eInfo.Get()) {}
+   XrdSsiException(const std::string &err_msg) : m_err_msg(err_msg)     {}
+   XrdSsiException(const XrdSsiErrInfo &eInfo) : m_err_msg(eInfo.Get()) {}
 
-   const char* what() const noexcept { return error_msg.c_str(); }
+   const char* what() const noexcept { return m_err_msg.c_str(); }
 
 private:
-   std::string error_msg;
+   std::string m_err_msg;
 };
 
 #endif
diff --git a/frontend/XrdSsiPbRequest.h b/frontend/XrdSsiPbRequest.h
index 8f9bb766561f2ab077b47153370a049719af798e..7fffc735b4a7fd6ce636c56c98ad59a626cb8b7c 100644
--- a/frontend/XrdSsiPbRequest.h
+++ b/frontend/XrdSsiPbRequest.h
@@ -23,14 +23,28 @@ template <typename RequestType, typename ResponseType, typename MetadataType, ty
 class XrdSsiPbRequest : public XrdSsiRequest
 {
 public:
-           XrdSsiPbRequest(const std::string &buffer_str, uint16_t timeout=0) : request_buffer(buffer_str.c_str()), request_len(buffer_str.size())
+           XrdSsiPbRequest(const std::string &buffer_str, unsigned int response_bufsize, uint16_t timeout) :
+              m_request_bufptr(buffer_str.c_str()),
+              m_request_len(buffer_str.size()),
+              m_response_bufsize(response_bufsize)
            {
-              std::cerr << "Creating TestSsiRequest object, setting timeout=" << timeout << std::endl;
+              std::cerr << "Creating XrdSsiPbRequest object:" << std::endl;
+              std::cerr << "  Response buffer size = " << m_response_bufsize << std::endl;
+              std::cerr << "  Response timeout = " << timeout << std::endl;
+
+              // Allocate response buffer
+
+              m_response_bufptr = new char[m_response_bufsize];
+
+              // Set response timeout
+
               SetTimeOut(timeout);
            }
    virtual ~XrdSsiPbRequest() 
            {
-              std::cerr << "Deleting TestSsiRequest object" << std::endl;
+              std::cerr << "Deleting XrdSsiPbRequest object" << std::endl;
+
+              delete[] m_response_bufptr;
            }
 
    // It is up to the implementation to create request data, save it in some manner, and provide it to
@@ -41,7 +55,7 @@ public:
 
    // Query for Andy: shouldn't the return type for GetRequest be const?
 
-   virtual char *GetRequest(int &reqlen) override { reqlen = request_len; return const_cast<char*>(request_buffer); }
+   virtual char *GetRequest(int &reqlen) override { reqlen = m_request_len; return const_cast<char*>(m_request_bufptr); }
 
    // Requests are sent to the server asynchronously via the service object. The ProcessResponse() callback
    // is used to inform the request object if the request completed or failed.
@@ -60,12 +74,20 @@ public:
    virtual void Alert(XrdSsiRespInfoMsg &aMsg) override;
 
 private:
-   const char *request_buffer;
-   int         request_len;
+   // Pointer to the Request buffer
+
+   const char *m_request_bufptr;
+   int         m_request_len;
+
+   // Pointer to the Response buffer
+
+   char       *m_response_bufptr;
+   int         m_response_bufsize;
+   int         m_response_len;
 
-   // Callbacks for each of the XRootD response types
+   // Callbacks for each of the XRootD reply types
 
-   XrdSsiPbRequestCallback<RequestType>  RequestCallback;
+   XrdSsiPbRequestCallback<ResponseType> ResponseCallback;
    XrdSsiPbRequestCallback<MetadataType> MetadataCallback;
    XrdSsiPbRequestCallback<AlertType>    AlertCallback;
 
diff --git a/frontend/XrdSsiPbServiceClientSide.h b/frontend/XrdSsiPbServiceClientSide.h
index 301a580f97bd52e6def161afeafaff8f73ddcc6e..d0872802cda56bf563cda76c9bcde145d41ce723 100644
--- a/frontend/XrdSsiPbServiceClientSide.h
+++ b/frontend/XrdSsiPbServiceClientSide.h
@@ -10,8 +10,9 @@
 
 // Constants
 
-const unsigned int default_server_timeout   = 15;    // Maximum XRootD reply timeout in seconds
-const unsigned int default_shutdown_timeout = 30;    // Maximum time to wait for the Service to shut down
+const unsigned int DefaultResponseBufferSize = 2097152;    // Default size for the response buffer in bytes = 2 Mb
+const unsigned int DefaultServerTimeout      = 15;         // Maximum XRootD reply timeout in secs
+const unsigned int DefaultShutdownTimeout    = 30;         // Maximum time to wait for the Service to shut down in secs
 
 
 
@@ -32,13 +33,17 @@ public:
    XrdSsiPbServiceClientSide() = delete;
 
    XrdSsiPbServiceClientSide(const std::string &hostname, unsigned int port, const std::string &resource,
-                           unsigned int server_timeout = default_server_timeout,
-                           unsigned int shutdown_timeout = default_shutdown_timeout) :
-      resource(resource), server_tmo(server_timeout), shutdown_tmo(shutdown_timeout)
+                           unsigned int response_bufsize = DefaultResponseBufferSize,
+                           unsigned int server_tmo       = DefaultServerTimeout,
+                           unsigned int shutdown_tmo     = DefaultShutdownTimeout) :
+      m_resource(resource),
+      m_response_bufsize(response_bufsize),
+      m_server_tmo(server_tmo),
+      m_shutdown_tmo(shutdown_tmo)
    {
       XrdSsiErrInfo eInfo;
 
-      if(!(serverP = XrdSsiProviderClient->GetService(eInfo, hostname + ":" + std::to_string(port))))
+      if(!(m_server_ptr = XrdSsiProviderClient->GetService(eInfo, hostname + ":" + std::to_string(port))))
       {
          throw XrdSsiException(eInfo);
       }
@@ -53,12 +58,13 @@ public:
    void send(const RequestType &request);
 
 private:
-   XrdSsiResource resource;          // Requests are bound to this resource
+   XrdSsiResource m_resource;            // Requests are bound to this resource
 
-   XrdSsiService *serverP;           // Pointer to XRootD Server object
+   XrdSsiService *m_server_ptr;          // Pointer to XRootD Server object
 
-   unsigned int server_tmo;          // Timeout for a response from the server
-   unsigned int shutdown_tmo;        // Timeout to shut down the server in the destructor
+   unsigned int   m_response_bufsize;    // Buffer size for responses from the XRootD SSI server
+   unsigned int   m_server_tmo;          // Timeout for a response from the server
+   unsigned int   m_shutdown_tmo;        // Timeout to shut down the server in the destructor
 };
 
 
@@ -73,13 +79,13 @@ XrdSsiPbServiceClientSide<RequestType, ResponseType, MetadataType, AlertType>::~
    // The XrdSsiService object cannot be explicitly deleted. The Stop() method deletes the object if
    // it is safe to do so.
 
-   while(!serverP->Stop() && shutdown_tmo--)
+   while(!m_server_ptr->Stop() && m_shutdown_tmo--)
    {
       sleep(1);
       std::cerr << ".";
    }
 
-   if(shutdown_tmo > 0)
+   if(m_shutdown_tmo > 0)
    {
       std::cerr << "done." << std::endl;
    }
@@ -119,12 +125,13 @@ void XrdSsiPbServiceClientSide<RequestType, ResponseType, MetadataType, AlertTyp
 
    // Requests are always executed in the context of a service. They need to correspond to what the service allows.
 
-   XrdSsiRequest *requestP = new XrdSsiPbRequest<RequestType, ResponseType, MetadataType, AlertType> (request_str, server_tmo);
+   XrdSsiRequest *request_ptr =
+      new XrdSsiPbRequest<RequestType, ResponseType, MetadataType, AlertType>(request_str, m_response_bufsize, m_server_tmo);
 
    // Transfer ownership of the request to the service object
    // TestSsiRequest handles deletion of the request buffer, so we can allow the pointer to go out-of-scope
 
-   serverP->ProcessRequest(*requestP, resource);
+   m_server_ptr->ProcessRequest(*request_ptr, m_resource);
 
    // Note: it is safe to delete the XrdSsiResource object after ProcessRequest() returns. I don't delete it because
    // I am assuming I can reuse it, but I need to check if that is a safe assumption. Perhaps I need to create a new