diff --git a/src/mmeGrpcClient/mmeGrpcClient.cpp b/src/mmeGrpcClient/mmeGrpcClient.cpp
new file mode 100644
index 0000000..37d7814
--- /dev/null
+++ b/src/mmeGrpcClient/mmeGrpcClient.cpp
@@ -0,0 +1,291 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <iostream>
+#include <memory>
+#include <string>
+#include <sstream>
+#include <time.h>
+#include <grpcpp/grpcpp.h>
+#include <google/protobuf/text_format.h>
+#include <../mmeGrpcProtos/mmeGrpc.grpc.pb.h>
+
+using grpc::Channel;
+using grpc::ClientContext;
+using grpc::ClientReader;
+using grpc::ClientReaderWriter;
+using grpc::ClientWriter;
+using grpc::Status;
+using mmeGrpc::UeContextReqBuf;
+using mmeGrpc::UeContextRespBuf;
+using mmeGrpc::UeContextRespBuf_SessionContextRespBuf;
+using mmeGrpc::MmeGrpcCli;
+using mmeGrpc::Empty;
+using mmeGrpc::ProcedureStatsRespBuf;
+using mmeGrpc::EventInfoRespBuf;
+using mmeGrpc::EventInfoRespBuf_EventInfoBuf;
+
+using namespace std;
+
+class MmeGrpcCliClient {
+ public:
+  MmeGrpcCliClient(std::shared_ptr<Channel> channel)
+      : stub_(MmeGrpcCli::NewStub(channel)) {}
+
+  // Assembles the client's payload, sends it and presents the response back
+  // from the server.
+  void GetUeContext(const int32_t id) {
+    // Data we are sending to the server.
+    UeContextReqBuf request;
+    request.set_id(id);
+
+    // Container for the data we expect from the server.
+    UeContextRespBuf reply;
+
+    // Context for the client. It could be used to convey extra information to
+    // the server and/or tweak certain RPC behaviors.
+    ClientContext context;
+
+    // The actual RPC.
+    Status status = stub_->GetUeContext(&context, request, &reply);
+
+    // Act upon its status.
+    if (status.ok()) {
+
+	    /*std::string textString;
+	    google::protobuf::TextFormat::PrintToString(reply, &textString);
+	    std::cout << textString << std::endl;
+		*/
+	    cout << "-----mobile context----- " << id << endl; 
+	    cout << "IMSI               " << reply.imsi() << endl;
+	    cout << "MSISDN             " << reply.msisdn() << endl;
+	    cout << "TAI                " << reply.tai() << endl;
+	    cout << "EUTRAN CGI         " << reply.eutran_cgi() << endl;
+	    cout << "Context ID         " << reply.context_id() << endl;
+	    cout << "Enb UE s1ap Teid   " << reply.enb_ue_s1ap_id() << endl;
+	    cout << "UE State           " << reply.ue_state() << endl;
+	    
+	    int sessioncontext_size=reply.sessioncontext_size();	    
+	    for(int i=0;i<sessioncontext_size;i++)
+	    {
+	    	const UeContextRespBuf_SessionContextRespBuf& sessioncontext = reply.sessioncontext(i);
+
+		cout << "-----session context------ " << i+1 << endl;
+		cout << "	apn                     " << sessioncontext.apn() << endl;
+		cout << " 	PDN address             " << sessioncontext.pdn_address() << endl;
+		cout << " 	Bearer ID               " << sessioncontext.bearer_id() << endl;
+		cout << "	s11 sgw gtpc teid       " << sessioncontext.s11_sgw_gtpc_teid() << endl;
+		cout << "	s5 pgw gtpc teid        " << sessioncontext.s5_pgw_gtpc_teid() << endl;
+		cout << "	s1u enb teid            " << sessioncontext.s1u_enb_teid() << endl;
+		cout << "	s1u sgw teid            " << sessioncontext.s1u_sgw_teid() << endl;
+		cout << "	s5u pgw teid            " << sessioncontext.s5u_pgw_teid() << endl;
+	    }
+
+    } else {
+      std::cout << status.error_code() << ": " << status.error_message()
+                << std::endl;
+    }
+  }
+
+  void ShowAllMobileContexts() {
+     UeContextRespBuf reply;
+
+     Empty request;
+     ClientContext context;
+
+     std::unique_ptr<ClientReader<UeContextRespBuf> > reader(
+                stub_->ShowAllMobileContexts(&context, request));
+
+     while (reader->Read(&reply))
+     {
+            cout << "-----mobile context----- " << endl;
+            cout << "IMSI               " << reply.imsi() << endl;
+            cout << "MSISDN             " << reply.msisdn() << endl;
+            cout << "TAI                " << reply.tai() << endl;
+            cout << "EUTRAN CGI         " << reply.eutran_cgi() << endl;
+            cout << "Context ID         " << reply.context_id() << endl;
+            cout << "Enb UE s1ap Teid   " << reply.enb_ue_s1ap_id() << endl;
+            cout << "UE State           " << reply.ue_state() << endl;
+
+            int sessioncontext_size=reply.sessioncontext_size();
+            for(int i=0;i<sessioncontext_size;i++)
+            {
+                const UeContextRespBuf_SessionContextRespBuf& sessioncontext = reply.sessioncontext(i);
+
+                cout << "-----session context------ " << i+1 << endl;
+                cout << "       apn                     " << sessioncontext.apn() << endl;
+                cout << "       PDN address             " << sessioncontext.pdn_address() << endl;
+                cout << "       Bearer ID               " << sessioncontext.bearer_id() << endl;
+                cout << "       s11 sgw gtpc teid       " << sessioncontext.s11_sgw_gtpc_teid() << endl;
+                cout << "       s5 pgw gtpc teid        " << sessioncontext.s5_pgw_gtpc_teid() << endl;
+                cout << "       s1u enb teid            " << sessioncontext.s1u_enb_teid() << endl;
+                cout << "       s1u sgw teid            " << sessioncontext.s1u_sgw_teid() << endl;
+                cout << "       s5u pgw teid            " << sessioncontext.s5u_pgw_teid() << endl;
+            }
+
+     }
+     Status status = reader->Finish();
+     if (status.ok()) {
+              std::cout << "show all mobile-contexts rpc succeeded." << std::endl;
+     } else {
+              std::cout << "show all mobile-contexts rpc failed." << std::endl;
+     }
+  }
+
+
+  void GetProcStats(){
+    // Container for the data we expect from the server.
+    ProcedureStatsRespBuf reply;
+
+    Empty request;
+
+    // Context for the client. It could be used to convey extra information to
+    // the server and/or tweak certain RPC behaviors.
+    ClientContext context;
+    // The actual RPC.
+    Status status = stub_->GetProcStats(&context, request, &reply);
+
+    // Act upon its status.
+    if (status.ok()) {
+            cout << endl << "-----procedure stats-----" << endl;
+	        cout << "num_of_subs_attached                    " << reply.num_of_subscribers_attached() << endl;
+            cout << "num_of_air_sent                         " << reply.num_of_air_sent() << endl;
+			cout << "num_of_ulr_sent                         " << reply.num_of_ulr_sent() << endl;
+            cout << "num_of_processed_aia                    " << reply.num_of_processed_aia() << endl;
+            cout << "num_of_processed_ula                    " << reply.num_of_processed_ula() << endl;
+            cout << "num_of_auth_req_to_ue_sent              " << reply.num_of_auth_req_to_ue_sent() << endl;
+            cout << "num_of_processed_auth_response          " << reply.num_of_processed_auth_response() << endl;
+            cout << "num_of_sec_mode_cmd_to_ue_sent          " << reply.num_of_sec_mode_cmd_to_ue_sent() << endl;
+            cout << "num_of_processed_sec_mode_resp          " << reply.num_of_processed_sec_mode_resp() << endl;
+            cout << "num_of_esm_info_req_to_ue_sent          " << reply.num_of_esm_info_req_to_ue_sent() << endl;
+            cout << "num_of_handled_esm_info_resp            " << reply.num_of_handled_esm_info_resp() << endl;
+            cout << "num_of_cs_req_to_sgw_sent               " << reply.num_of_cs_req_to_sgw_sent() << endl;
+            cout << "num_of_processed_cs_resp                " << reply.num_of_processed_cs_resp() << endl;
+            cout << "num_of_init_ctxt_req_to_ue_sent         " << reply.num_of_init_ctxt_req_to_ue_sent() << endl;
+            cout << "num_of_processed_init_ctxt_resp         " << reply.num_of_processed_init_ctxt_resp() << endl;
+            cout << "num_of_mb_req_to_sgw_sent               " << reply.num_of_mb_req_to_sgw_sent() << endl;
+            cout << "num_of_processed_attach_cmp_from_ue     " << reply.num_of_processed_attach_cmp_from_ue() << endl;
+            cout << "num_of_processed_mb_resp                " << reply.num_of_processed_mb_resp() << endl;
+            cout << "num_of_attach_done                      " << reply.num_of_attach_done() << endl;
+            cout << "num_of_del_session_req_sent             " << reply.num_of_del_session_req_sent() << endl;
+            cout << "num_of_purge_req_sent                   " << reply.num_of_purge_req_sent() << endl;
+            cout << "num_of_processed_del_session_resp       " << reply.num_of_processed_del_session_resp() << endl;
+            cout << "num_of_processed_pur_resp               " << reply.num_of_processed_pur_resp() << endl;
+            cout << "num_of_detach_accept_to_ue_sent         " << reply.num_of_detach_accept_to_ue_sent() << endl;
+            cout << "num_of_processed_detach_accept          " << reply.num_of_processed_detach_accept() << endl;
+            cout << "num_of_ue_ctxt_release                  " << reply.num_of_ue_ctxt_release() << endl;
+            cout << "num_of_processed_ctxt_rel_resp          " << reply.num_of_processed_ctxt_rel_resp() << endl;
+ 	    cout << "num_of_rel_access_bearer_req_sent       " << reply.num_of_rel_access_bearer_req_sent() << endl;											    cout << "num_of_rel_access_bearer_resp_received  " << reply.num_of_rel_access_bearer_resp_received() << endl;
+	    cout << "num_of_s1_rel_req_received              " << reply.num_of_s1_rel_req_received() << endl;
+	    cout << "num_of_s1_rel_cmd_sent                  " << reply.num_of_s1_rel_cmd_sent() << endl;
+	    cout << "num_of_s1_rel_comp_received             " << reply.num_of_s1_rel_comp_received() << endl;
+	    cout << "num_of_clr_received                     " << reply.num_of_clr_received() << endl;
+	    cout << "num_of_cla_sent                         " << reply.num_of_cla_sent() << endl;
+	    cout << "num_of_detach_req_to_ue_sent            " << reply.num_of_detach_req_to_ue_sent() << endl;
+	    cout << "num_of_detach_accept_from_ue            " << reply.num_of_detach_accept_from_ue() << endl;
+	    cout << "total_num_of_subscribers                " << reply.total_num_of_subscribers() << endl;
+	    cout << "num_of_subscribers_detached             " << reply.num_of_subscribers_detached() << endl;
+	    cout << "num_of_tau_response_to_ue_sent          " << reply.num_of_tau_response_to_ue_sent() << endl;
+
+    } else {
+      std::cout << status.error_code() << ": " << status.error_message()
+                << std::endl;
+    }
+  }
+
+  void GetDebugUeContext(const int32_t id){
+    // Container for the data we expect from the server.
+    EventInfoRespBuf reply;
+
+    UeContextReqBuf request;
+    request.set_id(id);
+
+    // Context for the client. It could be used to convey extra information to
+    // the server and/or tweak certain RPC behaviors.
+    ClientContext context;
+    // The actual RPC.
+    Status status = stub_->GetDebugUeContext(&context, request, &reply);
+
+    // Act upon its status.
+    if (status.ok())
+    {
+	    int event_info_buf_size=reply.eventinfo_size();
+	    cout << "EVENT\t\t\t\t\t\tSTATE\t\t\t\t\t\tTIMESTAMP" << endl;
+	    cout << "-----------------------------------------------------------------" << endl;
+	    for(int i=0; i<event_info_buf_size; i++)
+	    {
+		    const EventInfoRespBuf_EventInfoBuf& event_info=reply.eventinfo(i);
+
+		    cout << event_info.event() <<  "\t\t\t\t\t\t"
+		         << event_info.state()  << "\t\t\t\t\t\t"
+		         << event_info.time() << endl;
+	    }
+    } else {
+      cout << status.error_code() << ": " << status.error_message() << endl;
+    }
+  }
+
+
+ private:
+  std::unique_ptr<MmeGrpcCli::Stub> stub_;
+};
+
+int main(int argc, char** argv) {
+  // Instantiate the client. It requires a channel, out of which the actual RPCs
+  // are created. This channel models a connection to an endpoint (in this case,
+  // localhost at port 50051). We indicate that the channel isn't authenticated
+  // (use of InsecureChannelCredentials()).
+
+  if((0==strcmp(argv[1],"mme-app"))&&(0==strcmp(argv[2],"show"))&&(0==strcmp(argv[3],"mobile-context")))
+  {
+  	MmeGrpcCliClient MmeGrpcCli(grpc::CreateChannel(
+      		"localhost:50051", grpc::InsecureChannelCredentials()));
+	stringstream sid;
+	sid << argv[4];
+  	int32_t id = 1;
+	sid >> id;
+
+  	MmeGrpcCli.GetUeContext(id);
+  }
+  else if((0==strcmp(argv[1],"mme-app"))&&(0==strcmp(argv[2],"show"))&&(0==strcmp(argv[3],"procedure-stats")))
+  {
+	MmeGrpcCliClient MmeGrpcCli(grpc::CreateChannel(
+                "localhost:50051", grpc::InsecureChannelCredentials()));
+
+        MmeGrpcCli.GetProcStats();
+  }
+ else if((0==strcmp(argv[1],"mme-app"))&&(0==strcmp(argv[2],"show"))&&(0==strcmp(argv[3],"mobile-contexts-all")))
+  {
+        MmeGrpcCliClient MmeGrpcCli(grpc::CreateChannel(
+                "localhost:50051", grpc::InsecureChannelCredentials()));
+
+        MmeGrpcCli.ShowAllMobileContexts();
+  }
+
+  else if((0==strcmp(argv[1],"mme-app"))&&(0==strcmp(argv[2],"debug"))&&(0==strcmp(argv[3],"show")) &&(0==strcmp(argv[4],"mobile-context")))
+  {
+  	MmeGrpcCliClient MmeGrpcCli(grpc::CreateChannel(
+                "localhost:50051", grpc::InsecureChannelCredentials()));
+        stringstream sid;
+        sid << argv[5];
+        int32_t id = 1;
+        sid >> id;
+	cout << endl << "-----debug mobile context----- " << id << endl;
+	MmeGrpcCli.GetUeContext(id);
+	MmeGrpcCli.GetDebugUeContext(id);
+  }
+  return 0;
+}
