code: public Object down(Event evt) {
          Object retval=super.down(evt);
  
          switch(evt.getType()) {
              case Event.CONNECT:
              case Event.CONNECT_WITH_STATE_TRANSFER:
              case Event.CONNECT_USE_FLUSH:
              case Event.CONNECT_WITH_STATE_TRANSFER_USE_FLUSH:
                  register(cluster_name, local_addr, this);
                  break;
              case Event.DISCONNECT:
                  unregister(cluster_name, local_addr);
                  break;
              case Event.SET_LOCAL_ADDRESS:
                  local_addr=evt.getArg();
                  break;
              case Event.BECOME_SERVER: // called after client has joined and is fully working group member
                  is_server=true;
                  break;
              case Event.VIEW_CHANGE:
              case Event.TMP_VIEW:
                  curr_view=evt.getArg();
                  Address[] mbrs=((View)evt.getArg()).getMembersRaw();
                  is_coord=local_addr != null && mbrs != null && mbrs.length > 0 && local_addr.equals(mbrs[0]);
                  break;
              case Event.GET_PING_DATA:
                  return getDiscoveryResponsesFor(evt.getArg()); // don't pass further down
              case Event.GET_PHYSICAL_ADDRESS:
                  if(cluster_name == null)
                      return retval;
                  Address mbr=evt.getArg();
                  Map<Address,SHARED_LOOPBACK> map=routing_table.get(cluster_name);
                  SHARED_LOOPBACK lp=map != null? map.get(mbr) : null;
                  return lp != null? lp.getPhysicalAddress() : null;
          }
  
          return retval;
      }
docs: /*------------------------------ Protocol interface ------------------------------