diff --git a/device_simulator/bal_server.c b/device_simulator/bal_server.c
index 38f18ba..9d6402f 100644
--- a/device_simulator/bal_server.c
+++ b/device_simulator/bal_server.c
@@ -22,8 +22,8 @@
 static grpc_c_server_t *test_server;
 
 static void sigint_handler (int x) { 
-        grpc_c_server_destroy(test_server);
-        exit(0);
+	grpc_c_server_destroy(test_server);
+	exit(0);
 }
 
 /*
@@ -31,14 +31,15 @@
  */
 void bal__bal_cfg_get_cb(grpc_c_context_t *context)
 {
-        BalCfg *get_cfg;
+	BalCfg *get_cfg;
 
-        /*
-         * Read incoming message into get_cfg
-         */
-        if (context->gcc_payload) {
-                context->gcc_stream->read(context, (void **)&get_cfg, 0);
-        }
+	/*
+	 * Read incoming message into get_cfg
+	 */
+	if (context->gcc_payload) {
+		context->gcc_stream->read(context, (void **)&get_cfg, 0);
+	}
+
 }
 
 /*
@@ -46,88 +47,133 @@
  */
 void bal__bal_cfg_set_cb(grpc_c_context_t *context)
 {
-        BalCfg *set_cfg;
-        BalErr bal_err;
+	BalCfg *set_cfg;
+	BalErr bal_err;
 
-        /*
-         * Read incoming message into set_cfg
-         */
-        if (context->gcc_payload) {
-                context->gcc_stream->read(context, (void **)&set_cfg, 0);
-        }
+	/*
+	 * Read incoming message into set_cfg
+	 */
+	if (context->gcc_payload) {
+		context->gcc_stream->read(context, (void **)&set_cfg, 0);
+	}
 
-        /*
-         * send it to BAL
-         */
+	/*
+	 * send it to BAL
+	 */
 
-        bal_err__init(&bal_err);
+	bal_err__init(&bal_err);
 
-        bal_err.err= 0;
+	bal_err.err= 0;
 
-        /*
-         * Write reply back to the client
-         */
-        if (!context->gcc_stream->write(context, &bal_err, 0)) {
-        } else {
-                printf("Failed to write\n");
-                exit(1);
-        }
+	/*
+	 * Write reply back to the client
+	 */
+	if (!context->gcc_stream->write(context, &bal_err, 0)) {
+	} else {
+		printf("Failed to write\n");
+		exit(1);
+	}
 
-        grpc_c_status_t status;
-        status.gcs_code = 0;
+	grpc_c_status_t status;
+	status.gcs_code = 0;
 
-        /*
-         * Finish response for RPC
-         */
-        if (context->gcc_stream->finish(context, &status)) {
-                printf("Failed to write status\n");
-                exit(1);
-        }
+	/*
+	 * Finish response for RPC
+	 */
+	if (context->gcc_stream->finish(context, &status)) {
+		printf("Failed to write status\n");
+		exit(1);
+	}
 
 #ifdef BAL_STUB
-        pthread_mutex_lock(&lock);
-        if(set_cfg->hdr->has_obj_type)
-        {
-                enQueue(set_cfg->hdr->obj_type, BAL_ERRNO__BAL_ERR_OK);
-                switch(set_cfg->hdr->obj_type)
-                {
-                        case BAL_OBJ_ID__BAL_OBJ_ID_ACCESS_TERMINAL:
+	pthread_mutex_lock(&lock);
+
+	struct QNode *temp = newNode(set_cfg->hdr->obj_type, 
+			BAL_ERRNO__BAL_ERR_OK, 
+			set_cfg->device_id);
+
+	if(set_cfg->hdr->has_obj_type)
+	{
+
+		switch(set_cfg->hdr->obj_type)
+		{
+			case BAL_OBJ_ID__BAL_OBJ_ID_ACCESS_TERMINAL:
+				{
+					printf("\n***************************************************\n");  
+					printf("Received Access Terminal Configuration msg\n");
+					printf("***************************************************\n");  
+				}
+				break;
+			case BAL_OBJ_ID__BAL_OBJ_ID_INTERFACE:
+				{
+					printf("\n***************************************************\n");  
+					printf("Received PON Interface Configuration msg\n");
+					printf("***************************************************\n");  
+					temp->intf_id = set_cfg->interface->key->intf_id;
+					printf("Pon ID = %d\n", temp->intf_id);
+				}
+				break;
+			case BAL_OBJ_ID__BAL_OBJ_ID_SUBSCRIBER_TERMINAL:
+				{
+					printf("\n*****************************************************\n");  
+					printf("Received ONU Activation msg\n");
+					printf("*****************************************************\n");  
+					temp->intf_id = set_cfg->terminal->key->intf_id;
+					temp->onu_id = set_cfg->terminal->key->sub_term_id;
+				}
+				break;
+                        case BAL_OBJ_ID__BAL_OBJ_ID_PACKET:
                                 {
-                                        printf("\n***************************************************\n");  
-                                        printf("Received Access Terminal Configuration msg\n");
-                                        printf("***************************************************\n");  
+                                   switch(set_cfg->packet->key->packet_send_dest->type)
+                                   {
+					case BAL_DEST_TYPE__BAL_DEST_TYPE_ITU_OMCI_CHANNEL:
+				        {
+						printf("\n*****************************************************\n");  
+						printf("Received OMCI msg\n");
+						printf("*****************************************************\n");  
+						temp->intf_id = set_cfg->terminal->key->intf_id;
+						temp->onu_id = set_cfg->terminal->key->sub_term_id;
+					}
+					break;
+					default:
+					{
+						("\n*****************************************************\n");  
+						printf("Dest type invalid\n");
+						printf("*****************************************************\n");  
+					}
+					break;
+				   }
                                 }
                                 break;
-                        case BAL_OBJ_ID__BAL_OBJ_ID_INTERFACE:
-                                {
-                                        printf("\n***************************************************\n");  
-                                        printf("Received PON Interface Configuration msg\n");
-                                        printf("***************************************************\n");  
-                                }
-                                break;
-                        case BAL_OBJ_ID__BAL_OBJ_ID_SUBSCRIBER_TERMINAL:
-                                {
-                                        printf("\n*****************************************************\n");  
-                                        printf("Received ONU Activation msg\n");
-                                        printf("*****************************************************\n");  
-                                }
-                        default:
-                                break;
-                }
-        }
-        else
-        {
-                printf("BALSTUB:Cfg Set recevied without object type");
-        }
-        pthread_mutex_unlock(&lock);
-        sleep(2);   
-        pthread_cond_signal(&cv);
-        if(BAL_OBJ_ID__BAL_OBJ_ID_INTERFACE == set_cfg->hdr->obj_type)
-        {
-                sleep(5); 
-                enQueue(BAL_OBJ_ID__BAL_OBJ_ID_SUBSCRIBER_TERMINAL, BAL_ERRNO__BAL_ERR_OK);
-                pthread_cond_signal(&cv);
-        }
+			default:
+				{
+				("\n*****************************************************\n");  
+				printf("Received Invalid msg\n");
+				printf("*****************************************************\n");  
+				}
+				break;
+		}
+		enQueue(set_cfg->hdr->obj_type, temp);
+	}
+	else
+	{
+		printf("BALSTUB:Cfg Set recevied without object type");
+	}
+	pthread_mutex_unlock(&lock);
+	sleep(2);   
+	pthread_cond_signal(&cv);
+	if(BAL_OBJ_ID__BAL_OBJ_ID_INTERFACE == set_cfg->hdr->obj_type)
+	{
+		sleep(5); 
+		struct QNode *temp1 = newNode(BAL_OBJ_ID__BAL_OBJ_ID_SUBSCRIBER_TERMINAL, 
+				BAL_ERRNO__BAL_ERR_OK, 
+				set_cfg->device_id);
+		temp1->intf_id = set_cfg->interface->key->intf_id;
+		temp1->onu_id = 65535;
+		printf("sending _onu_discovery_indiaction\n");
+		enQueue(BAL_OBJ_ID__BAL_OBJ_ID_SUBSCRIBER_TERMINAL, temp1); 
+		pthread_cond_signal(&cv);
+	}
 #endif
 }
 
