diff --git a/www/analyzer/checker_dev_manual.html b/www/analyzer/checker_dev_manual.html
index 5368eb0..25327d4 100644
--- a/www/analyzer/checker_dev_manual.html
+++ b/www/analyzer/checker_dev_manual.html
@@ -28,15 +28,20 @@ for general developer guidelines and information. </p>
 
     <ul>
       <li><a href="#start">Getting Started</a></li>
-      <li><a href="#analyzer">Analyzer Overview</a></li>
+      <li><a href="#analyzer">Static Analyzer Overview</a>
+      <ul>
+        <li><a href="#interaction">Interaction with Checkers</a></li>
+        <li><a href="#values">Representing Values</a></li>
+      </ul></li>
+      <li><a href="#extendingstates">Custom Program States</a></li>
       <li><a href="#idea">Idea for a Checker</a></li>
       <li><a href="#registration">Checker Registration</a></li>
       <li><a href="#skeleton">Checker Skeleton</a></li>
-      <li><a href="#node">Exploded Node</a></li>
       <li><a href="#bugs">Bug Reports</a></li>
       <li><a href="#ast">AST Visitors</a></li>
       <li><a href="#testing">Testing</a></li>
-      <li><a href="#commands">Useful Commands</a></li>
+      <li><a href="#commands">Useful Commands/Debugging Hints</a></li>
+      <li><a href="#additioninformation">Additional Sources of Information</a></li>
     </ul>
 
 <h2 id=start>Getting Started</h2>
@@ -103,7 +108,7 @@ for general developer guidelines and information. </p>
     <li><tt>GenericDataMap</tt> - constraints on symbolic values
   </ul>
   
-  <h3>Interaction with Checkers</h3>
+  <h3 id=interaction>Interaction with Checkers</h3>
   Checkers are not merely passive receivers of the analyzer core changes - they 
   actively participate in the <tt>ProgramState</tt> construction through the
   <tt>GenericDataMap</tt> which can be used to store the checker-defined part 
@@ -114,7 +119,7 @@ for general developer guidelines and information. </p>
   in the predefined order; thus, calling all the checkers adds a chain to the 
   <tt>ExplodedGraph</tt>. 
   
-  <h3>Representing Values</h3>
+  <h3 id=values>Representing Values</h3>
   During symbolic execution, <a href="http://clang.llvm.org/doxygen/classclang_1_1ento_1_1SVal.html">SVal</a> 
   objects are used to represent the semantic evaluation of expressions. 
   They can represent things like concrete 
@@ -127,7 +132,7 @@ for general developer guidelines and information. </p>
   number. In some cases, <tt>SVal</tt> is not a symbol, but it really should be 
   a symbolic value. This happens when the analyzer cannot reason about something 
   (yet). An example is floating point numbers. In such cases, the 
-  <tt>SVal</tt> will evaluate to <a href="http://clang.llvm.org/doxygen/classclang_1_1ento_1_1UnknownVal.html">UnknownVal<a>. 
+  <tt>SVal</tt> will evaluate to <a href="http://clang.llvm.org/doxygen/classclang_1_1ento_1_1UnknownVal.html">UnknownVal</a>.
   This represents a case that is outside the realm of the analyzer's reasoning 
   capabilities. <tt>SVals</tt> are value objects and their values can be viewed 
   using the <tt>.dump()</tt> method. Often they wrap persistent objects such as 
@@ -196,6 +201,76 @@ values (e.g., the number 1).
   Symbols<br>
   FunctionalObjects are used throughout.  
   -->
