diff --git a/protocols/schema-bundle.bin b/protocols/schema-bundle.bin
index bbf6f6f..1ebfcb7 100644
--- a/protocols/schema-bundle.bin
+++ b/protocols/schema-bundle.bin
@@ -1,7 +1,8 @@
-´³bundle·µ³hayes„´³schema·³version‘³definitions·³Result´³rec´³lit³result„´³tupleµ´³named³text´³atom³String„„´³named³tag´³refµ„³MaybeString„„´³named³fields´³refµ„³MaybeStrings„„„„„³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·µ³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„„„„³
 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µ„³
 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„„„„³MaybeString´³orµµ±present´³atom³String„„µ±absent´³lit€„„„„³MaybeStrings´³orµµ±present´³seqof´³atom³String„„„µ±absent´³lit€„„„„³ModemPresent´³rec´³lit³modem„´³tupleµ´³named³
-devicePath´³atom³String„„´³named³	dataspace´³embedded´³refµ„³InternalProtocol„„„„„„³
CallDirection´³orµµ±mo´³lit³mo„„µ±mt´³lit³mt„„„„³
CommandResult´³rec´³lit³command-result„´³tupleµ´³named³commandText´³atom³String„„´³named³results´³seqof´³refµ„³Result„„„´³named³finalResult´³atom³String„„„„„³DisconnectCall´³rec´³lit³disconnect-call„´³tupleµ´³named³callId´³atom³
SignedInteger„„„„„³ExecuteCommand´³rec´³lit³execute-command„´³tupleµ´³named³commandText´³atom³String„„´³named³replyTo´³embedded´³refµ„³
CommandResult„„„„„„³InternalProtocol³any³UnsolicitedResultCode´³rec´³lit³unsolicited„´³tupleµ´³named³result´³refµ„³Result„„„„„„³embeddedType€„„µ³	telephony„´³schema·³version‘³definitions·„³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
+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
diff --git a/protocols/schemas/hayes.prs b/protocols/schemas/hayes.prs
index 930c2e1..296be00 100644
--- a/protocols/schemas/hayes.prs
+++ b/protocols/schemas/hayes.prs
@@ -1,8 +1,8 @@
 version 1 .
 ; Definitions for the internal workings of the Hayes modem driver.
 
-; Assertion. Declares presence of a modem.
-ModemPresent = <modem @devicePath string @dataspace #!InternalProtocol> .
+; Assertion. Declares presence of a Hayes modem.
+ModemPresent = <modem =hayes @devicePath string @dataspace #!InternalProtocol> .
 
 ; TODO not yet properly specified
 InternalProtocol = any .
@@ -11,7 +11,8 @@ InternalProtocol = any .
 UnsolicitedResultCode = <unsolicited @result Result> .
 
 ; Assertion. Asks the modem to execute the given command.
-ExecuteCommand = <execute-command @commandText string @replyTo #!CommandResult> .
+ExecuteCommand = <execute-command @commandText string @replyTo CommandContinuation> .
+CommandContinuation = @replyWanted #!CommandResult / @fireAndForget #f .
 
 ; Assertion. Describes the result of a command execution.
 CommandResult = <command-result @commandText string @results [Result ...] @finalResult string> .
@@ -26,16 +27,3 @@ CommandResult = <command-result @commandText string @results [Result ...] @final
 Result = <result @text string @tag MaybeString @fields MaybeStrings> .
 MaybeString = @present string / @absent #f .
 MaybeStrings = @present [string ...] / @absent #f .
-
-; Assertion. Describes an ongoing call.
-ActiveCall = <call-state @callId int @direction CallDirection @type CallType @peer string @peerNumberType NumberType @state CallState> .
-CallDirection = =mo / =mt .
-CallType = =voice / =data / =fax .
-NumberType = =unknown / =international / =national .
-CallState = =hold / =original / =connect / =incoming / =waiting / =end / =alerting .
-
-; Message. Triggers call answering.
-AnswerCall = <answer-call @callId int> .
-
-; Message. Triggers call rejection or disconnection.
-DisconnectCall = <disconnect-call @callId int> .
diff --git a/protocols/schemas/telephony.prs b/protocols/schemas/telephony.prs
index 0d2446a..b15715c 100644
--- a/protocols/schemas/telephony.prs
+++ b/protocols/schemas/telephony.prs
@@ -1,2 +1,28 @@
 version 1 .
+; Definitions for non-modem-hardware-specific telephony interactions.
 
+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> .
+CallDirection = =mo / =mt .
+CallType = =voice / =data / =fax .
+NumberType = =unknown / =international / =national .
+CallState = =hold / =original / =connect / =incoming / =waiting / =end / =alerting .
+
+; Message. Triggers call answering.
+AnswerCall = <answer-call @callId int> .
+
+; Message. Triggers call rejection or disconnection.
+DisconnectCall = <disconnect-call @callId CallIdSelector @cause ReleaseCause> .
+CallIdSelector = @specificCall int / @allCalls =all .
+ReleaseCause =
+/ =unassignedNumber
+/ =normal
+/ =busy
+/ =noUserResponding
+/ =callRejected
+/ =destinationOutOfOrder
+/ =normalUnspecified
+/ =incompatibleDestination
+.