@@ -137,14 +183,14 @@
  */
 void bal__bal_cfg_clear_cb(grpc_c_context_t *context)
 {
-        BalKey *clear_key;
+	BalKey *clear_key;
 
-        /*
-         * Read incoming message into clear_key 
-         */
-        if (context->gcc_payload) {
-                context->gcc_stream->read(context, (void **)&clear_key, 0);
-        }
+	/*
+	 * Read incoming message into clear_key 
+	 */
+	if (context->gcc_payload) {
+		context->gcc_stream->read(context, (void **)&clear_key, 0);
+	}
 
 }
 
@@ -154,14 +200,48 @@
  */
 void bal__bal_api_init_cb(grpc_c_context_t *context)
 {
-        BalInit *bal_init;
+	BalInit *bal_init;
+	BalErr bal_err;
 
-        /*
-         * Read incoming message into set_cfg
-         */
-        if (context->gcc_payload) {
-                context->gcc_stream->read(context, (void **)&bal_init, 0);
-        }
+	/*
+	 * Read incoming message into set_cfg
+	 */
+	if (context->gcc_payload) {
+		context->gcc_stream->read(context, (void **)&bal_init, 0);
+	}
+
+	/*
+	 * send it to BAL
+	 */
+
+
+	("\n*****************************************************\n");  
+	printf("Received API Init msg\n");
+	printf("*****************************************************\n");  
+
+	bal_err__init(&bal_err);
+
+	bal_err.err= 0;
+
+	/*
+	 * Write reply back to the client
+	 */
+	if (!context->gcc_stream->write(context, &bal_err, 0)) {
+	} else {
+		printf("Failed to write\n");
+		exit(1);
+	}
+
+	grpc_c_status_t status;
+	status.gcs_code = 0;
+
+	/*
+	 * Finish response for RPC
+	 */
+	if (context->gcc_stream->finish(context, &status)) {
+		printf("Failed to write status\n");
+		exit(1);
+	}
 
 }
 
