msc {
  CLI [label="User/\nPVA Server"], CREQ [label="ChannelRequester"], MREQ [label="MonitorRequester"],
  PROV [label="ChannelProvider"], CHAN [label="Channel"], MON [label="Monitor"], SRV [label="PVA Client/\nUser"];

  CLI -> PROV [label="createChannel(name,req)"];
  CREQ <- PROV [label="channelCreated(chan)"];
  CREQ <- CHAN [label="channelStateChange()"];
  CLI <- CREQ [label="Evt: Channel Ready"];
  CLI -> CHAN [label="createMonitor(mreq)"];
  MREQ <- CHAN [label="monitorConnect(mon)"];
  CLI <- MREQ [label="Evt: Monitor Ready"];
  CLI -> MON [label="start()"];
  MON -> SRV [label="Evt: New Subscriber"];
  ...;
  MON <- SRV [label="Evt: Add to queue"];
  MREQ <- MON [label="monitorEvent()"];
  CLI <- MREQ [label="Evt: Queue not empty"];
  CLI -> MON [label="poll()"];
  CLI <- MON [label="Return data"];
  ...;
  CLI -> MON [label="release(data)"];
  ...;
  CLI -> MON [label="stop()"];
  CLI -> MON [label="destroy()"];
  CLI -> CHAN [label="destroy()"];
}
