1. The purpose for the intermidiate report is to allow the team to design the whole system. After that, the two people should divide their work and start to write codes. (I suggest two people work on different functions and then combine them together. Of course, you can also always work together. In that case, I guess one person makes the main contributation.) 2. Total order. The simpliest way to ensure total order is to use a queue to store all Requests of sending messages on the server side. The server will take the messages in the queue one by one and send them out. When actomicity is required, this process is more complicated. 3. The architecture of the server When you combine "actomicity" with "total order" (we did that last semester), you have to carefully consider the architecture of the server, i.e., how those different types of threads work together. Perhaps, you have: A1. threadS (one for each client) to handle any request (joint group, send message, etc) A2. a thread (just one on the server side) that constantly take a meaasge from the queue and try to send it to the group (two phase commitment). It takes long time. A3. threadS (one for each client) to test if a client is still "alive". A4. other kinds of threads All those threads work concurrently. The unique thread handling the message (A2) will ensure the total order.