Q.1 ) I am having hard time to understand which thread to suspend ? A.1 ) In both do_send, and do_receive you need to suspend the current thread, you can get the current thread by the follwing way, which you are quite familiar with. ThreadCB cthread = MMU.getPTBR().getTask().getCurrentThread(); make sure you do this once in your method, and use the 'cthread' object in other places of your method as needed. Q.2 ) How to suspend a thread on system event, and notifyThreads on that event ? A.2 ) You can do it in the following way: SystemEvent myPortEvent = new SystemEvent("MyPortEvent"); // Creating the system event 5c cthread.suspend(myPortEvent); // Suspending on system event 5d myPortEvent.notifyThreads() // Notify threads waiting on system event 5fii, 5j Q.3 ) How to suspend a thread on port object, and notifyThreads on it ? A.3 ) Here we have to understand we can refer the port object, on which the methods(do_send, do_receive) are called with "this". So you can suspend and notify it for the following way: cthread.suspend(this) // suspending of port object, 5eii this.notifyThreads() // Notify threads on port object, 5h Q.4 ) Well where do we handle the furter complications mentioned in 5f, inside or outside the loop where we check the buffer availability ? A.4 ) You need to do it inside the loop, your code may have the following structure for the part mentioned in 5d, 5e, and 5f. suspend cthread on system event while( there is not enough room for the msg ){ suspend the thread on port object if( status of cthread is ThreadKill){ // do whatever necessary } if( this.status() not PortLive ){ // do whatever necessary .. } }