@@ -172,14 +252,14 @@
 void bal__bal_api_finish_cb(grpc_c_context_t *context)
 {
 #if 0
-        void *finish_init;
+	void *finish_init;
 
-        /*
-         * Read incoming message into set_cfg
-         */
-        if (context->gcc_payload) {
-                context->gcc_stream->read(context, (void **)&finish_init);
-        }
+	/*
+	 * Read incoming message into set_cfg
+	 */
+	if (context->gcc_payload) {
+		context->gcc_stream->read(context, (void **)&finish_init);
+	}
 #endif
 }
 
@@ -190,85 +270,74 @@
 void bal_ind__bal_ind_info_cb(grpc_c_context_t *context)
 {
 #if 0
-        void *finish_init;
+	void *finish_init;
 
-        /*
-         * Read incoming message into set_cfg
-         */
-        if (context->gcc_payload) {
-                context->gcc_stream->read(context, (void **)&finish_init);
-        }
+	/*
+	 * Read incoming message into set_cfg
+	 */
+	if (context->gcc_payload) {
+		context->gcc_stream->read(context, (void **)&finish_init);
+	}
 #endif
 }
 
 
 /*
- * This functions gets invoked whenever bal RPC gets called
- */
-void bal__bal_omci_msg_cb(grpc_c_context_t *context)
-{
-        char *omci_msg;
-
-        /*
-         * Read incoming message into omci_msg
-         */
-        if (context->gcc_payload) {
-                context->gcc_stream->read(context, (void **)&omci_msg, 0);
-        }
-}
-
-/*
  * Takes socket path as argument
  */
 int main (int argc, char **argv) 
 {
-        int i = 0;
-        grpc_c_server_t *server = NULL;
+	int i = 0;
+	grpc_c_server_t *server = NULL;
 
-        printf("*************\n");
-        printf("BAL STUB\n");
-        printf("*************\n");
-        if (argc < 2) {
-                fprintf(stderr, "Missing socket path argument\n");
-                exit(1);
-        }
+	printf("*************\n");
+	printf("BAL STUB\n");
+	printf("*************\n");
+	if (argc < 2) {
+		fprintf(stderr, "Missing socket path argument\n");
+		exit(1);
+	}
 
-        signal(SIGINT, sigint_handler);
-        /*
-         * Initialize grpc-c library to be used with vanilla gRPC
-         */
-        grpc_c_init(GRPC_THREADS, NULL);
+	signal(SIGINT, sigint_handler);
+	/*
+	 * Initialize grpc-c library to be used with vanilla gRPC
+	 */
+	grpc_c_init(GRPC_THREADS, NULL);
 
-        /*
-         * Create server object
-         */
-        test_server = grpc_c_server_create(argv[1]); 
-        if (test_server == NULL) {
-                printf("Failed to create server\n");
-                exit(1);
-        }
+	/*
+	 * Create server object
+	 */
+	test_server = grpc_c_server_create(argv[1]);
 
-        /*
-         * Initialize greeter service
-         */
-        printf("\nCreating a test server\n");
-        bal__service_init(test_server);
+	if (test_server == NULL) {
+		printf("Failed to create server\n");
+		exit(1);
+	}
 
-        /*
-         * Start server
-         */
-        grpc_c_server_start(test_server);
+	/*
+	 * Initialize greeter service
+	 */
+	printf("\nCreating a test server\n");
+	bal__service_init(test_server);
+
+	/*
+	 * Start server
+	 */
+	grpc_c_server_start(test_server);
 
 #ifdef BAL_STUB
-        printf("\nCreating a stub thread\n");
-        create_stub_thread();
+	printf("\nCreating a stub thread\n");
+	create_stub_thread();
+#else
+	grpc_c_client_t *client = grpc_c_client_init("172.24.150.114:60001", "bal_client", NULL);
 #endif
 
-        /*
-         * Blocks server to wait to completion
-         */
-        grpc_c_server_wait(test_server);
+	/*
+	 * Blocks server to wait to completion
+	 */
+	grpc_c_server_wait(test_server);
 
-        bal__service_init(server);
+	/* code added for example Makefile to compile grpc-c along with edgecore driver */
+	bal__service_init(server);
 
 }
