digraph G {
rankdir=TB
labelloc=t; label="Location Services FSMs in OsmoBSC"

	MSC [label="MSC\nvia\nA interface",shape=box3d]
	SMLC [label="SMLC\nvia\nLb interface",shape=box3d]
	SMLC2 [label="SMLC\nvia\nLb interface",shape=box3d]
	Paging [shape=box3d]

	subgraph cluster_LCS_LOC_REQ_FSM {
		label="lcs_loc_req_fsm"
		INIT -> WAIT_LOCATION_RESPONSE
		WAIT_LOCATION_RESPONSE -> BSSLAP_TA_REQ_ONGOING -> GOT_LOCATION_RESPONSE -> terminate
		WAIT_LOCATION_RESPONSE -> GOT_LOCATION_RESPONSE
		terminate [shape=octagon]
	}

	MSC -> INIT [label="BSSAP Perform\nLocation Request",style=dashed]
	WAIT_LOCATION_RESPONSE -> SMLC [label="BSSMAP-LE Perform\nLocation Req",style=dashed]
	SMLC -> WAIT_LOCATION_RESPONSE [label="BSSMAP-LE Perform\nLocation Resp",style=dashed]
	GOT_LOCATION_RESPONSE -> MSC [label="BSSAP Perform\nLocation Response",style=dashed]

	subgraph cluster_LCS_TA_REQ_FSM {
		label="lcs_ta_req_fsm"
		INIT2 [label="INIT"]
		INIT2 -> WAIT_TA [label="MS idle"]
		WAIT_TA -> GOT_TA
		INIT2 -> GOT_TA [label="MS active"]
		GOT_TA -> terminate2
		terminate2 [label="terminate",shape=octagon]
	}

	SMLC2 -> INIT2 [label="TA Request",style=dashed]
	WAIT_TA -> Paging [label="launch Paging",style=dashed]
	Paging -> WAIT_TA [label="EV_TA",style=dashed]
	GOT_TA -> SMLC2 [label="TA Response",style=dashed]

	WAIT_TA -> BSSLAP_TA_REQ_ONGOING [label="EV_TA_REQ_START",style=dashed]
	terminate2 -> BSSLAP_TA_REQ_ONGOING [label="EV_TA_REQ_END",style=dashed,constraint=false]
}