diff --git a/docs/program-logic.tex b/docs/program-logic.tex
index e9dd1f023de2a3db19fca2ebfe0adb904a8b932b..d0dc60bc11674127a3fbbab21eec5c5fc19baef1 100644
--- a/docs/program-logic.tex
+++ b/docs/program-logic.tex
@@ -294,23 +294,32 @@ We can derive some specialized forms of the lifting axioms for the operational s
 
 \paragraph{Adequacy of weakest precondition.}
 
-The adequacy statement concerning functional correctness reads as follows:
+The purpose of the adequacy statement is to show that our notion of weakest preconditions is \emph{realistic} in the sense that it actually has anything to do with the actual behavior of the program.
+There are two properties we are looking for: First of all, the postcondition should reflect actual properties of the values the program can terminate with.
+Second, a proof of a weakest precondition with any postcondition should imply that the program is \emph{safe}, \ie that it does not get stuck.
+
+To express the adequacy statement for functional correctness, we assume we are given some set $V \in \textdom{Val}$ of legal return values.
+Furthermore, we assume that the signature $\Sig$ adds a predicate $\pred$ to the logic which reflects $V$ into the logic:
+\[\begin{array}{rMcMl}
+  \Sem\pred &:& \Sem{\textdom{Val}\,} \nfn \Sem\Prop \\
+  \Sem\pred &\eqdef& \Lam \val. \Lam \any. \setComp{n}{v \in V}
+\end{array}\]
+The signature can of course state arbitrary additional properties of $\pred$, as long as they are proven sound.
+
+The adequacy statement now reads as follows:
 \begin{align*}
- &\All \mask, \expr, \val, \pred, \state, \melt, \state', \tpool'.
- \\&(\All n. \melt \in \mval_n) \Ra
- \\&( \ownPhys\state * \ownM\melt \proves \wpre{\expr}[\mask]{x.\; \pred(x)}) \Ra
+ &\All \mask, \expr, \val, \pred, \state, \state', \tpool'.
+ \\&( \ownPhys\state \proves \wpre{\expr}[\mask]{x.\; \pred(x)}) \Ra
  \\&\cfg{\state}{[\expr]} \step^\ast
      \cfg{\state'}{[\val] \dplus \tpool'} \Ra
-     \\&\pred(\val)
+     \\&\val \in V
 \end{align*}
-where $\pred$ is a \emph{meta-level} predicate over values, \ie it can mention neither resources nor invariants.
-\ralf{TODO: We can't just embed meta-level predicates like this. After all, this is a deep embedding.}
 
-Furthermore, the following adequacy statement shows that our weakest preconditions imply that the execution never gets \emph{stuck}: Every expression in the thread pool either is a value, or can reduce further.
+The adequacy statement for safety says that our weakest preconditions imply that every expression in the thread pool either is a value, or can reduce further.
 \begin{align*}
- &\All \mask, \expr, \state, \melt, \state', \tpool'.
+ &\All \mask, \expr, \state, \state', \tpool'.
  \\&(\All n. \melt \in \mval_n) \Ra
- \\&( \ownPhys\state * \ownM\melt \proves \wpre{\expr}[\mask]{x.\; \pred(x)}) \Ra
+ \\&( \ownPhys\state \proves \wpre{\expr}[\mask]{x.\; \pred(x)}) \Ra
  \\&\cfg{\state}{[\expr]} \step^\ast
      \cfg{\state'}{\tpool'} \Ra
      \\&\All\expr'\in\tpool'. \toval(\expr') \neq \bot \lor \red(\expr', \state')