+<h3 id=extendingstates>Custom Program States</h3>
+
+<p> Checkers often need to keep track of information specific to the checks they
+perform. However, since checkers have no guarantee about the order in which the
+program will be explored (or that some paths will be explored at all), no state
+information can be kept within individual checkers. Therefore, if checkers need
+to store custom information, they need to add new categories of data to the
+ProgramState. The preferred way to do so is to use one of several macros
+designed for this purpose. They are:
+
+<ul>
+<li><a
+href="http://clang.llvm.org/doxygen/ProgramStateTrait_8h.html#ae4cddb54383cd702a045d7c61b009147">REGISTER_TRAIT_WITH_PROGRAMSTATE</a>:
+Used when the state information is a single value. The methods available for
+state types declared with this macro are <tt>get</tt>, <tt>set</tt>, and
+<tt>remove</tt>.
+<li><a
+href="http://clang.llvm.org/doxygen/CheckerContext_8h.html#aa27656fa0ce65b0d9ba12eb3c02e8be9">REGISTER_LIST_WITH_PROGRAMSTATE</a>:
+Used when the state information is a list of values. The methods available for
+state types declared with this macro are <tt>add</tt>, <tt>get</tt>,
+<tt>remove</tt>, and <tt>contains</tt>.
+<li><a
+href="http://clang.llvm.org/doxygen/CheckerContext_8h.html#ad90f9387b94b344eaaf499afec05f4d1">REGISTER_SET_WITH_PROGRAMSTATE</a>:
+Used when the state information is a set of values. The methods available for
+state types declared with this macro are <tt>add</tt>, <tt>get</tt>,
+<tt>remove</tt>, and <tt>contains</tt>.
+<li><a
+href="http://clang.llvm.org/doxygen/CheckerContext_8h.html#a6d1893bb8c18543337b6c363c1319fcf">REGISTER_MAP_WITH_PROGRAMSTATE</a>:
+Used when the state information is a map from a key to a value. The methods
+available for state types declared with this macro are <tt>add</tt>,
+<tt>set</tt>, <tt>get</tt>, <tt>remove</tt>, and <tt>contains</tt>.
+</ul>
+
+<p>All of these macros take as parameters the name to be used for the custom
+category of state information, and the data type(s) to be used for storage. The
+data type(s) specified will also become the parameter and/or return type of the
+functions that manipulate the new category of state information. Each of these
+methods are templated with the name of the custom data type, so if there was a
+data type declared as
+
+<pre class="code_example">
+REGISTER_TRAIT_WITH_PROGRAMSTATE(ExampleDataType, int)
+</pre>
+
+The data would be accessed with the function
+
+<pre class="code_example">
+ProgramStateRef state;
+...
+int currentlValue = state-&gt;get&lt;ExampleDataType&gt;();
+</pre>
+
+and set with the function
+
+<pre class="code_example">
+ProgramStateRef state;
+...
+ProgramStateRef newState = state-&gt;set&lt;ExampleDataType&gt;(newValue);
+</pre>
+
+<p>These macros will cover a majority of use cases; however, they still have a
+few limitations. They cannot be used inside namespaces (since they expand to
+contain top-level namespace references), and the data types that they define
+cannot be referenced from more than one file.
+
+<p>Note that <tt>ProgramStates</tt> are immutable; instead of modifying an existing
+one, functions that modify the state will return a copy of the previous state
+with the change applied. This updated state must be then provided to the
+analyzer by calling the <tt>CheckerContext::addTransition</tt> function.
+
 <h2 id=idea>Idea for a Checker</h2>
   Here are several questions which you should consider when evaluating your 
   checker idea:
@@ -222,35 +297,26 @@ values (e.g., the number 1).
   All checker implementation files are located in <tt>clang/lib/StaticAnalyzer/Checkers</tt> 
   folder. Follow the steps below to register a new checker with the analyzer.
 <ol>
-  <li>Create a new checker implementation file, for example <tt>./lib/StaticAnalyzer/Checkers/NewChecker.cpp</tt>
+  <li>Create a new checker implementation file, for example <tt>./lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp</tt>.
+  <li>Include the following code (replacing SimpleStreamChecker with the name of the new checker).
 <pre class="code_example">
-using namespace clang;
-using namespace ento;
-
-namespace {
-class NewChecker: public Checker< check::PreStmt&lt;CallExpr> > {
-public:
-  void checkPreStmt(const CallExpr *CE, CheckerContext &amp;Ctx) const {}
-}
-}
 void ento::registerNewChecker(CheckerManager &amp;mgr) {
-  mgr.registerChecker&lt;NewChecker>();
+  mgr.registerChecker&lt;SimpleStreamChecker&gt();
 }
 </pre>
 
 <li>Pick the package name for your checker and add the registration code to 
 <tt>./lib/StaticAnalyzer/Checkers/Checkers.td</tt>. Note, all checkers should 
-first be developed as experimental. Suppose our new checker performs security 
-related checks, then we should add the following lines under 
-<tt>SecurityExperimental</tt> package: 
+first be developed as "alpha". Since the SimpleStreamChecker performs UNIX API
+checks, add the following to the <tt>UnixAlpha</tt> package:
 <pre class="code_example">
