diff --git a/protocols/schema-bundle.bin b/protocols/schema-bundle.bin
index 1ebfcb7..401cf40 100644
--- a/protocols/schema-bundle.bin
+++ b/protocols/schema-bundle.bin
@@ -1,8 +1,19 @@
-´³bundle·µ³hayes„´³schema·³version‘³definitions·³Result´³rec´³lit³result„´³tupleµ´³named³text´³atom³String„„´³named³tag´³refµ„³MaybeString„„´³named³fields´³refµ„³MaybeStrings„„„„„³MaybeString´³orµµ±present´³atom³String„„µ±absent´³lit€„„„„³MaybeStrings´³orµµ±present´³seqof´³atom³String„„„µ±absent´³lit€„„„„³ModemPresent´³rec´³lit³modem„´³tupleµ´³lit³hayes„´³named³
-devicePath´³atom³String„„´³named³	dataspace´³embedded´³refµ„³InternalProtocol„„„„„„³
CommandResult´³rec´³lit³command-result„´³tupleµ´³named³commandText´³atom³String„„´³named³results´³seqof´³refµ„³Result„„„´³named³finalResult´³atom³String„„„„„³ExecuteCommand´³rec´³lit³execute-command„´³tupleµ´³named³commandText´³atom³String„„´³named³replyTo´³refµ„³CommandContinuation„„„„„³InternalProtocol³any³CommandContinuation´³orµµ±replyWanted´³embedded´³refµ„³
CommandResult„„„µ±
fireAndForget´³lit€„„„„³UnsolicitedResultCode´³rec´³lit³unsolicited„´³tupleµ´³named³result´³refµ„³Result„„„„„„³embeddedType€„„µ³	telephony„´³schema·³version‘³definitions·³CallType´³orµµ±voice´³lit³voice„„µ±data´³lit³data„„µ±fax´³lit³fax„„„„³	CallState´³orµµ±hold´³lit³hold„„µ±original´³lit³original„„µ±connect´³lit³connect„„µ±incoming´³lit³incoming„„µ±waiting´³lit³waiting„„µ±end´³lit³end„„µ±alerting´³lit³alerting„„„„³
+´³bundle·µ³ui„´³schema·³version‘³definitions·³Fill´³orµµ±fixed´³atom³Double„„µ±fill´³rec´³lit³fill„´³tupleµ´³named³weight´³atom³
SignedInteger„„´³named³rank´³atom³
SignedInteger„„„„„„„„³Click´³rec´³lit³click„´³tupleµ´³named³widget´³refµ„³WidgetId„„„„„³Color´³rec´³lit³rgba„´³tupleµ´³named³red´³atom³Double„„´³named³green´³atom³Double„„´³named³blue´³atom³Double„„´³named³alpha´³atom³Double„„„„„³State´³rec´³lit³state„´³tupleµ´³named³widget´³refµ„³WidgetId„„´³named³key³any„´³named³value³any„„„„³Touch´³rec´³lit³touch„´³tupleµ´³named³widget´³refµ„³WidgetId„„´³named³touchId³any„„„„³Sizing´³rec´³lit³sizing„´³tupleµ´³named³ideal´³atom³Double„„´³named³stretch´³refµ„³Fill„„´³named³shrink´³refµ„³Fill„„„„„³BoxSize´³rec´³lit³box-size„´³tupleµ´³named³
+horizontal´³refµ„³Sizing„„´³named³vertical´³refµ„³Sizing„„„„„³LeafType´³lit³box„³Ordering´³orµµ±double´³atom³Double„„µ±string´³atom³String„„„„³WidgetId³any³
+ShowWidget´³rec´³lit³show„´³tupleµ´³named³	positions´³refµ„³WidgetSelector„„´³named³widget´³refµ„³
+WidgetTree„„´³named³order´³refµ„³Ordering„„´³named³client´³embedded´³refµ„³WidgetClientProtocol„„„„„„³
+WidgetTree´³orµµ±node´³rec´³lit³node„´³tupleµ´³named³orientation´³refµ„³Orientation„„´³named³
+attributes´³refµ„³WidgetAttributes„„´³named³children´³seqof´³refµ„³
+WidgetTree„„„„„„„µ±leaf´³rec´³lit³leaf„´³tupleµ´³named³type´³refµ„³LeafType„„´³named³
+attributes´³refµ„³WidgetAttributes„„„„„„„„³Orientation´³orµµ±vertical´³lit³vertical„„µ±
+horizontal´³lit³
+horizontal„„„„³WidgetInstance´³rec´³lit³widget-instance„´³tupleµ´³named³server´³embedded³any„„„„„³WidgetSelector´³orµµ±attributeEquals´³rec´³lit³=„´³tupleµ´³named³key´³atom³Symbol„„´³named³value³any„„„„„µ±and´³rec´³lit³and„´³tupleµ´³named³	selectors´³seqof´³refµ„³WidgetSelector„„„„„„„„„³WidgetAttributes´³dictof´³atom³Symbol„³any„³WidgetClientProtocol´³refµ„³WidgetInstance„„³embeddedType€„„µ³hayes„´³schema·³version‘³definitions·³Result´³rec´³lit³result„´³tupleµ´³named³text´³atom³String„„´³named³tag´³refµ„³MaybeString„„´³named³fields´³refµ„³MaybeStrings„„„„„³MaybeString´³orµµ±present´³atom³String„„µ±absent´³lit€„„„„³MaybeStrings´³orµµ±present´³seqof´³atom³String„„„µ±absent´³lit€„„„„³ModemPresent´³rec´³lit³modem„´³tupleµ´³lit³hayes„´³named³
+devicePath´³atom³String„„´³named³	dataspace´³embedded´³refµ„³InternalProtocol„„„„„„³
CommandResult´³rec´³lit³command-result„´³tupleµ´³named³commandText´³atom³String„„´³named³results´³seqof´³refµ„³Result„„„´³named³finalResult´³atom³String„„„„„³ExecuteCommand´³rec´³lit³execute-command„´³tupleµ´³named³commandText´³atom³String„„´³named³replyTo´³refµ„³CommandContinuation„„„„„³InternalProtocol³any³CommandContinuation´³orµµ±replyWanted´³embedded´³refµ„³
CommandResult„„„µ±
fireAndForget´³lit€„„„„³UnsolicitedResultCode´³rec´³lit³unsolicited„´³tupleµ´³named³result´³refµ„³Result„„„„„„³embeddedType€„„µ³	telephony„´³schema·³version‘³definitions·³CallId´³atom³
SignedInteger„³CallType´³orµµ±voice´³lit³voice„„µ±data´³lit³data„„µ±fax´³lit³fax„„„„³	CallState´³orµµ±hold´³lit³hold„„µ±original´³lit³original„„µ±connect´³lit³connect„„µ±incoming´³lit³incoming„„µ±waiting´³lit³waiting„„µ±end´³lit³end„„µ±alerting´³lit³alerting„„„„³	PlaceCall´³rec´³lit³
+place-call„´³tupleµ´³named³
+devicePath´³atom³String„„´³named³peer´³atom³String„„„„„³
 ActiveCall´³rec´³lit³
