@@ -62,4 +62,28 @@ TutorialD (master): :commit
6262TutorialD (master): Notification received "steve_change": ...
6363```
6464
65−The notification contains the result from the evaluated report relational expression.
65+The asynchronously-received notification contains the result from the evaluated report relational expression. The expression, in this case, is the result of the report expression evaluated against the parent transactoin
66+
67+```
68+TutorialD (master): Notification received "steve_change":
69+Project (AttributeNames (fromList ["address"])) (Restrict (AttributeEqualityPredicate "name" (NakedAtomExpr Atom "Steve")) (RelationVariable "person"))
70+┌────────┐
71+│address │
72+├────────┤
73+│Main St.│
74+└────────┘
75+```
76+
77+## Notifications with ProjectM36.Client
78+
79+First, implement a ```NotificationCallback``` function to perform an IO action when an asynchronous notification is received from the DBMS. Note that this function will not be called on any specific thread; specifically, the callback is *not* triggered by calling into ProjectM36.Client functions.
80+
81+Each ProjectM36 Connection can only have one callback and it cannot be changed after Connection creation.
82+
83+Then, create a DatabaseExpr using the AddNotification constructor:
84+
85+```
86+AddNotification <notification name::Text> <change expression::RelationalExpr> <report expression::RelationalExpr>
87+```
88+
89+and execute it using ```executeDatabaseContextExpr```. In order for a notification to take effect, it must be committed as well.