-let ParentPackage = SecurityExperimental in {
+let ParentPackage = UnixAlpha in {
 ...
-def NewChecker : Checker<"NewChecker">,
-  HelpText<"This text should give a short description of the checks performed.">,
-  DescFile<"NewChecker.cpp">;
+def SimpleStreamChecker : Checker<"SimpleStream">,
+  HelpText<"Check for misuses of stream APIs">,
+  DescFile<"SimpleStreamChecker.cpp">;
 ...
-} // end "security.experimental"
+} // end "alpha.unix"
 </pre>
 
 <li>Make the source code file visible to CMake by adding it to 
@@ -259,20 +325,129 @@ def NewChecker : Checker<"NewChecker">,
 <li>Compile and see your checker in the list of available checkers by running:<br>
 <tt><b>$clang -cc1 -analyzer-checker-help</b></tt>
 </ol>
-   
 
 <h2 id=skeleton>Checker Skeleton</h2>
-  There are two main decisions you need to make:
-  <ul>
-    <li> Which events the checker should be tracking. 
-    See <a href="http://clang.llvm.org/doxygen/classento_1_1CheckerDocumentation.html">CheckerDocumentation</a> 
-    for the list of available checker callbacks.</li>
-    <li> What data you want to store as part of the checker-specific program 
-    state. Try to minimize the checker state as much as possible. </li>
-  </ul>
+<p> Checkers fundamentally extend the class <tt><a
+href="http://clang.llvm.org/doxygen/classclang_1_1ento_1_1Checker.html">
+Checker</a></tt>, but they do so in an unusual way. The "class" <tt>Checker</tt>
+is actually a templated class, and checkers extend a specialization of this
+class. Unlike the standard <a
+href="http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern">
+Curiously Recurring Template Pattern</a>, the specialization being extended uses
+as its parameter(s) the type of events that the checker is interested in
+processing. The various types of events that are available are described in the
+file <a
+href="http://clang.llvm.org/doxygen/CheckerDocumentation_8cpp_source.html">
+CheckerDocumentation.cpp</a>
+
+<p> For each event type requested, a corresponding function with the name
+<tt>check&lt;event&gt;</tt> must be defined in the checker class
+(<tt>CheckerDocumentation.cpp</tt> shows the correct function signature for each
+event type).
+
+<p> As an example, consider <tt>SimpleStreamChecker</tt>, a checker that warns
+about improper use of file stream APIs. This checker needs to take action at the
+following times:
+
+<ul>
+<li>Before making a call to a function, check if the function is <tt>fclose</tt>.
+If so, check the parameter being passed.
+<li>After making a function call, check if the function is <tt>fopen</tt>. If
+so, process the return value.
+<li>When values go out of scope, check whether they are still-open file
+descriptors, and report a bug if so. In addition, remove any information about
+them from the program state in order to keep the state as small as possible.
+<li>When file pointers "escape" (are used in a way that the analyzer can no longer
+track them), mark them as such. This prevents false positives in the cases where
+the analyzer cannot be sure whether the file was closed or not.
+</ul>
+
+<p>These events that will be used for each of these actions are, respectively, <a
+href="http://clang.llvm.org/doxygen/classclang_1_1ento_1_1check_1_1PreCall.html">PreCall</a>,
+<a
+href="http://clang.llvm.org/doxygen/classclang_1_1ento_1_1check_1_1PostCall.html">PostCall</a>,
+<a
+href="http://clang.llvm.org/doxygen/classclang_1_1ento_1_1check_1_1DeadSymbols.html">DeadSymbols</a>,
+and <a
+href="http://clang.llvm.org/doxygen/classclang_1_1ento_1_1check_1_1PointerEscape.html">PointerEscape</a>.
+The high-level structure of the checker's class is thus:
+
+<pre class="code_example">
+class SimpleStreamChecker : public Checker&lt;check::PreCall,
+                                           check::PostCall,
+                                           check::DeadSysbols,
+                                           check::PointerEscape&gt; {
+    public:
+
+    void checkPreCall(const CallEvent &amp;Call, CheckerContext &amp;C) const;
+
+    void checkPostCall(const CallEvent &amp;Call, CheckerContext &amp;C) const;
+
+    void checkDeadSymbols(SymbolReaper &amp;SR, CheckerContext &amp;C) const;
+
+    ProgramStateRef checkPointerEscape(ProgramStateRef State,
+                                       const InvalidatedSymbols &amp;Escaped,
+                                       const CallEvent *Call,
+                                       PointerEscapeKind Kind) const;
+};
+</pre>
 
 <h2 id=bugs>Bug Reports</h2>
 