-call-state„´³tupleµ´³named³callId´³atom³
SignedInteger„„´³named³	direction´³refµ„³
CallDirection„„´³named³type´³refµ„³CallType„„´³named³peer´³atom³String„„´³named³peerNumberType´³refµ„³
+call-state„´³tupleµ´³named³callId´³refµ„³CallId„„´³named³	direction´³refµ„³
CallDirection„„´³named³type´³refµ„³CallType„„´³named³peer´³atom³String„„´³named³peerNumberType´³refµ„³
 NumberType„„´³named³state´³refµ„³	CallState„„„„„³
 AnswerCall´³rec´³lit³answer-call„´³tupleµ´³named³callId´³atom³
SignedInteger„„„„„³
 NumberType´³orµµ±unknown´³lit³unknown„„µ±
international´³lit³
international„„µ±national´³lit³national„„„„³ModemPresent´³rec´³lit³modem„´³tupleµ´³named³type´³atom³Symbol„„´³named³
-devicePath´³atom³String„„´³named³	dataspace´³embedded³any„„„„„³ReleaseCause´³orµµ±unassignedNumber´³lit³unassignedNumber„„µ±normal´³lit³normal„„µ±busy´³lit³busy„„µ±noUserResponding´³lit³noUserResponding„„µ±callRejected´³lit³callRejected„„µ±destinationOutOfOrder´³lit³destinationOutOfOrder„„µ±normalUnspecified´³lit³normalUnspecified„„µ±incompatibleDestination´³lit³incompatibleDestination„„„„³
CallDirection´³orµµ±mo´³lit³mo„„µ±mt´³lit³mt„„„„³CallIdSelector´³orµµ±specificCall´³atom³
SignedInteger„„µ±allCalls´³lit³all„„„„³DisconnectCall´³rec´³lit³disconnect-call„´³tupleµ´³named³callId´³refµ„³CallIdSelector„„´³named³cause´³refµ„³ReleaseCause„„„„„„³embeddedType€„„µ³usersAndGroups„´³schema·³version‘³definitions·³Spec´³orµµ±userAccount´³lit³user„„µ±
systemAccount´³lit³system„„µ±id´³atom³
SignedInteger„„„„³Group´³rec´³lit³grent„´³tupleµ´³dict·³gid´³named³gid´³atom³
SignedInteger„„³name´³named³name´³atom³String„„„„„„„³Account´³rec´³lit³pwent„´³tupleµ´³dict·³gid´³named³gid´³atom³
SignedInteger„„³uid´³named³uid´³atom³
SignedInteger„„³home´³named³home´³atom³String„„³info´³named³info´³atom³String„„³name´³named³name´³atom³String„„³shell´³named³shell´³atom³String„„„„„„„³EnsureGroup´³rec´³lit³ensure-group„´³tupleµ´³named³name´³atom³String„„´³named³spec´³refµ„³Spec„„„„„³GroupMember´³rec´³lit³group-member„´³tupleµ´³named³uid´³atom³
SignedInteger„„´³named³gid´³atom³
SignedInteger„„„„„³
EnsureAccount´³rec´³lit³ensure-account„´³tupleµ´³named³name´³atom³String„„´³named³spec´³refµ„³Spec„„„„„„³embeddedType€„„„„
\ No newline at end of file
+devicePath´³atom³String„„´³named³	dataspace´³embedded³any„„„„„³ReleaseCause´³orµµ±unassignedNumber´³lit³unassignedNumber„„µ±normal´³lit³normal„„µ±busy´³lit³busy„„µ±noUserResponding´³lit³noUserResponding„„µ±callRejected´³lit³callRejected„„µ±destinationOutOfOrder´³lit³destinationOutOfOrder„„µ±normalUnspecified´³lit³normalUnspecified„„µ±incompatibleDestination´³lit³incompatibleDestination„„„„³
CallDirection´³orµµ±mo´³lit³mo„„µ±mt´³lit³mt„„„„³CallIdSelector´³orµµ±specificCall´³atom³
SignedInteger„„µ±allCalls´³lit³all„„„„³CallInProgress´³rec´³lit³call-in-progress„´³tupleµ„„„³DisconnectCall´³rec´³lit³disconnect-call„´³tupleµ´³named³callId´³refµ„³CallIdSelector„„´³named³cause´³refµ„³ReleaseCause„„„„„„³embeddedType€„„µ³usersAndGroups„´³schema·³version‘³definitions·³Spec´³orµµ±userAccount´³lit³user„„µ±
systemAccount´³lit³system„„µ±id´³atom³
SignedInteger„„„„³Group´³rec´³lit³grent„´³tupleµ´³dict·³gid´³named³gid´³atom³
SignedInteger„„³name´³named³name´³atom³String„„„„„„„³Account´³rec´³lit³pwent„´³tupleµ´³dict·³gid´³named³gid´³atom³
SignedInteger„„³uid´³named³uid´³atom³
SignedInteger„„³home´³named³home´³atom³String„„³info´³named³info´³atom³String„„³name´³named³name´³atom³String„„³shell´³named³shell´³atom³String„„„„„„„³EnsureGroup´³rec´³lit³ensure-group„´³tupleµ´³named³name´³atom³String„„´³named³spec´³refµ„³Spec„„„„„³GroupMember´³rec´³lit³group-member„´³tupleµ´³named³uid´³atom³
SignedInteger„„´³named³gid´³atom³
SignedInteger„„„„„³
EnsureAccount´³rec´³lit³ensure-account„´³tupleµ´³named³name´³atom³String„„´³named³spec´³refµ„³Spec„„„„„„³embeddedType€„„„„
\ No newline at end of file
diff --git a/protocols/schemas/telephony.prs b/protocols/schemas/telephony.prs
index b15715c..c841472 100644
--- a/protocols/schemas/telephony.prs
+++ b/protocols/schemas/telephony.prs
@@ -4,7 +4,8 @@ version 1 .
 ModemPresent = <modem @type symbol @devicePath string @dataspace #!any> .
 
 ; Assertion. Describes an ongoing call.
