msc {
	hscale="3";
	ue [label="Customer"], trx [label="Lower Layer TRX"], hnodeb [label="osmo-hnodeb"], hnbgw [label="HNBGW"], ggsn [label="GGSN"], mgw [label="MGW"];

	|||;
	---  [ label = "hNodeB starts up" ];
	hnodeb => hnbgw [label="HNBAP HnbRegisterRequest"];
	hnodeb <= hnbgw [label="HNBAP HnbRegisterResponse"];
	|||;
	...;
	|||;
	|||;
	---  [ label = "TRX starts up & connects to hNodeB" ];
	trx => hnodeb [label="CTL-HELLO.req(SAPI=CTL, VERSION)"];
	trx <= hnodeb [label="CTL-HELLO.cnf(SAPI=CTL, VERSION)"];
	trx => hnodeb [label="CTL-HELLO.req(SAPI=IUH, VERSION)"];
	trx <= hnodeb [label="CTL-HELLO.cnf(SAPI=IUH, VERSION)"];
	trx => hnodeb [label="CTL-HELLO.req(SAPI=GTP, VERSION)"];
	trx <= hnodeb [label="CTL-HELLO.cnf(SAPI=GTP, VERSION)"];
	trx => hnodeb [label="CTL-HELLO.req(SAPI=AUDIO, VERSION)"];
	trx <= hnodeb [label="CTL-HELLO.cnf(SAPI=AUDIO, VERSION)"];
	trx <= hnodeb [label="IUH-CONFIGURE.ind(PLMN,LAC,SAC,RAC,CI,RNC_ID from HnbRegisterResponse)"];
	|||;
	...;
	|||;
	|||;
	---  [ label = "Subscriber Paging" ];
	hnodeb <= hnbgw [label="RUA-InitiatingMessage(RANAP Paging)"];
	trx <= hnodeb [label="IUH-UNITDATA.ind[RANAP Paging]"];
	|||;
	...;
	|||;
	|||;
	---  [ label = "Subscriber Sign Up" ];
	ue => trx [label="CM Service Req"];
	trx => hnodeb [label="IUH-CONN_ESTABLISH.req[RANAP CM ServiceReq]"];
	hnodeb => hnbgw [label="HNBAP UE Register Req(IMSI?)"];
	hnodeb <= hnbgw [label="HNBAP UE Register Acc(context_id)"];
	hnodeb => hnbgw [label="RUA-Connect(RANAP-GMM ServiceRequest)"];
	hnodeb <= hnbgw [label="RUA-DirectTransfer(RANAP GMM ServiceAccept)"];
	trx <= hnodeb [label="IUH-CONN_ESTABLISH.cnf(context_id])"];
	trx <= hnodeb [label="IUH-CONN_DATA.ind[context_id, RANAP GMM ServiceAccept]"];
	---  [ label = "Subscriber set up PS data:" ];
	hnodeb <= hnbgw [label="RANAP RAB-Assignment Request(TEI, ADDR)"];
	trx <= hnodeb [label="IUH-CONN_DATA.ind[RANAP RAB-Assignment Request(remote_ip, remote_port, remote_tei)]"];
	trx => hnodeb [label="GTP-CONN_ESTABLISH.req(context_id,remote_ip,remote_port,remote_tei)"];
	...  [ label = "HnodeB sets up GTP-U connection" ];
	trx <= hnodeb [label="GTP-CONN_ESTABLISH.cnf(context_id,gtp_conn_id,local_ip,local_port,local_tei)"];
	|||;
	...;
	|||;
	|||;
	---  [ label = "PS data transmission over GTP-U:" ];
	ue => trx [label="..."];
	trx => hnodeb [label="GTP-CONN_DATA.req[gtp_conn_id,payload]"];
	hnodeb => ggsn [label="GTP-U(remote_tei, local_addr, remote_addr, payload)"];
	hnodeb <= ggsn [label="GTP-U(local_tei, remote_addr, local_addr, payload)"];
	trx <= hnodeb [label="GTP-CONN_DATA.ind[gtp_conn_id,payload]"];
	ue <= trx [label="..."];
	|||;
	...;
	|||;
	---  [ label = "MO/MT PS data Release:" ];
	ue => trx [label="..."];
	trx => hnodeb [label="IUH-CONN_DATA.req[RANAP IU Release Request]"];
	hnodeb => hnbgw [label="RANAP IU Release Request"];
	hnodeb <= hnbgw [label="RANAP IU Release Command"];
	trx <= hnodeb [label="IUH-CONN_DATA.ind[RANAP IU Release Command]"];
	...;
	trx => hnodeb [label="GTP-CONN_RELEASE.req(gtp_conn_id)"];

	trx => hnodeb [label="IUH-CONN_RELEASE.req[RANAP IU Release Complete]"];
	hnodeb => hnbgw [label="RUA-Disconnect(RANAP IU Release Complete)"];

	|||;
	...;
	|||;
	---  [ label = "For voice call (CS): Similar to SAPI_GTP, but using SAPI_AUDIO and osmo-hnodeb sets up RTP stream" ];


	|||;
	...;
	|||;
	---  [ label = "Iuh SCTP link goes down" ];
	trx <= hnodeb [label="UD socket is closed, osmo-hnodeb cleans up state and attempts reconnect. lowerlayer can re-connect and wait for next CONFIGURE.req"];
}