+
+<p>
+  When a checker detects a mistake in the analyzed code, it needs a way to report
+  it to the Analyzer so that it can be displayed. This uses two classes:
+  <tt><a href="http://clang.llvm.org/doxygen/classclang_1_1ento_1_1BugType.html">BugType</a></tt>
+  and <tt><a href="http://clang.llvm.org/doxygen/classclang_1_1ento_1_1BugReport.html">
+  BugReport</a></tt>.
+
+<p>
+<tt>BugType</tt>, as the name would suggest, represents a type of bug. The
+constructor for <tt>BugType</tt> takes two parameters: The name of the bug
+type, and the name of the category of the bug. These are used (e.g.) in the
+summary page generated by the scan-build tool.
+
+<P>
+  The <tt>BugReport</tt> class represents a specific occurrence of an bug. In
+  the most common case, three parameters are used to form a <tt>BugReport</tt>:
+<ol>
+<li>The type of bug, specified as an instance of the <tt>BugType</tt> class.
+<li>A short descriptive string. This is placed at the location of the bug in
+the detailed line-by-line output generated by scan-build.
+<li>The context in which the bug occurred. This includes both the location of
+the bug in the code and the program's state when this location is reached. This
+is in the form of a node in the <tt>ExplodedGraph</tt>.
+</ol>
+
+<p>The node representing this context can be obtained one of two ways:
+
+<ol>
+<li>If the state has been updated, then the <a
+href="http://clang.llvm.org/doxygen/classclang_1_1ento_1_1CheckerContext.html#a264f48d97809707049689c37aa35af78">CheckerContext::addTransition</a>
+function will return the updated state node.
+<li>If the state has not been updated, it can be obtained by calling the <a
+href="http://clang.llvm.org/doxygen/classclang_1_1ento_1_1CheckerContext.html#a81bd66f80b18117a9a64a8d0daa62825">CheckerContext::getState</a>
+function.
+</ol>
+
+In addition, the checker needs to decide if the analysis should continue along
+the current path. This will depend on the nature of the bug, and whether it
+would prevent the program could continuing. For example, leaking of a resource
+should not stop analysis, as the program can continue to run after the leak.
+Dereferencing a null pointer, on the other hand, should stop analysis, as there
+is no way for the program to meaningfully continue after such an error.
+
+If analysis should not continue, then the current state should be transitioned
+into a so-called <i>sink node</i>, a node from which no further analysis will be
+performed. This is done by calling the <a
+href="http://clang.llvm.org/doxygen/classclang_1_1ento_1_1CheckerContext.html#adeea33a5a2bed190210c4a2bb807a6f0">
+CheckerContext::generateSink</a> function.
+
+<p>
+After a <tt>BugReport</tt> is created, it should be passed to the
+<tt>EmitReport</tt> function of the <tt>CheckerContext</tt>.
+
 <h2 id=ast>AST Visitors</h2>
   Some checks might not require path-sensitivity to be effective. Simple AST walk 
   might be sufficient. If that is the case, consider implementing a Clang 
@@ -356,6 +531,31 @@ To dump AST of a method that the current <tt>ExplodedNode</tt> belongs to:
 </li>
 </ul>
 
+<h2 id=additioninformation>Additional Sources of Information</h2>
+
+Here are some additional resources that are useful when working on the Clang
+Static Analyzer:
+
+<ul>
+<li> <a href="http://clang.llvm.org/doxygen">Clang doxygen</a>. Contains
+up-to-date documentation about the APIs available in Clang. Relevant entries
+have been linked throughout this page. Also of use is the
+<a href="http://llvm.org/doxygen">LLVM doxygen</a>, when dealing with classes
+from LLVM.
+<li> The <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">
+cfe-dev mailing list</a>. This is the primary mailing list used for
+discussion of Clang development (including static code analysis). The
+<a href="http://lists.cs.uiuc.edu/pipermail/cfe-dev">archive</a> also contains
+a lot of information.
+<li> The "Building a Checker in 24 hours" presentation given at the <a
+href="http://llvm.org/devmtg/2012-11">November 2012 LLVM Developer's
+meeting</a>. Describes the construction of SimpleStreamChecker. <a
+href="http://llvm.org/devmtg/2012-11/Zaks-Rose-Checker24Hours.pdf">Slides</a>
+and <a
+href="http://llvm.org/devmtg/2012-11/videos/Zaks-Rose-Checker24Hours.mp4">video</a>
+are available.
+</ul>
+
 </div>
 </div>
 </body>