-ActiveCall = <call-state @callId int @direction CallDirection @type CallType @peer string @peerNumberType NumberType @state CallState> .
+ActiveCall = <call-state @callId CallId @direction CallDirection @type CallType @peer string @peerNumberType NumberType @state CallState> .
+CallId = int .
 CallDirection = =mo / =mt .
 CallType = =voice / =data / =fax .
 NumberType = =unknown / =international / =national .
@@ -26,3 +27,9 @@ ReleaseCause =
 / =normalUnspecified
 / =incompatibleDestination
 .
+
+; Message. Starts an outgoing call. Assumes `international` NumberType.
+PlaceCall = <place-call @devicePath string @peer string> .
+
+; Assertion. Some call is active.
+CallInProgress = <call-in-progress> .
diff --git a/protocols/schemas/ui.prs b/protocols/schemas/ui.prs
new file mode 100644
index 0000000..8788b76
--- /dev/null
+++ b/protocols/schemas/ui.prs
@@ -0,0 +1,50 @@
+version 1 .
+
+; Data types
+
+WidgetTree =
+/ <node @orientation Orientation @attributes WidgetAttributes @children [WidgetTree ...]>
+/ <leaf @type LeafType @attributes WidgetAttributes>
+.
+
+Orientation = =vertical / =horizontal .
+WidgetAttributes = { symbol: any ...:... } .
+LeafType =
+/ =box
+.
+
+WidgetSelector =
+/ @attributeEquals <= @key symbol @value any>
+/ <and @selectors [WidgetSelector ...]>
+.
+
+Fill = @fixed double / <fill @weight int @rank int> .
+Sizing = <sizing @ideal double @stretch Fill @shrink Fill> .
+BoxSize = <box-size @horizontal Sizing @vertical Sizing> .
+
+; Commonly set under key `id` in WidgetAttributes.
+WidgetId = any .
+
+Color = <rgba @red double @green double @blue double @alpha double> .
+
+WidgetClientProtocol = WidgetInstance .
+
+; Assertion
+ShowWidget = <show
+              @positions WidgetSelector
+              @widget WidgetTree
+              @order Ordering
+              @client #!WidgetClientProtocol > .
+Ordering = @double double / @string string .
+
+; Assertion
+WidgetInstance = <widget-instance @server #!any> .
+
+; Assertion
+Touch = <touch @widget WidgetId @touchId any> .
+
+; Message
+Click = <click @widget WidgetId> .
+
+; Assertion
+State = <state @widget WidgetId @key any @value any> .
