msc {
  CLI2 [label="CLI #2"], CLI1 [label="CLI #1"], GWS, GWC, SRV;

  CLI1 -> GWS [label="Search X"];
  GWS box GWC [label="Begin search"];
  GWC -> SRV [label="Search X"];
  GWC <- SRV [label="Have X"];
  GWC -> SRV [label="Open X"];
  GWC <- SRV [label="Chan X"];
  GWS box GWC [label="Add Cache"];
  CLI1 -> GWS [label="Have X"];
  ...;
  CLI2 -> GWS [label="Search X"];
  GWS box GWC [label="Cache hit"];
  CLI2 <- GWS [label="Have X"];
  ...;
  CLI1 -> GWS [label="Get"];
  GWS -> GWC [label="Get"];
  GWC -> SRV [label="Get"];
  GWC <- SRV [label="Got"];
  GWS <- GWC [label="Got"];
  CLI1 <- GWS [label="Got"];
  ...;
  CLI1 -> GWS [label="Sub. X"];
  GWS box GWC [label="Add cache"];
  GWC -> SRV [label="Sub. X"];
  ...;
  CLI2 -> GWS [label="Sub. X"];
  GWS box GWC [label="Use cache"];
  ...;
  GWC <- SRV [label="Event"];
  GWS <- GWC [label="Add Queue"];
  CLI1 <- GWS [label="Event"];
  CLI2 <- GWS [label="Event"];
}
