fluo-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ktur...@apache.org
Subject [incubator-fluo-website] branch asf-site updated: Jekyll build from gh-pages:9af597b
Date Thu, 29 Jun 2017 17:59:23 GMT
This is an automated email from the ASF dual-hosted git repository.

kturner pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/incubator-fluo-website.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new ca06c6a  Jekyll build from gh-pages:9af597b
ca06c6a is described below

commit ca06c6a72b3120e0660b7a6d7c1cb3b268c43187
Author: Keith Turner <kturner@apache.org>
AuthorDate: Thu Jun 29 13:59:07 2017 -0400

    Jekyll build from gh-pages:9af597b
    
    fixes #64 updated Tour for new Observer API (#67)
---
 feed.xml                                  |   4 +-
 tour/application-configuration/index.html | 120 +++++++------------
 tour/basic-read-write/index.html          |   6 +-
 tour/collision-code/index.html            |   2 +-
 tour/exercise-1/index.html                | 193 ++++++++++++------------------
 tour/mem-self-ntfy-code/index.html        |  39 +++---
 tour/observer_example/index.html          |  36 +++---
 tour/observers/index.html                 |  15 ++-
 tour/snapshot-isolation/index.html        |   2 +-
 tour/weak-code/index.html                 |  44 ++++---
 tour/write-skew/index.html                |   5 +-
 11 files changed, 197 insertions(+), 269 deletions(-)

diff --git a/feed.xml b/feed.xml
index 20456f5..f4b5946 100644
--- a/feed.xml
+++ b/feed.xml
@@ -5,8 +5,8 @@
     <description></description>
     <link>https://fluo.apache.org//</link>
     <atom:link href="https://fluo.apache.org//feed.xml" rel="self" type="application/rss+xml" />
-    <pubDate>Thu, 29 Jun 2017 17:51:01 +0000</pubDate>
-    <lastBuildDate>Thu, 29 Jun 2017 17:51:01 +0000</lastBuildDate>
+    <pubDate>Thu, 29 Jun 2017 17:59:05 +0000</pubDate>
+    <lastBuildDate>Thu, 29 Jun 2017 17:59:05 +0000</lastBuildDate>
     <generator>Jekyll v3.3.1</generator>
     
       <item>
diff --git a/tour/application-configuration/index.html b/tour/application-configuration/index.html
index 7ce8655..668813a 100644
--- a/tour/application-configuration/index.html
+++ b/tour/application-configuration/index.html
@@ -123,7 +123,7 @@ initialization any Fluo client or Observer can access the configuration.</p>
 file before initialization.  Alternatively use <a href="https://javadoc.io/page/org.apache.fluo/fluo-api/1.1.0-incubating/org/apache/fluo/api/config/FluoConfiguration.html#getAppConfiguration--">FluoConfiguration.getAppConfiguration()</a> to
 set these properties programmatically.  After Fluo is initialized this information can be accessed
 anywhere by calling <a href="https://javadoc.io/page/org.apache.fluo/fluo-api/1.1.0-incubating/org/apache/fluo/api/client/FluoClient.html#getAppConfiguration--">FluoClient.getAppConfiguration()</a>,
-<a href="https://javadoc.io/page/org.apache.fluo/fluo-api/1.1.0-incubating/org/apache/fluo/api/observer/Observer.Context.html#getAppConfiguration--">Observer.Context.getAppConfigurtaion()</a>, or <a href="https://javadoc.io/page/org.apache.fluo/fluo-api/1.1.0-incubating/org/apache/fluo/api/client/Loader.Context.html#getAppConfiguration--">Loader.Context.getAppConfiguration()</a>.</p>
+<a href="https://javadoc.io/page/org.apache.fluo/fluo-api/1.1.0-incubating/org/apache/fluo/api/observer/ObserverProvider.Context.html#getAppConfiguration--">ObserverProvider.Context.getAppConfigurtaion()</a>, or <a href="https://javadoc.io/page/org.apache.fluo/fluo-api/1.1.0-incubating/org/apache/fluo/api/client/Loader.Context.html#getAppConfiguration--">Loader.Context.getAppConfiguration()</a>.</p>
 
 <p>The following is a simple example of using application config.   This example sets some application
 config before initialization.  After initialization the configuration is accessed via
@@ -155,78 +155,50 @@ table5
 
 <h2 id="observer-configuration">Observer Configuration</h2>
 
-<p>If you want instances of an Observer to behave differently and share code, one way to accomplish
-this is with per observer configuration.  When setting up an observer call one of the
-<a href="https://javadoc.io/page/org.apache.fluo/fluo-api/1.1.0-incubating/org/apache/fluo/api/config/ObserverSpecification.html">ObserverSpecification</a> methods that takes configuration.  When an observer is initialized it
-can access this configuration by calling <a href="https://javadoc.io/page/org.apache.fluo/fluo-api/1.1.0-incubating/org/apache/fluo/api/observer/Observer.Context.html#getObserverConfiguration--">Observer.Context.getObserverConfiguration()</a>.</p>
-
-<p>The code below shows an example of setting configuration for an Observer.  This example simulates an
-observer that can export rows to a mysql table. The example configures two instances of an observer
-using the same class with different configuration.  Even though the observers use the same class, the
-two instances must observe different columns.  That is why the code derives the observed column based
-on the observer configuration.  Notice the mysql database is obtained from application configuration by
-the observer and the table is obtained from observer configuration.</p>
-
-<div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kn">package</span> <span class="n">ft</span><span class="o">;</span>
-
-<span class="kn">import</span> <span class="nn">org.apache.fluo.api.client.TransactionBase</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.fluo.api.client.scanner.CellScanner</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.fluo.api.data.Bytes</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.fluo.api.data.Column</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.fluo.api.data.RowColumnValue</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.fluo.api.data.Span</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.fluo.api.observer.Observer</span><span class="o">;</span>
-
-<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MysqlExportObserver</span> <span class="kd">implements</span> <span class="n">Observer</span> <span class="o">{</span>
-
-  <span class="kd">private</span> <span class="n">String</span> <span class="n">exportDB</span><span class="o">;</span>
-  <span class="kd">private</span> <span class="n">String</span> <span class="n">exportTable</span><span class="o">;</span>
-
-  <span class="nd">@Override</span>
-  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">close</span><span class="o">()</span> <span class="o">{}</span>
-
-  <span class="nd">@Override</span>
-  <span class="kd">public</span> <span class="n">ObservedColumn</span> <span class="nf">getObservedColumn</span><span class="o">()</span> <span class="o">{</span>
-    <span class="n">Column</span> <span class="n">col</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"ET"</span><span class="o">,</span> <span class="n">exportTable</span><span class="o">);</span>
-    <span class="k">return</span> <span class="k">new</span> <span class="nf">ObservedColumn</span><span class="o">(</span><span class="n">col</span><span class="o">,</span> <span class="n">NotificationType</span><span class="o">.</span><span class="na">WEAK</span><span class="o">);</span>
-  <span class="o">}</span>
-
-  <span class="nd">@Override</span>
-  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="n">Context</span> <span class="n">ctx</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
-    <span class="n">exportDB</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="na">getAppConfiguration</span><span class="o">().</span><span class="na">getString</span><span class="o">(</span><span class="s">"exportDB"</span><span class="o">);</span>
-    <span class="n">exportTable</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="na">getObserverConfiguration</span><span class="o">().</span><span class="na">getString</span><span class="o">(</span><span class="s">"exportTable"</span><span class="o">);</span>
-  <span class="o">}</span>
-
-  <span class="nd">@Override</span>
-  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">TransactionBase</span> <span class="n">tx</span><span class="o">,</span> <span class="n">Bytes</span> <span class="n">row</span><span class="o">,</span> <span class="n">Column</span> <span class="n">col</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
-    <span class="n">CellScanner</span> <span class="n">scanner</span> <span class="o">=</span> <span class="n">tx</span><span class="o">.</span><span class="na">scanner</span><span class="o">().</span><span class="na">over</span><span class="o">(</span><span class="n">Span</span><span class="o">.</span><span class="na">exact</span><span class="o">(</span><span class="n">row</span><span class="o">)).</span><span class="na">build</span><span class="o">();</span>
-
-    <span class="k">for</span> <span class="o">(</span><span class="n">RowColumnValue</span> <span class="n">rcv</span> <span class="o">:</span> <span class="n">scanner</span><span class="o">)</span> <span class="o">{</span>
-      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">printf</span><span class="o">(</span><span class="s">"Exporting val:%s from row:%s to db/table:%s/%s\n"</span><span class="o">,</span> <span class="n">rcv</span><span class="o">.</span><span class="na">getsValue</span><span class="o">(),</span> <span class="n">row</span><span class="o">,</span>
-          <span class="n">exportDB</span><span class="o">,</span> <span class="n">exportTable</span><span class="o">);</span>
-      <span class="n">tx</span><span class="o">.</span><span class="na">delete</span><span class="o">(</span><span class="n">rcv</span><span class="o">.</span><span class="na">getRow</span><span class="o">(),</span> <span class="n">rcv</span><span class="o">.</span><span class="na">getColumn</span><span class="o">());</span>
+<p>If you want to use the same code to create multiple observers, one way to accomplish this is
+with application configuration. The code below shows an example of this.  The example simulates
+exporting rows to multiple mysql tables.  To do this, it creates an observers per a export
+table. The observed column and export table for each observer is derived from application
+configuration.</p>
+
+<div class="language-java highlighter-rouge"><pre class="highlight"><code>  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">TourObserverProvider</span> <span class="kd">implements</span> <span class="n">ObserverProvider</span> <span class="o">{</span>
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">provide</span><span class="o">(</span><span class="n">Registry</span> <span class="n">obsRegistry</span><span class="o">,</span> <span class="n">Context</span> <span class="n">ctx</span><span class="o">)</span> <span class="o">{</span>
+      <span class="n">SimpleConfiguration</span> <span class="n">appCfg</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="na">getAppConfiguration</span><span class="o">();</span>
+      <span class="n">String</span> <span class="n">exportDB</span> <span class="o">=</span> <span class="n">appCfg</span><span class="o">.</span><span class="na">getString</span><span class="o">(</span><span class="s">"exportDB"</span><span class="o">);</span>
+
+      <span class="c1">// Create an observer for each export table</span>
+      <span class="k">for</span> <span class="o">(</span><span class="n">Entry</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">String</span><span class="o">&gt;</span> <span class="n">entry</span> <span class="o">:</span> <span class="n">appCfg</span><span class="o">.</span><span class="na">subset</span><span class="o">(</span><span class="s">"exportTables"</span><span class="o">).</span><span class="na">toMap</span><span class="o">( [...]
+        <span class="n">String</span> <span class="n">exportId</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="na">getKey</span><span class="o">();</span>
+        <span class="n">String</span> <span class="n">exportTable</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="na">getValue</span><span class="o">();</span>
+
+        <span class="n">Column</span> <span class="n">exportNtfyCol</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"ET"</span><span class="o">,</span> <span class="n">exportId</span><span class="o">);</span>
+
+        <span class="n">Observer</span> <span class="n">exportObserver</span> <span class="o">=</span> <span class="o">(</span><span class="n">tx</span><span class="o">,</span> <span class="n">row</span><span class="o">,</span> <span class="n">col</span><span class="o">)</span> <span class="o">-&gt;</span> <span class="o">{</span>
+          <span class="n">CellScanner</span> <span class="n">scanner</span> <span class="o">=</span> <span class="n">tx</span><span class="o">.</span><span class="na">scanner</span><span class="o">().</span><span class="na">over</span><span class="o">(</span><span class="n">Span</span><span class="o">.</span><span class="na">exact</span><span class="o">(</span><span class="n">row</span><span class="o">)).</span><span class="na">build</span><span class="o">();</span>
+
+          <span class="k">for</span> <span class="o">(</span><span class="n">RowColumnValue</span> <span class="n">rcv</span> <span class="o">:</span> <span class="n">scanner</span><span class="o">)</span> <span class="o">{</span>
+            <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">printf</span><span class="o">(</span><span class="s">"Exporting val=%s from row=%s to db=%s table=%s\n"</span><span class="o">,</span> <span class="n">rcv</span><span class="o">.</span><span class="na">getsValue</span><span class="o">(),</span>
+                <span class="n">row</span><span class="o">,</span> <span class="n">exportDB</span><span class="o">,</span> <span class="n">exportTable</span><span class="o">);</span>
+            <span class="n">tx</span><span class="o">.</span><span class="na">delete</span><span class="o">(</span><span class="n">rcv</span><span class="o">.</span><span class="na">getRow</span><span class="o">(),</span> <span class="n">rcv</span><span class="o">.</span><span class="na">getColumn</span><span class="o">());</span>
+          <span class="o">}</span>
+        <span class="o">};</span>
+
+        <span class="n">obsRegistry</span><span class="o">.</span><span class="na">forColumn</span><span class="o">(</span><span class="n">exportNtfyCol</span><span class="o">,</span> <span class="n">NotificationType</span><span class="o">.</span><span class="na">WEAK</span><span class="o">).</span><span class="na">useObserver</span><span class="o">(</span><span class="n">exportObserver</span><span class="o">);</span>
+      <span class="o">}</span>
     <span class="o">}</span>
   <span class="o">}</span>
-<span class="o">}</span>
-</code></pre>
-</div>
-
-<p>The following code initializes two observers using the same class with different configuration.  It
-also sets application configuration that is used by the observers.  The code then writes some data
-and notifies the two observers which process the data.</p>
 
-<div class="language-java highlighter-rouge"><pre class="highlight"><code>  <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">preInit</span><span class="o">(</span><span class="n">FluoConfiguration</span> <span class="n">fluoConfig</span><span class="o">)</span> <span class="o">{</span>
+  <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">preInit</span><span class="o">(</span><span class="n">FluoConfiguration</span> <span class="n">fluoConfig</span><span class="o">)</span> <span class="o">{</span>
     <span class="n">SimpleConfiguration</span> <span class="n">appConfig</span> <span class="o">=</span> <span class="n">fluoConfig</span><span class="o">.</span><span class="na">getAppConfiguration</span><span class="o">();</span>
     <span class="n">appConfig</span><span class="o">.</span><span class="na">setProperty</span><span class="o">(</span><span class="s">"exportDB"</span><span class="o">,</span> <span class="s">"db1"</span><span class="o">);</span>
 
-    <span class="n">ObserverSpecification</span> <span class="n">observer1</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ObserverSpecification</span><span class="o">(</span><span class="n">MysqlExportObserver</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getName</span><span class="o">(),</span>
-        <span class="n">Collections</span><span class="o">.</span><span class="na">singletonMap</span><span class="o">(</span><span class="s">"exportTable"</span><span class="o">,</span> <span class="s">"table9"</span><span class="o">));</span>
-
-    <span class="n">ObserverSpecification</span> <span class="n">observer2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ObserverSpecification</span><span class="o">(</span><span class="n">MysqlExportObserver</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getName</span><span class="o">(),</span>
-        <span class="n">Collections</span><span class="o">.</span><span class="na">singletonMap</span><span class="o">(</span><span class="s">"exportTable"</span><span class="o">,</span> <span class="s">"table3"</span><span class="o">));</span>
+    <span class="c1">// An observer will be created to process each export table. In this example 't1' and 't2'</span>
+    <span class="c1">// are used as logical IDs for export tables.</span>
+    <span class="n">appConfig</span><span class="o">.</span><span class="na">setProperty</span><span class="o">(</span><span class="s">"exportTables.t1"</span><span class="o">,</span> <span class="s">"bigtable"</span><span class="o">);</span>
+    <span class="n">appConfig</span><span class="o">.</span><span class="na">setProperty</span><span class="o">(</span><span class="s">"exportTables.t2"</span><span class="o">,</span> <span class="s">"tinytable"</span><span class="o">);</span>
 
-    <span class="n">fluoConfig</span><span class="o">.</span><span class="na">addObserver</span><span class="o">(</span><span class="n">observer1</span><span class="o">);</span>
-    <span class="n">fluoConfig</span><span class="o">.</span><span class="na">addObserver</span><span class="o">(</span><span class="n">observer2</span><span class="o">);</span>
+    <span class="n">fluoConfig</span><span class="o">.</span><span class="na">setObserverProvider</span><span class="o">(</span><span class="n">TourObserverProvider</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
   <span class="o">}</span>
 
   <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">exercise</span><span class="o">(</span><span class="n">MiniFluo</span> <span class="n">mini</span><span class="o">,</span> <span class="n">FluoClient</span> <span class="n">client</span><span class="o">)</span> <span class="o">{</span>
@@ -235,7 +207,7 @@ and notifies the two observers which process the data.</p>
       <span class="n">tx</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="s">"e:99"</span><span class="o">,</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"export"</span><span class="o">,</span> <span class="s">"data2"</span><span class="o">),</span> <span class="s">"444"</span><span class="o">);</span>
       <span class="n">tx</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="s">"e:99"</span><span class="o">,</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"export"</span><span class="o">,</span> <span class="s">"data3"</span><span class="o">),</span> <span class="s">"555"</span><span class="o">);</span>
 
-      <span class="n">tx</span><span class="o">.</span><span class="na">setWeakNotification</span><span class="o">(</span><span class="s">"e:99"</span><span class="o">,</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"ET"</span><span class="o">,</span> <span class="s">"table3"</span><span class="o">));</span>
+      <span class="n">tx</span><span class="o">.</span><span class="na">setWeakNotification</span><span class="o">(</span><span class="s">"e:99"</span><span class="o">,</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"ET"</span><span class="o">,</span> <span class="s">"t1"</span><span class="o">));</span>
 
       <span class="n">tx</span><span class="o">.</span><span class="na">commit</span><span class="o">();</span>
     <span class="o">}</span>
@@ -246,7 +218,7 @@ and notifies the two observers which process the data.</p>
       <span class="n">tx</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="s">"e:98"</span><span class="o">,</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"export"</span><span class="o">,</span> <span class="s">"data2"</span><span class="o">),</span> <span class="s">"888"</span><span class="o">);</span>
       <span class="n">tx</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="s">"e:98"</span><span class="o">,</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"export"</span><span class="o">,</span> <span class="s">"data3"</span><span class="o">),</span> <span class="s">"999"</span><span class="o">);</span>
 
-      <span class="n">tx</span><span class="o">.</span><span class="na">setWeakNotification</span><span class="o">(</span><span class="s">"e:98"</span><span class="o">,</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"ET"</span><span class="o">,</span> <span class="s">"table9"</span><span class="o">));</span>
+      <span class="n">tx</span><span class="o">.</span><span class="na">setWeakNotification</span><span class="o">(</span><span class="s">"e:98"</span><span class="o">,</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"ET"</span><span class="o">,</span> <span class="s">"t2"</span><span class="o">));</span>
 
       <span class="n">tx</span><span class="o">.</span><span class="na">commit</span><span class="o">();</span>
     <span class="o">}</span>
@@ -258,12 +230,12 @@ and notifies the two observers which process the data.</p>
 
 <p>Running the code above prints the following.</p>
 
-<div class="highlighter-rouge"><pre class="highlight"><code>Exporting val:222 from row:e:99 to db/table:db1/table3
-Exporting val:777 from row:e:98 to db/table:db1/table9
-Exporting val:444 from row:e:99 to db/table:db1/table3
-Exporting val:888 from row:e:98 to db/table:db1/table9
-Exporting val:555 from row:e:99 to db/table:db1/table3
-Exporting val:999 from row:e:98 to db/table:db1/table9
+<div class="highlighter-rouge"><pre class="highlight"><code>Exporting val=777 from row=e:98 to db=db1 table=tinytable
+Exporting val=888 from row=e:98 to db=db1 table=tinytable
+Exporting val=999 from row=e:98 to db=db1 table=tinytable
+Exporting val=222 from row=e:99 to db=db1 table=bigtable
+Exporting val=444 from row=e:99 to db=db1 table=bigtable
+Exporting val=555 from row=e:99 to db=db1 table=bigtable
 </code></pre>
 </div>
 
diff --git a/tour/basic-read-write/index.html b/tour/basic-read-write/index.html
index e1dca30..37a1579 100644
--- a/tour/basic-read-write/index.html
+++ b/tour/basic-read-write/index.html
@@ -111,9 +111,9 @@
   <p class="text-muted">Tour page 4 of 26</p>
 </div>
 <div id="tour-content">
-  <p>The following example shows basic code for writing data using Fluo and then reading it back out.  To
-run this code, modify <code class="highlighter-rouge">src/main/java/ft/Main.java</code> in the <a href="https://github.com/apache/incubator-fluo-website/tree/fluo-tour">Fluo Tour git repository</a> and run it by
-following the instructions in the repository.</p>
+  <p>The following  shows Java code for writing and reading data using Fluo.  In your local clone, modify
+the <code class="highlighter-rouge">exercise(MiniFluo, FluoClient)</code> function in <a href="https://github.com/apache/incubator-fluo-website/tree/fluo-tour/src/main/java/ft/Main.java">src/main/java/ft/Main.java</a>.  Then run
+<code class="highlighter-rouge">ft.Main</code> as previously mentioned.</p>
 
 <div class="language-java highlighter-rouge"><pre class="highlight"><code>  <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">exercises</span><span class="o">(</span><span class="n">MiniFluo</span> <span class="n">mini</span><span class="o">,</span> <span class="n">FluoClient</span> <span class="n">client</span><span class="o">)</span> <span class="o">{</span>
     <span class="n">String</span> <span class="n">row</span> <span class="o">=</span> <span class="s">"kerbalnaut0001"</span><span class="o">;</span>
diff --git a/tour/collision-code/index.html b/tour/collision-code/index.html
index 89b537d..5dfed5f 100644
--- a/tour/collision-code/index.html
+++ b/tour/collision-code/index.html
@@ -143,7 +143,7 @@
 
 <p>The code above prints :</p>
 
-<div class="highlighter-rouge"><pre class="highlight"><code>tx3 commit exception message : org.apache.fluo.api.exceptions.CommitException
+<div class="highlighter-rouge"><pre class="highlight"><code>tx3 commit exception : org.apache.fluo.api.exceptions.CommitException: Collsions(1):kerbalnaut0001 name last
 Kerman
 </code></pre>
 </div>
diff --git a/tour/exercise-1/index.html b/tour/exercise-1/index.html
index d1db721..9a6fe10 100644
--- a/tour/exercise-1/index.html
+++ b/tour/exercise-1/index.html
@@ -334,9 +334,9 @@ incremented.</p>
 
 <span class="kn">import</span> <span class="nn">org.apache.fluo.api.client.TransactionBase</span><span class="o">;</span>
 <span class="kn">import</span> <span class="nn">org.apache.fluo.api.data.*</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.fluo.api.observer.AbstractObserver</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.fluo.api.observer.StringObserver</span><span class="o">;</span>
 
-<span class="kd">public</span> <span class="kd">class</span> <span class="nc">ContentObserver</span> <span class="kd">extends</span> <span class="n">AbstractObserver</span> <span class="o">{</span>
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">ContentObserver</span> <span class="kd">implements</span> <span class="n">StringObserver</span> <span class="o">{</span>
 
   <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Column</span> <span class="n">PROCESSED_COL</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"doc"</span><span class="o">,</span> <span class="s">"processed"</span><span class="o">);</span>
   <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Column</span> <span class="n">WORD_COUNT</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"word"</span><span class="o">,</span><span class="s">"docCount"</span><span class="o">);</span>
@@ -361,9 +361,7 @@ incremented.</p>
 
 
   <span class="nd">@Override</span>
-  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">TransactionBase</span> <span class="n">tx</span><span class="o">,</span> <span class="n">Bytes</span> <span class="n">brow</span><span class="o">,</span> <span class="n">Column</span> <span class="n">col</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
-
-    <span class="n">String</span> <span class="n">row</span> <span class="o">=</span> <span class="n">brow</span><span class="o">.</span><span class="na">toString</span><span class="o">();</span>
+  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">TransactionBase</span> <span class="n">tx</span><span class="o">,</span> <span class="n">String</span> <span class="n">row</span><span class="o">,</span> <span class="n">Column</span> <span class="n">col</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
 
     <span class="n">Map</span><span class="o">&lt;</span><span class="n">Column</span><span class="o">,</span> <span class="n">String</span><span class="o">&gt;</span> <span class="n">colVals</span> <span class="o">=</span>
         <span class="n">tx</span><span class="o">.</span><span class="na">gets</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">DocLoader</span><span class="o">.</span><span class="na">CONTENT_COL</span><span class="o">,</span> <span class="n">DocLoader</span><span class="o">.</span><span class="na">REF_STATUS_COL</span><span class="o">,</span> <span class="n">PROCESSED_COL</span><span class="o">);</span>
@@ -372,18 +370,12 @@ incremented.</p>
     <span class="n">String</span> <span class="n">status</span> <span class="o">=</span> <span class="n">colVals</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">DocLoader</span><span class="o">.</span><span class="na">REF_STATUS_COL</span><span class="o">);</span>
     <span class="n">String</span> <span class="n">processed</span> <span class="o">=</span> <span class="n">colVals</span><span class="o">.</span><span class="na">getOrDefault</span><span class="o">(</span><span class="n">PROCESSED_COL</span><span class="o">,</span> <span class="s">"false"</span><span class="o">);</span>
 
-    <span class="c1">// TODO if status is referenced and not already processed the adjustCounts by +1 and set</span>
+    <span class="c1">// TODO if status is referenced and not already processed then adjustCounts by +1 and set</span>
     <span class="c1">// PROCESSED_COL to true</span>
 
-    <span class="c1">// TODO is status is unreferenced then delete all columns for content</span>
+    <span class="c1">// TODO if status is unreferenced then delete all columns for content</span>
     <span class="c1">// TODO if status is unreferenced and document was processed, then adjust counts by -1</span>
   <span class="o">}</span>
-
-
-  <span class="nd">@Override</span>
-  <span class="kd">public</span> <span class="n">ObservedColumn</span> <span class="nf">getObservedColumn</span><span class="o">()</span> <span class="o">{</span>
-    <span class="k">return</span> <span class="k">new</span> <span class="nf">ObservedColumn</span><span class="o">(</span><span class="n">DocLoader</span><span class="o">.</span><span class="na">REF_STATUS_COL</span><span class="o">,</span> <span class="n">NotificationType</span><span class="o">.</span><span class="na">STRONG</span><span class="o">);</span>
-  <span class="o">}</span>
 <span class="o">}</span>
 </code></pre>
 </div>
@@ -394,8 +386,16 @@ column?</p>
 <p>When you are ready to run the observer, modify the <code class="highlighter-rouge">preInit()</code> method in <code class="highlighter-rouge">ft.Main</code> to configure the
 observer as follows.</p>
 
-<div class="language-java highlighter-rouge"><pre class="highlight"><code>  <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">preInit</span><span class="o">(</span><span class="n">FluoConfiguration</span> <span class="n">fluoConfig</span><span class="o">)</span> <span class="o">{</span>
-    <span class="n">fluoConfig</span><span class="o">.</span><span class="na">addObserver</span><span class="o">(</span><span class="k">new</span> <span class="n">ObserverSpecification</span><span class="o">(</span><span class="n">ContentObserver</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getName</span><span class="o">()));</span>
+<div class="language-java highlighter-rouge"><pre class="highlight"><code>  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">TourObserverProvider</span> <span class="kd">implements</span> <span class="n">ObserverProvider</span> <span class="o">{</span>
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">provide</span><span class="o">(</span><span class="n">Registry</span> <span class="n">obsRegistry</span><span class="o">,</span> <span class="n">Context</span> <span class="n">ctx</span><span class="o">)</span> <span class="o">{</span>
+      <span class="n">obsRegistry</span><span class="o">.</span><span class="na">forColumn</span><span class="o">(</span><span class="n">DocLoader</span><span class="o">.</span><span class="na">REF_STATUS_COL</span><span class="o">,</span> <span class="n">NotificationType</span><span class="o">.</span><span class="na">STRONG</span><span class="o">)</span>
+          <span class="o">.</span><span class="na">useObserver</span><span class="o">(</span><span class="k">new</span> <span class="n">ContentObserver</span><span class="o">());;</span>
+    <span class="o">}</span>
+  <span class="o">}</span>
+
+  <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">preInit</span><span class="o">(</span><span class="n">FluoConfiguration</span> <span class="n">fluoConfig</span><span class="o">)</span> <span class="o">{</span>
+    <span class="n">fluoConfig</span><span class="o">.</span><span class="na">setObserverProvider</span><span class="o">(</span><span class="n">TourObserverProvider</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
   <span class="o">}</span>
 </code></pre>
 </div>
@@ -508,110 +508,49 @@ w:stuck word docCount	1
 
 <h2 id="part-3--using-fluo-recipes">Part 3 : Using Fluo Recipes</h2>
 
-<p>The way to compute word counts above is very prone to transactional collisions. One way to avoid
-these collisions is to use the CollisionFreeMap(CFM) provided in Fluo Recipes.  The CFM will queue
+<p>The suggested method of computing word counts above is prone to transaction collisions. One way to avoid
+collisions is to use a CombineQueue provided by Fluo Recipes.  This will queue
 updates for words and notify another observer to process the queued updates.  The updates are queued
-in a way that will not cause collisions.  The CFM has its own Observer which will call two functions
-you provide.  The code below shows an example of these two functions and how to configure the CFM to
-call them.</p>
+in a way that will not cause collisions.  The CombineQueue has its own Observer which will call two functions
+you provide.  One function combines updates for a key and the other consumes changes to values.</p>
 
-<p>To try using a CFM, first add the following class.</p>
+<p>To try using a CombineQueue, first add the following class.  This class handles changes to word
+counts by updating an inverted index of word counts.</p>
 
 <div class="language-java highlighter-rouge"><pre class="highlight"><code><span class="kn">package</span> <span class="n">ft</span><span class="o">;</span>
 
-<span class="kn">import</span> <span class="nn">java.util.*</span><span class="o">;</span>
-
 <span class="kn">import</span> <span class="nn">org.apache.fluo.api.client.TransactionBase</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.fluo.api.config.FluoConfiguration</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.fluo.api.config.SimpleConfiguration</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.fluo.recipes.core.map.CollisionFreeMap</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.fluo.recipes.core.map.Combiner</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.fluo.recipes.core.map.Update</span><span class="o">;</span>
-<span class="kn">import</span> <span class="nn">org.apache.fluo.recipes.core.map.UpdateObserver</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.fluo.recipes.core.combine.ChangeObserver</span><span class="o">;</span>
 
 <span class="kn">import</span> <span class="nn">static</span> <span class="n">ft</span><span class="o">.</span><span class="na">ContentObserver</span><span class="o">.</span><span class="na">WORD_COUNT</span><span class="o">;</span>
 
-<span class="cm">/**
- * This class contains all of the code related to the {@link CollisionFreeMap} that keeps track of
- * word counts.  It also generates an inverted index of word counts as an example follow on action.
- */</span>
-<span class="kd">public</span> <span class="kd">class</span> <span class="nc">WordCounter</span> <span class="o">{</span>
-
-  <span class="cm">/**
-   * the {@link CollisionFreeMap} Observer calls this combiner to processes the queued updates for
-   * a word.
-   */</span>
-  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">LongCombiner</span> <span class="kd">implements</span> <span class="n">Combiner</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;{</span>
-
-    <span class="nd">@Override</span>
-    <span class="kd">public</span> <span class="n">Optional</span><span class="o">&lt;</span><span class="n">Long</span><span class="o">&gt;</span> <span class="nf">combine</span><span class="o">(</span><span class="n">String</span> <span class="n">k</span><span class="o">,</span> <span class="n">Iterator</span><span class="o">&lt;</span><span class="n">Long</span><span class="o">&gt;</span> <span class="n">counts</span><span class="o">)</span> <span class="o">{</span>
-      <span class="kt">long</span> <span class="n">sum</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
-      <span class="k">while</span><span class="o">(</span><span class="n">counts</span><span class="o">.</span><span class="na">hasNext</span><span class="o">())</span> <span class="o">{</span>
-        <span class="n">sum</span> <span class="o">+=</span> <span class="n">counts</span><span class="o">.</span><span class="na">next</span><span class="o">();</span>
-      <span class="o">}</span>
-
-      <span class="k">if</span><span class="o">(</span><span class="n">sum</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
-        <span class="c1">//returning emtpy will cause the CFM to delete the key in Fluo's table</span>
-        <span class="k">return</span> <span class="n">Optional</span><span class="o">.</span><span class="na">empty</span><span class="o">();</span>
-      <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
-        <span class="k">return</span> <span class="n">Optional</span><span class="o">.</span><span class="na">of</span><span class="o">(</span><span class="n">sum</span><span class="o">);</span>
-      <span class="o">}</span>
-    <span class="o">}</span>
-  <span class="o">}</span>
-
-  <span class="cm">/**
-   * The {@link CollisionFreeMap} Observer will call this class when the counts for a word change.
-   */</span>
-  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">WordObserver</span> <span class="kd">extends</span> <span class="n">UpdateObserver</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="o">{</span>
-    <span class="nd">@Override</span>
-    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">updatingValues</span><span class="o">(</span><span class="n">TransactionBase</span> <span class="n">tx</span><span class="o">,</span> <span class="n">Iterator</span><span class="o">&lt;</span><span class="n">Update</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;&gt;</span> <span class="n">updates</span><span class="o">)</s [...]
-      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"== begin CFM updates =="</span><span class="o">);</span>  <span class="c1">//this print to show per bucket processing</span>
-      <span class="k">while</span><span class="o">(</span><span class="n">updates</span><span class="o">.</span><span class="na">hasNext</span><span class="o">())</span> <span class="o">{</span>
-        <span class="n">Update</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">u</span> <span class="o">=</span> <span class="n">updates</span><span class="o">.</span><span class="na">next</span><span class="o">();</span>
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">WordCountChangeObserver</span> <span class="kd">implements</span> <span class="n">ChangeObserver</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="o">{</span>
 
-        <span class="kt">long</span> <span class="n">oldCount</span> <span class="o">=</span> <span class="n">u</span><span class="o">.</span><span class="na">getOldValue</span><span class="o">().</span><span class="na">orElse</span><span class="o">(</span><span class="mi">0</span><span class="n">l</span><span class="o">);</span>
-        <span class="kt">long</span> <span class="n">newCount</span> <span class="o">=</span> <span class="n">u</span><span class="o">.</span><span class="na">getNewValue</span><span class="o">().</span><span class="na">orElse</span><span class="o">(</span><span class="mi">0</span><span class="n">l</span><span class="o">);</span>
+  <span class="nd">@Override</span>
+  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">TransactionBase</span> <span class="n">tx</span><span class="o">,</span> <span class="n">Iterable</span><span class="o">&lt;</span><span class="n">Change</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;&gt;</span> <span class="n">changes</span><span class="o">)</span> <spa [...]
+    <span class="c1">// This print shows per bucket processing.</span>
+    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"== begin processing word count changes =="</span><span class="o">);</span>
 
-        <span class="c1">//create an inverted index of word counts</span>
-        <span class="k">if</span><span class="o">(</span><span class="n">u</span><span class="o">.</span><span class="na">getOldValue</span><span class="o">().</span><span class="na">isPresent</span><span class="o">())</span> <span class="o">{</span>
-          <span class="n">tx</span><span class="o">.</span><span class="na">delete</span><span class="o">(</span><span class="n">String</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">"ic:%06d:%s"</span><span class="o">,</span> <span class="n">oldCount</span><span class="o">,</span> <span class="n">u</span><span class="o">.</span><span class="na">getKey</span><span class="o">()),</span> <span class="n">WORD_COUNT</span><span class="o">) [...]
-        <span class="o">}</span>
+    <span class="k">for</span> <span class="o">(</span><span class="n">Change</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">change</span> <span class="o">:</span> <span class="n">changes</span><span class="o">)</span> <span class="o">{</span>
 
-        <span class="k">if</span><span class="o">(</span><span class="n">u</span><span class="o">.</span><span class="na">getNewValue</span><span class="o">().</span><span class="na">isPresent</span><span class="o">())</span> <span class="o">{</span>
-          <span class="n">tx</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">String</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">"ic:%06d:%s"</span><span class="o">,</span> <span class="n">newCount</span><span class="o">,</span> <span class="n">u</span><span class="o">.</span><span class="na">getKey</span><span class="o">()),</span> <span class="n">WORD_COUNT</span><span class="o">,</s [...]
-        <span class="o">}</span>
+      <span class="kt">long</span> <span class="n">oldCount</span> <span class="o">=</span> <span class="n">change</span><span class="o">.</span><span class="na">getOldValue</span><span class="o">().</span><span class="na">orElse</span><span class="o">(</span><span class="mi">0</span><span class="n">l</span><span class="o">);</span>  <span class="c1">//previous count for a word</span>
+      <span class="kt">long</span> <span class="n">newCount</span> <span class="o">=</span> <span class="n">change</span><span class="o">.</span><span class="na">getNewValue</span><span class="o">().</span><span class="na">orElse</span><span class="o">(</span><span class="mi">0</span><span class="n">l</span><span class="o">);</span>  <span class="c1">//new count for a word</span>
 
-        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">printf</span><span class="o">(</span><span class="s">"  update %s %d -&gt; %d\n"</span><span class="o">,</span> <span class="n">u</span><span class="o">.</span><span class="na">getKey</span><span class="o">(),</span> <span class="n">oldCount</span> <span class="o">,</span> <span class="n">newCount</span><span class="o">);</span>
+      <span class="k">if</span> <span class="o">(</span><span class="n">change</span><span class="o">.</span><span class="na">getOldValue</span><span class="o">().</span><span class="na">isPresent</span><span class="o">())</span> <span class="o">{</span>
+        <span class="c1">// delete old count for word from inverted index</span>
+        <span class="n">tx</span><span class="o">.</span><span class="na">delete</span><span class="o">(</span><span class="n">String</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">"ic:%06d:%s"</span><span class="o">,</span> <span class="n">oldCount</span><span class="o">,</span> <span class="n">change</span><span class="o">.</span><span class="na">getKey</span><span class="o">()),</span> <span class="n">WORD_COUNT</span><span class="o [...]
       <span class="o">}</span>
-      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"== end CFM updates =="</span><span class="o">);</span>
-    <span class="o">}</span>
-  <span class="o">}</span>
-
-  <span class="cm">/**
-   * Code to setup a CFM's Observer and configure it to call your functions.
-   */</span>
-  <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">configure</span><span class="o">(</span><span class="n">FluoConfiguration</span> <span class="n">fluoConfig</span><span class="o">,</span> <span class="kt">int</span> <span class="n">numBuckets</span><span class="o">)</span> <span class="o">{</span>
-    <span class="n">CollisionFreeMap</span><span class="o">.</span><span class="na">configure</span><span class="o">(</span><span class="n">fluoConfig</span><span class="o">,</span> <span class="k">new</span> <span class="n">CollisionFreeMap</span><span class="o">.</span><span class="na">Options</span><span class="o">(</span><span class="s">"wc"</span><span class="o">,</span> <span class="n">LongCombiner</span><span class="o">.</span><span class="na">class</span><span class="o">,</span>
-        <span class="n">WordObserver</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="n">String</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="n">Long</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="mi">3</span><span class="o">));</span>
-  <span class="o">}</span>
-
-  <span class="kd">private</span> <span class="n">CollisionFreeMap</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">cfm</span><span class="o">;</span>
-
-  <span class="n">WordCounter</span><span class="o">(</span><span class="n">SimpleConfiguration</span> <span class="n">appConfig</span><span class="o">){</span>
-    <span class="n">cfm</span> <span class="o">=</span> <span class="n">CollisionFreeMap</span><span class="o">.</span><span class="na">getInstance</span><span class="o">(</span><span class="s">"wc"</span><span class="o">,</span> <span class="n">appConfig</span><span class="o">);</span>
-  <span class="o">}</span>
 
-  <span class="cm">/**
-   * This method will queue updates for each word to be processed later by the CFM Observer.
-   */</span>
-  <span class="kt">void</span> <span class="nf">adjustCounts</span><span class="o">(</span><span class="n">TransactionBase</span> <span class="n">tx</span><span class="o">,</span> <span class="kt">int</span> <span class="n">delta</span><span class="o">,</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">words</span><span class="o">){</span>
-    <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">wcUpdates</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashMap</span><span class="o">&lt;&gt;();</span>
+      <span class="k">if</span> <span class="o">(</span><span class="n">change</span><span class="o">.</span><span class="na">getNewValue</span><span class="o">().</span><span class="na">isPresent</span><span class="o">())</span> <span class="o">{</span>
+        <span class="c1">// insert new count for word into inverted index</span>
+        <span class="n">tx</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">String</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">"ic:%06d:%s"</span><span class="o">,</span> <span class="n">newCount</span><span class="o">,</span> <span class="n">change</span><span class="o">.</span><span class="na">getKey</span><span class="o">()),</span> <span class="n">WORD_COUNT</span><span class="o">, [...]
+      <span class="o">}</span>
 
-    <span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">word</span> <span class="o">:</span> <span class="n">words</span><span class="o">)</span> <span class="o">{</span>
-      <span class="n">wcUpdates</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">word</span><span class="o">,</span> <span class="o">(</span><span class="kt">long</span><span class="o">)</span><span class="n">delta</span><span class="o">);</span>
+      <span class="c1">// change.getKey() is a word</span>
+      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">printf</span><span class="o">(</span><span class="s">"  update %s %d -&gt; %d\n"</span><span class="o">,</span> <span class="n">change</span><span class="o">.</span><span class="na">getKey</span><span class="o">(),</span> <span class="n">oldCount</span><span class="o">,</span> <span class="n">newCount</span><span class="o">);</span>
     <span class="o">}</span>
 
-    <span class="n">cfm</span><span class="o">.</span><span class="na">update</span><span class="o">(</span><span class="n">tx</span><span class="o">,</span> <span class="n">wcUpdates</span><span class="o">);</span>
+    <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"== end processing word count changes =="</span><span class="o">);</span>
   <span class="o">}</span>
 <span class="o">}</span>
 </code></pre>
@@ -619,42 +558,60 @@ call them.</p>
 
 <p>Then modify <code class="highlighter-rouge">preInit()</code> in <code class="highlighter-rouge">Main</code> to the following.</p>
 
-<div class="language-java highlighter-rouge"><pre class="highlight"><code>  <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">preInit</span><span class="o">(</span><span class="n">FluoConfiguration</span> <span class="n">fluoConfig</span><span class="o">)</span> <span class="o">{</span>
-    <span class="n">fluoConfig</span><span class="o">.</span><span class="na">addObserver</span><span class="o">(</span><span class="k">new</span> <span class="n">ObserverSpecification</span><span class="o">(</span><span class="n">ContentObserver</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getName</span><span class="o">()));</span>
-    <span class="n">WordCounter</span><span class="o">.</span><span class="na">configure</span><span class="o">(</span><span class="n">fluoConfig</span><span class="o">,</span> <span class="mi">3</span><span class="o">);</span>
+<div class="language-java highlighter-rouge"><pre class="highlight"><code>  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">TourObserverProvider</span> <span class="kd">implements</span> <span class="n">ObserverProvider</span> <span class="o">{</span>
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">provide</span><span class="o">(</span><span class="n">Registry</span> <span class="n">obsRegistry</span><span class="o">,</span> <span class="n">Context</span> <span class="n">ctx</span><span class="o">)</span> <span class="o">{</span>
+      <span class="n">CombineQueue</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">wordCQ</span> <span class="o">=</span> <span class="n">CombineQueue</span><span class="o">.</span><span class="na">getInstance</span><span class="o">(</span><span class="s">"wc"</span><span class="o">,</span> <span class="n">ctx</span><span class="o">.</span><span class="na">getAppConfiguration</sp [...]
+
+      <span class="c1">// Pass the word count combine queue to the ContentObserver so it can queue updates </span>
+      <span class="c1">// when a documents word counts change.</span>
+      <span class="n">obsRegistry</span><span class="o">.</span><span class="na">forColumn</span><span class="o">(</span><span class="n">DocLoader</span><span class="o">.</span><span class="na">REF_STATUS_COL</span><span class="o">,</span> <span class="n">NotificationType</span><span class="o">.</span><span class="na">STRONG</span><span class="o">)</span>
+          <span class="o">.</span><span class="na">useObserver</span><span class="o">(</span><span class="k">new</span> <span class="n">ContentObserver</span><span class="o">(</span><span class="n">wordCQ</span><span class="o">));</span>
+
+      <span class="c1">// Register observer to process queued updates, the observer will call the two functions.</span>
+      <span class="c1">// SummingCombiner is provided by Fluo Recipes.  It sums all updates queued for a key.</span>
+      <span class="n">wordCQ</span><span class="o">.</span><span class="na">registerObserver</span><span class="o">(</span><span class="n">obsRegistry</span><span class="o">,</span> <span class="k">new</span> <span class="n">SummingCombiner</span><span class="o">&lt;&gt;(),</span> <span class="k">new</span> <span class="n">WordCountChangeObserver</span><span class="o">());</span>
+    <span class="o">}</span>
+  <span class="o">}</span>
+
+  <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">preInit</span><span class="o">(</span><span class="n">FluoConfiguration</span> <span class="n">fluoConfig</span><span class="o">)</span> <span class="o">{</span>
+    <span class="n">fluoConfig</span><span class="o">.</span><span class="na">setObserverProvider</span><span class="o">(</span><span class="n">TourObserverProvider</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
+    <span class="n">CombineQueue</span><span class="o">.</span><span class="na">configure</span><span class="o">(</span><span class="s">"wc"</span><span class="o">).</span><span class="na">keyType</span><span class="o">(</span><span class="n">String</span><span class="o">.</span><span class="na">class</span><span class="o">).</span><span class="na">valueType</span><span class="o">(</span><span class="n">Long</span><span class="o">.</span><span class="na">class</span><span class="o">).</s [...]
+        <span class="o">.</span><span class="na">save</span><span class="o">(</span><span class="n">fluoConfig</span><span class="o">);</span>
   <span class="o">}</span>
 </code></pre>
 </div>
 
-<p>After that add the following <code class="highlighter-rouge">init()</code> method to <code class="highlighter-rouge">ContentObserver</code> and modify <code class="highlighter-rouge">adjustCounts()</code> to the
+<p>Add a constuctor to <code class="highlighter-rouge">ContentObserver</code> and modify <code class="highlighter-rouge">adjustCounts()</code> to the
 following.</p>
 
-<div class="language-java highlighter-rouge"><pre class="highlight"><code>  <span class="kd">private</span> <span class="n">WordCounter</span> <span class="n">wordCounter</span><span class="o">;</span>
+<div class="language-java highlighter-rouge"><pre class="highlight"><code>
+  <span class="kd">private</span> <span class="n">CombineQueue</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">wordCQ</span><span class="o">;</span>
 
-  <span class="nd">@Override</span>
-  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="n">Context</span> <span class="n">context</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
-    <span class="c1">//get an instance of the CFM based on application config</span>
-    <span class="n">wordCounter</span> <span class="o">=</span> <span class="k">new</span> <span class="n">WordCounter</span><span class="o">(</span><span class="n">context</span><span class="o">.</span><span class="na">getAppConfiguration</span><span class="o">());</span>
+  <span class="kd">public</span> <span class="nf">ContentObserver</span><span class="o">(</span><span class="n">CombineQueue</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">wordCQ</span><span class="o">)</span> <span class="o">{</span>
+    <span class="k">this</span><span class="o">.</span><span class="na">wordCQ</span> <span class="o">=</span> <span class="n">wordCQ</span><span class="o">;</span>
   <span class="o">}</span>
 
   <span class="kd">private</span> <span class="kt">void</span> <span class="nf">adjustCounts</span><span class="o">(</span><span class="n">TransactionBase</span> <span class="n">tx</span><span class="o">,</span> <span class="kt">int</span> <span class="n">delta</span><span class="o">,</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">words</span><span class="o">)</span> <span class="o">{</span>
-    <span class="n">wordCounter</span><span class="o">.</span><span class="na">adjustCounts</span><span class="o">(</span><span class="n">tx</span><span class="o">,</span> <span class="n">delta</span><span class="o">,</span> <span class="n">words</span><span class="o">);</span>
+    <span class="n">HashMap</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">Long</span><span class="o">&gt;</span> <span class="n">wcUpdates</span> <span class="o">=</span> <span class="k">new</span> <span class="n">HashMap</span><span class="o">&lt;&gt;();</span>
+    <span class="n">words</span><span class="o">.</span><span class="na">forEach</span><span class="o">(</span><span class="n">word</span> <span class="o">-&gt;</span> <span class="n">wcUpdates</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">word</span><span class="o">,</span> <span class="o">(</span><span class="kt">long</span><span class="o">)</span> <span class="n">delta</span><span class="o">));</span>
+    <span class="n">wordCQ</span><span class="o">.</span><span class="na">addAll</span><span class="o">(</span><span class="n">tx</span><span class="o">,</span> <span class="n">wcUpdates</span><span class="o">);</span>
   <span class="o">}</span>
 </code></pre>
 </div>
 
-<p>The CFM groups key values into buckets for efficiency and processes the updates for entire bucket in
-a single transaction.  When you run this new code, that is why <code class="highlighter-rouge">== begin CFM updates ==</code> is seen at
-least three times for each group of documents loaded.</p>
+<p>A CombineQueue  groups key values into buckets for efficiency and processes entire buckets in
+a single transaction.  When you run this code, that is why <code class="highlighter-rouge">== begin processing word count changes ==</code> is seen 
+multiple times for each group of documents loaded.</p>
 
-<p>When you run this example you will also notice two new prefixes in the output of the table scan.  First
-the <code class="highlighter-rouge">wc:</code> prefix is where the CFM stores its data.  By default the CFM uses Kryo for serialization
+<p>These changes produce two new prefixes in the output of the table scan.  First
+the <code class="highlighter-rouge">wc:</code> prefix is where the CombineQueue stores its data.  By default the CombineQueue uses Kryo for serialization
 and therefore the key values with this prefix contain non-ASCII characters.  The utility function
 <code class="highlighter-rouge">FluoITHelper.printFluoTable()</code> escapes non-ASCII characters with <code class="highlighter-rouge">\x&lt;HEX&gt;</code>.   Second the <code class="highlighter-rouge">ic:</code>
-prefix contains an inverted index of word counts.  This was created simply to show an example of a
+prefix contains the inverted index of word counts.  This was created simply to show an example of a
 follow on action when word counts change.  Ideally this follow on action would have a low chance of
 collisions.  Creating the inverted index will not cause collisions because each word is in a single
-CFM bucket and each bucket is processed independently.</p>
+CombineQueue bucket and each bucket is processed independently.</p>
 
 <h2 id="part-4--running-this-example-on-a-real-instance">Part 4 : Running this example on a real instance.</h2>
 
diff --git a/tour/mem-self-ntfy-code/index.html b/tour/mem-self-ntfy-code/index.html
index 2c0c3c0..6f693c2 100644
--- a/tour/mem-self-ntfy-code/index.html
+++ b/tour/mem-self-ntfy-code/index.html
@@ -116,42 +116,33 @@
   <span class="kd">static</span> <span class="n">Column</span> <span class="n">UPDATE_COL</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"sum"</span><span class="o">,</span> <span class="s">"update"</span><span class="o">);</span>
   <span class="kd">static</span> <span class="n">Column</span> <span class="n">CONTINUE_COL</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"sum"</span><span class="o">,</span> <span class="s">"continue"</span><span class="o">);</span>
 
-  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">SummingObserver</span> <span class="kd">extends</span> <span class="n">AbstractObserver</span> <span class="o">{</span>
+  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">SummingObserver</span> <span class="kd">implements</span> <span class="n">StringObserver</span> <span class="o">{</span>
 
     <span class="kd">private</span> <span class="kt">int</span> <span class="n">maxToProcess</span><span class="o">;</span>
 
-    <span class="nd">@Override</span>
-    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="n">Context</span> <span class="n">context</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
-      <span class="c1">//made the max amount to process in a single transaction configurable</span>
-      <span class="n">maxToProcess</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getObserverConfiguration</span><span class="o">().</span><span class="na">getInt</span><span class="o">(</span><span class="s">"maxToProcess"</span><span class="o">,</span> <span class="mi">100</span><span class="o">);</span>
-    <span class="o">}</span>
-
-    <span class="nd">@Override</span>
-    <span class="kd">public</span> <span class="n">ObservedColumn</span> <span class="nf">getObservedColumn</span><span class="o">()</span> <span class="o">{</span>
-      <span class="k">return</span> <span class="k">new</span> <span class="nf">ObservedColumn</span><span class="o">(</span><span class="n">NC</span><span class="o">,</span> <span class="n">NotificationType</span><span class="o">.</span><span class="na">WEAK</span><span class="o">);</span>
+    <span class="n">SummingObserver</span><span class="o">(</span><span class="kt">int</span> <span class="n">maxToProcess</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">maxToProcess</span> <span class="o">=</span> <span class="n">maxToProcess</span><span class="o">;</span>
     <span class="o">}</span>
 
     <span class="nd">@Override</span>
-    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">TransactionBase</span> <span class="n">tx</span><span class="o">,</span> <span class="n">Bytes</span> <span class="n">brow</span><span class="o">,</span> <span class="n">Column</span> <span class="n">col</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
-
-      <span class="n">String</span> <span class="n">row</span> <span class="o">=</span> <span class="n">brow</span><span class="o">.</span><span class="na">toString</span><span class="o">();</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">TransactionBase</span> <span class="n">tx</span><span class="o">,</span> <span class="n">String</span> <span class="n">row</span><span class="o">,</span> <span class="n">Column</span> <span class="n">col</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
 
       <span class="n">Map</span><span class="o">&lt;</span><span class="n">Column</span><span class="o">,</span> <span class="n">String</span><span class="o">&gt;</span> <span class="n">colVals</span> <span class="o">=</span> <span class="n">tx</span><span class="o">.</span><span class="na">gets</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">TOTAL_COL</span><span class="o">,</span> <span class="n">CONTINUE_COL</span><span class="o">);</span>
 
       <span class="kt">int</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">colVals</span><span class="o">.</span><span class="na">getOrDefault</span><span class="o">(</span><span class="n">TOTAL_COL</span><span class="o">,</span> <span class="s">"0"</span><span class="o">));</span>
-      
+
       <span class="c1">// construct a scan range that uses the continue row</span>
       <span class="n">String</span> <span class="n">startRow</span> <span class="o">=</span> <span class="n">colVals</span><span class="o">.</span><span class="na">getOrDefault</span><span class="o">(</span><span class="n">CONTINUE_COL</span><span class="o">,</span> <span class="n">row</span> <span class="o">+</span> <span class="s">"/"</span><span class="o">);</span>
       <span class="n">String</span> <span class="n">endRow</span> <span class="o">=</span> <span class="n">row</span> <span class="o">+</span> <span class="s">"/:"</span><span class="o">;</span> <span class="c1">// after the character '9' comes ':'</span>
       <span class="n">CellScanner</span> <span class="n">scanner</span> <span class="o">=</span> <span class="n">tx</span><span class="o">.</span><span class="na">scanner</span><span class="o">().</span><span class="na">over</span><span class="o">(</span><span class="k">new</span> <span class="n">Span</span><span class="o">(</span><span class="n">startRow</span><span class="o">,</span> <span class="kc">true</span><span class="o">,</span> <span class="n">endRow</span><span class="o">,</sp [...]
 
       <span class="kt">int</span> <span class="n">processed</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
-      
+
       <span class="k">for</span> <span class="o">(</span><span class="n">RowColumnValue</span> <span class="n">rcv</span> <span class="o">:</span> <span class="n">scanner</span><span class="o">)</span> <span class="o">{</span>
         <span class="k">if</span> <span class="o">(</span><span class="n">processed</span> <span class="o">&gt;=</span> <span class="n">maxToProcess</span><span class="o">)</span> <span class="o">{</span>
           <span class="c1">// stop processing and set the continue row</span>
           <span class="n">tx</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">CONTINUE_COL</span><span class="o">,</span> <span class="n">rcv</span><span class="o">.</span><span class="na">getsRow</span><span class="o">());</span>
-          <span class="n">tx</span><span class="o">.</span><span class="na">setWeakNotification</span><span class="o">(</span><span class="n">brow</span><span class="o">,</span> <span class="n">col</span><span class="o">);</span>
+          <span class="n">tx</span><span class="o">.</span><span class="na">setWeakNotification</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">col</span><span class="o">);</span>
           <span class="k">break</span><span class="o">;</span>
         <span class="o">}</span>
         <span class="n">sum</span> <span class="o">+=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">rcv</span><span class="o">.</span><span class="na">getsValue</span><span class="o">());</span>
@@ -168,15 +159,23 @@
         <span class="n">tx</span><span class="o">.</span><span class="na">delete</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">CONTINUE_COL</span><span class="o">);</span>
         <span class="c1">// need to start over at the beginning and see if there is new data before the continue</span>
         <span class="c1">// column</span>
-        <span class="n">tx</span><span class="o">.</span><span class="na">setWeakNotification</span><span class="o">(</span><span class="n">brow</span><span class="o">,</span> <span class="n">col</span><span class="o">);</span>
+        <span class="n">tx</span><span class="o">.</span><span class="na">setWeakNotification</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">col</span><span class="o">);</span>
       <span class="o">}</span>
     <span class="o">}</span>
   <span class="o">}</span>
 
+  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">TourObserverProvider</span> <span class="kd">implements</span> <span class="n">ObserverProvider</span> <span class="o">{</span>
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">provide</span><span class="o">(</span><span class="n">Registry</span> <span class="n">obsRegistry</span><span class="o">,</span> <span class="n">Context</span> <span class="n">ctx</span><span class="o">)</span> <span class="o">{</span>
+      <span class="kt">int</span> <span class="n">maxToProcess</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="na">getAppConfiguration</span><span class="o">().</span><span class="na">getInt</span><span class="o">(</span><span class="s">"maxToProcess"</span><span class="o">);</span>
+      <span class="n">obsRegistry</span><span class="o">.</span><span class="na">forColumn</span><span class="o">(</span><span class="n">NC</span><span class="o">,</span> <span class="n">NotificationType</span><span class="o">.</span><span class="na">WEAK</span><span class="o">)</span>
+          <span class="o">.</span><span class="na">useObserver</span><span class="o">(</span><span class="k">new</span> <span class="n">SummingObserver</span><span class="o">(</span><span class="n">maxToProcess</span><span class="o">));</span>
+    <span class="o">}</span>
+  <span class="o">}</span>
+
   <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">preInit</span><span class="o">(</span><span class="n">FluoConfiguration</span> <span class="n">fluoConfig</span><span class="o">)</span> <span class="o">{</span>
-    <span class="n">ObserverSpecification</span> <span class="n">ospec</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ObserverSpecification</span><span class="o">(</span><span class="n">SummingObserver</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getName</span><span class="o">());</span>
-    <span class="n">ospec</span><span class="o">.</span><span class="na">getConfiguration</span><span class="o">().</span><span class="na">setProperty</span><span class="o">(</span><span class="s">"maxToProcess"</span><span class="o">,</span> <span class="mi">500</span><span class="o">);</span>
-    <span class="n">fluoConfig</span><span class="o">.</span><span class="na">addObserver</span><span class="o">(</span><span class="n">ospec</span><span class="o">);</span>
+    <span class="n">fluoConfig</span><span class="o">.</span><span class="na">getAppConfiguration</span><span class="o">().</span><span class="na">setProperty</span><span class="o">(</span><span class="s">"maxToProcess"</span><span class="o">,</span> <span class="mi">500</span><span class="o">);</span>
+    <span class="n">fluoConfig</span><span class="o">.</span><span class="na">setObserverProvider</span><span class="o">(</span><span class="n">TourObserverProvider</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
   <span class="o">}</span>
 
   <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">exercise</span><span class="o">(</span><span class="n">MiniFluo</span> <span class="n">mini</span><span class="o">,</span> <span class="n">FluoClient</span> <span class="n">client</span><span class="o">)</span> <span class="o">{</span>
diff --git a/tour/observer_example/index.html b/tour/observer_example/index.html
index 8672872..3c82f96 100644
--- a/tour/observer_example/index.html
+++ b/tour/observer_example/index.html
@@ -114,43 +114,47 @@
   <p>The following code shows how to setup and trigger an observer.  The observer is triggered when the
 column <em>obs:data</em> is changed.</p>
 
-<div class="language-java highlighter-rouge"><pre class="highlight"><code>  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Column</span> <span class="n">OBSERVED_COL</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"obs"</span><span class="o">,</span><span class="s">"data"</span><span class="o">);</span>
-  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Column</span> <span class="n">INVERT_COL</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"inv"</span><span class="o">,</span><span class="s">"data"</span><span class="o">);</span>
+<div class="language-java highlighter-rouge"><pre class="highlight"><code>  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Column</span> <span class="n">OBSERVED_COL</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"obs"</span><span class="o">,</span> <span class="s">"data"</span><span class="o">);</span>
+  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Column</span> <span class="n">INVERT_COL</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"inv"</span><span class="o">,</span> <span class="s">"data"</span><span class="o">);</span>
 
-  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">MyObserver</span> <span class="kd">extends</span> <span class="n">AbstractObserver</span> <span class="o">{</span>
+  <span class="c1">// This class is responsible for registering Observers for all observed columns.</span>
+  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">MyObserverProvider</span> <span class="kd">implements</span> <span class="n">ObserverProvider</span> <span class="o">{</span>
 
     <span class="nd">@Override</span>
-    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">TransactionBase</span> <span class="n">tx</span><span class="o">,</span> <span class="n">Bytes</span> <span class="n">row</span><span class="o">,</span> <span class="n">Column</span> <span class="n">col</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
-      <span class="c1">//invert column and value</span>
-      <span class="n">Bytes</span> <span class="n">value</span> <span class="o">=</span> <span class="n">tx</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">col</span><span class="o">);</span>
-      <span class="n">tx</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">value</span><span class="o">,</span> <span class="n">INVERT_COL</span><span class="o">,</span> <span class="n">row</span><span class="o">);</span>
-    <span class="o">}</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">provide</span><span class="o">(</span><span class="n">Registry</span> <span class="n">obsRegistry</span><span class="o">,</span> <span class="n">Context</span> <span class="n">ctx</span><span class="o">)</span> <span class="o">{</span>
 
-    <span class="nd">@Override</span>
-    <span class="kd">public</span> <span class="n">ObservedColumn</span> <span class="nf">getObservedColumn</span><span class="o">()</span> <span class="o">{</span>
-      <span class="k">return</span> <span class="k">new</span> <span class="nf">ObservedColumn</span><span class="o">(</span><span class="n">OBSERVED_COL</span><span class="o">,</span> <span class="n">NotificationType</span><span class="o">.</span><span class="na">STRONG</span><span class="o">);</span>
+      <span class="c1">// Observer is a functional interface allowing Observers to be lambdas</span>
+      <span class="n">Observer</span> <span class="n">invObserver</span> <span class="o">=</span> <span class="o">(</span><span class="n">tx</span><span class="o">,</span> <span class="n">row</span><span class="o">,</span> <span class="n">col</span><span class="o">)</span> <span class="o">-&gt;</span> <span class="o">{</span>
+        <span class="n">Bytes</span> <span class="n">value</span> <span class="o">=</span> <span class="n">tx</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">col</span><span class="o">);</span>
+        <span class="n">tx</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">value</span><span class="o">,</span> <span class="n">INVERT_COL</span><span class="o">,</span> <span class="n">row</span><span class="o">);</span>
+      <span class="o">};</span>
+
+      <span class="c1">// Register an observer to process notifications for the column obs:data</span>
+      <span class="n">obsRegistry</span><span class="o">.</span><span class="na">forColumn</span><span class="o">(</span><span class="n">OBSERVED_COL</span><span class="o">,</span> <span class="n">NotificationType</span><span class="o">.</span><span class="na">STRONG</span><span class="o">).</span><span class="na">useObserver</span><span class="o">(</span><span class="n">invObserver</span><span class="o">);</span>
     <span class="o">}</span>
+
   <span class="o">}</span>
 
   <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">preInit</span><span class="o">(</span><span class="n">FluoConfiguration</span> <span class="n">fluoConfig</span><span class="o">)</span> <span class="o">{</span>
-    <span class="c1">//configure Fluo to use MyObserver before initialization</span>
-    <span class="n">fluoConfig</span><span class="o">.</span><span class="na">addObserver</span><span class="o">(</span><span class="k">new</span> <span class="n">ObserverSpecification</span><span class="o">(</span><span class="n">MyObserver</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getName</span><span class="o">()));</span>
+    <span class="c1">// Configure ObserverProvider before initialization. Workers will instantiate this class and use</span>
+    <span class="c1">// it to create Observers.</span>
+    <span class="n">fluoConfig</span><span class="o">.</span><span class="na">setObserverProvider</span><span class="o">(</span><span class="n">MyObserverProvider</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
   <span class="o">}</span>
 
   <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">exercise</span><span class="o">(</span><span class="n">MiniFluo</span> <span class="n">mini</span><span class="o">,</span> <span class="n">FluoClient</span> <span class="n">client</span><span class="o">)</span> <span class="o">{</span>
-    <span class="k">try</span><span class="o">(</span><span class="n">Transaction</span> <span class="n">tx1</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">newTransaction</span><span class="o">())</span> <span class="o">{</span>
+    <span class="k">try</span> <span class="o">(</span><span class="n">Transaction</span> <span class="n">tx1</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">newTransaction</span><span class="o">())</span> <span class="o">{</span>
       <span class="n">tx1</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="s">"kerbalnaut0001"</span><span class="o">,</span> <span class="n">OBSERVED_COL</span><span class="o">,</span> <span class="s">"Jebediah"</span><span class="o">);</span>
       <span class="n">tx1</span><span class="o">.</span><span class="na">commit</span><span class="o">();</span>
     <span class="o">}</span>
 
-    <span class="k">try</span><span class="o">(</span><span class="n">Transaction</span> <span class="n">tx2</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">newTransaction</span><span class="o">())</span> <span class="o">{</span>
+    <span class="k">try</span> <span class="o">(</span><span class="n">Transaction</span> <span class="n">tx2</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">newTransaction</span><span class="o">())</span> <span class="o">{</span>
       <span class="n">tx2</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="s">"kerbalnaut0002"</span><span class="o">,</span> <span class="n">OBSERVED_COL</span><span class="o">,</span> <span class="s">"Bill"</span><span class="o">);</span>
       <span class="n">tx2</span><span class="o">.</span><span class="na">commit</span><span class="o">();</span>
     <span class="o">}</span>
 
     <span class="n">mini</span><span class="o">.</span><span class="na">waitForObservers</span><span class="o">();</span>
 
-    <span class="k">try</span><span class="o">(</span><span class="n">Snapshot</span> <span class="n">snap</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">newSnapshot</span><span class="o">())</span> <span class="o">{</span>
+    <span class="k">try</span> <span class="o">(</span><span class="n">Snapshot</span> <span class="n">snap</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">newSnapshot</span><span class="o">())</span> <span class="o">{</span>
       <span class="n">snap</span><span class="o">.</span><span class="na">scanner</span><span class="o">().</span><span class="na">build</span><span class="o">().</span><span class="na">forEach</span><span class="o">(</span><span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">::</span><span class="n">println</span><span class="o">);</span>
     <span class="o">}</span>
   <span class="o">}</span>
diff --git a/tour/observers/index.html b/tour/observers/index.html
index 62d13f3..7d3eed7 100644
--- a/tour/observers/index.html
+++ b/tour/observers/index.html
@@ -111,14 +111,13 @@
   <p class="text-muted">Tour page 17 of 26</p>
 </div>
 <div id="tour-content">
-  <p>Fluo supports complex processing by running user provided code in Observers. Observers are triggered
-by notifications. An Observer requests that the system run it when a certain column is modified. When
-another transaction modifies an observed column, it will persist a notification that later causes
-the Observer to run.  When an Observer is run, its provided with the row and column that caused it
-to run along with a transaction. Fluo worker processes running across a cluster will execute
-Observers.</p>
-
-<p>Since all transactions need to know which columns trigger observers, observers must be registered
+  <p>Fluo supports incremental processing with Observers and Notifications.  Notifications are persistent
+markers set by a transaction that indicate an Observer should run later for a certain row+column.
+Observers are user provided code that are registered to process notifications for a certain column. When
+an Observer is run, its provided with the row and column that caused it to run along with a
+transaction. Fluo worker processes running across a cluster will execute Observers.</p>
+
+<p>Since all transactions need to know which columns trigger Observers, Observers must be registered
 with Fluo at initialization time.</p>
 
 <p>Fluo supports two type of notifications :</p>
diff --git a/tour/snapshot-isolation/index.html b/tour/snapshot-isolation/index.html
index 2c8d9fe..b5d35cc 100644
--- a/tour/snapshot-isolation/index.html
+++ b/tour/snapshot-isolation/index.html
@@ -114,7 +114,7 @@
   <p>Fluo provides Snapshot isolation.  This means that a Transaction or Snapshot can only see data
 committed before it started.   The following steps demonstrate the concept of snapshot isolation. Try
 to code up the steps using Fluo, then run it and see if it prints what you expect.  If there is
-something you are unsure about, code for the following steps is on the next page.</p>
+something you are unsure about, code for the following steps are on the next page.</p>
 
 <ul>
   <li><strong>Create transaction</strong> <em>tx1</em></li>
diff --git a/tour/weak-code/index.html b/tour/weak-code/index.html
index 63adbab..cafc27e 100644
--- a/tour/weak-code/index.html
+++ b/tour/weak-code/index.html
@@ -115,45 +115,43 @@
   <span class="kd">static</span> <span class="n">Column</span> <span class="n">TOTAL_COL</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"sum"</span><span class="o">,</span> <span class="s">"total"</span><span class="o">);</span>
   <span class="kd">static</span> <span class="n">Column</span> <span class="n">UPDATE_COL</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Column</span><span class="o">(</span><span class="s">"sum"</span><span class="o">,</span> <span class="s">"update"</span><span class="o">);</span>
 
-  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">SummingObserver</span> <span class="kd">extends</span> <span class="n">AbstractObserver</span> <span class="o">{</span>
-
+  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">TourObserverProvider</span> <span class="kd">implements</span> <span class="n">ObserverProvider</span> <span class="o">{</span>
     <span class="nd">@Override</span>
-    <span class="kd">public</span> <span class="n">ObservedColumn</span> <span class="nf">getObservedColumn</span><span class="o">()</span> <span class="o">{</span>
-      <span class="k">return</span> <span class="k">new</span> <span class="nf">ObservedColumn</span><span class="o">(</span><span class="n">NC</span><span class="o">,</span> <span class="n">NotificationType</span><span class="o">.</span><span class="na">WEAK</span><span class="o">);</span>
-    <span class="o">}</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">provide</span><span class="o">(</span><span class="n">Registry</span> <span class="n">obsRegistry</span><span class="o">,</span> <span class="n">Context</span> <span class="n">ctx</span><span class="o">)</span> <span class="o">{</span>
 
-    <span class="nd">@Override</span>
-    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">process</span><span class="o">(</span><span class="n">TransactionBase</span> <span class="n">tx</span><span class="o">,</span> <span class="n">Bytes</span> <span class="n">brow</span><span class="o">,</span> <span class="n">Column</span> <span class="n">col</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+      <span class="c1">// Observers can be written as lambdas</span>
+      <span class="n">StringObserver</span> <span class="n">summingObs</span> <span class="o">=</span> <span class="o">(</span><span class="n">tx</span><span class="o">,</span> <span class="n">row</span><span class="o">,</span> <span class="n">col</span><span class="o">)</span> <span class="o">-&gt;</span> <span class="o">{</span>
+        <span class="kt">int</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">tx</span><span class="o">.</span><span class="na">gets</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">TOTAL_COL</span><span class="o">,</span> <span class="s">"0"</span><span class="o">));</span>
 
-      <span class="n">String</span> <span class="n">row</span> <span class="o">=</span> <span class="n">brow</span><span class="o">.</span><span class="na">toString</span><span class="o">();</span>
+        <span class="n">CellScanner</span> <span class="n">scanner</span> <span class="o">=</span> <span class="n">tx</span><span class="o">.</span><span class="na">scanner</span><span class="o">().</span><span class="na">over</span><span class="o">(</span><span class="n">Span</span><span class="o">.</span><span class="na">prefix</span><span class="o">(</span><span class="n">row</span> <span class="o">+</span> <span class="s">"/"</span><span class="o">)).</span><span class="na">build</sp [...]
+        <span class="k">for</span> <span class="o">(</span><span class="n">RowColumnValue</span> <span class="n">rcv</span> <span class="o">:</span> <span class="n">scanner</span><span class="o">)</span> <span class="o">{</span>
+          <span class="n">sum</span> <span class="o">+=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">rcv</span><span class="o">.</span><span class="na">getsValue</span><span class="o">());</span>
+          <span class="n">tx</span><span class="o">.</span><span class="na">delete</span><span class="o">(</span><span class="n">rcv</span><span class="o">.</span><span class="na">getRow</span><span class="o">(),</span> <span class="n">rcv</span><span class="o">.</span><span class="na">getColumn</span><span class="o">());</span>
+        <span class="o">}</span>
 
-      <span class="kt">int</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">tx</span><span class="o">.</span><span class="na">gets</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">TOTAL_COL</span><span class="o">,</span> <span class="s">"0"</span><span class="o">));</span>
-
-      <span class="n">CellScanner</span> <span class="n">scanner</span> <span class="o">=</span> <span class="n">tx</span><span class="o">.</span><span class="na">scanner</span><span class="o">().</span><span class="na">over</span><span class="o">(</span><span class="n">Span</span><span class="o">.</span><span class="na">prefix</span><span class="o">(</span><span class="n">row</span> <span class="o">+</span><span class="s">"/"</span><span class="o">)).</span><span class="na">build</span> [...]
-      <span class="k">for</span> <span class="o">(</span><span class="n">RowColumnValue</span> <span class="n">rcv</span> <span class="o">:</span> <span class="n">scanner</span><span class="o">)</span> <span class="o">{</span>
-        <span class="n">sum</span> <span class="o">+=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">rcv</span><span class="o">.</span><span class="na">getsValue</span><span class="o">());</span>
-        <span class="n">tx</span><span class="o">.</span><span class="na">delete</span><span class="o">(</span><span class="n">rcv</span><span class="o">.</span><span class="na">getRow</span><span class="o">(),</span> <span class="n">rcv</span><span class="o">.</span><span class="na">getColumn</span><span class="o">());</span>
-      <span class="o">}</span>
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"sum : "</span> <span class="o">+</span> <span class="n">sum</span><span class="o">);</span>
 
-      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"sum : "</span> <span class="o">+</span> <span class="n">sum</span><span class="o">);</span>
+        <span class="n">tx</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">TOTAL_COL</span><span class="o">,</span> <span class="s">""</span> <span class="o">+</span> <span class="n">sum</span><span class="o">);</span>
+      <span class="o">};</span>
 
-      <span class="n">tx</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">TOTAL_COL</span><span class="o">,</span> <span class="s">""</span><span class="o">+</span><span class="n">sum</span><span class="o">);</span>
+      <span class="n">obsRegistry</span><span class="o">.</span><span class="na">forColumn</span><span class="o">(</span><span class="n">NC</span><span class="o">,</span> <span class="n">NotificationType</span><span class="o">.</span><span class="na">WEAK</span><span class="o">).</span><span class="na">useObserver</span><span class="o">(</span><span class="n">summingObs</span><span class="o">);</span>
     <span class="o">}</span>
   <span class="o">}</span>
 
   <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">preInit</span><span class="o">(</span><span class="n">FluoConfiguration</span> <span class="n">fluoConfig</span><span class="o">)</span> <span class="o">{</span>
-    <span class="n">fluoConfig</span><span class="o">.</span><span class="na">addObserver</span><span class="o">(</span><span class="k">new</span> <span class="n">ObserverSpecification</span><span class="o">(</span><span class="n">SummingObserver</span><span class="o">.</span><span class="na">class</span><span class="o">.</span><span class="na">getName</span><span class="o">()));</span>
+    <span class="n">fluoConfig</span><span class="o">.</span><span class="na">setObserverProvider</span><span class="o">(</span><span class="n">TourObserverProvider</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
   <span class="o">}</span>
 
   <span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">exercise</span><span class="o">(</span><span class="n">MiniFluo</span> <span class="n">mini</span><span class="o">,</span> <span class="n">FluoClient</span> <span class="n">client</span><span class="o">)</span> <span class="o">{</span>
     <span class="k">try</span> <span class="o">(</span><span class="n">LoaderExecutor</span> <span class="n">le</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">newLoaderExecutor</span><span class="o">())</span> <span class="o">{</span>
       <span class="n">Random</span> <span class="n">r</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Random</span><span class="o">(</span><span class="mi">42</span><span class="o">);</span>
       <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">5000</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
-        <span class="c1">//The Loader interface only has one function and can therefore be written as a lambda below.</span>
+        <span class="c1">// The Loader interface only has one function and can therefore be written as a lambda</span>
+        <span class="c1">// below.</span>
         <span class="n">le</span><span class="o">.</span><span class="na">execute</span><span class="o">((</span><span class="n">tx</span><span class="o">,</span> <span class="n">ctx</span><span class="o">)</span> <span class="o">-&gt;</span> <span class="o">{</span>
-          <span class="n">String</span> <span class="n">row</span> <span class="o">=</span> <span class="s">"counter001/"</span><span class="o">+</span><span class="n">String</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">"%07d"</span><span class="o">,</span> <span class="n">r</span><span class="o">.</span><span class="na">nextInt</span><span class="o">(</span><span class="mi">10</span><span class="n">_000_000</span><span class="o">));</span>
+          <span class="n">String</span> <span class="n">row</span> <span class="o">=</span> <span class="s">"counter001/"</span> <span class="o">+</span> <span class="n">String</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">"%07d"</span><span class="o">,</span> <span class="n">r</span><span class="o">.</span><span class="na">nextInt</span><span class="o">(</span><span class="mi">10</span><span class="n">_000_000</span><span class="o">) [...]
           <span class="kt">int</span> <span class="n">curVal</span> <span class="o">=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">tx</span><span class="o">.</span><span class="na">gets</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">UPDATE_COL</span><span class="o">,</span> <span class="s">"0"</span><span class="o">));</span>
-          <span class="n">tx</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">UPDATE_COL</span><span class="o">,</span> <span class="n">curVal</span><span class="o">+</span><span class="mi">1</span><span class="o">+</span><span class="s">""</span><span class="o">);</span>
+          <span class="n">tx</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="n">row</span><span class="o">,</span> <span class="n">UPDATE_COL</span><span class="o">,</span> <span class="n">curVal</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">+</span> <span class="s">""</span><span class="o">);</span>
           <span class="n">tx</span><span class="o">.</span><span class="na">setWeakNotification</span><span class="o">(</span><span class="s">"counter001"</span><span class="o">,</span> <span class="n">NC</span><span class="o">);</span>
         <span class="o">});</span>
       <span class="o">}</span>
@@ -161,8 +159,8 @@
 
     <span class="n">mini</span><span class="o">.</span><span class="na">waitForObservers</span><span class="o">();</span>
 
-    <span class="k">try</span><span class="o">(</span><span class="n">Snapshot</span> <span class="n">snap</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">newSnapshot</span><span class="o">())</span> <span class="o">{</span>
-      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"final sum : "</span><span class="o">+</span><span class="n">snap</span><span class="o">.</span><span class="na">gets</span><span class="o">(</span><span class="s">"counter001"</span><span class="o">,</span> <span class="n">TOTAL_COL</span><span class="o">));</span>
+    <span class="k">try</span> <span class="o">(</span><span class="n">Snapshot</span> <span class="n">snap</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">newSnapshot</span><span class="o">())</span> <span class="o">{</span>
+      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"final sum : "</span> <span class="o">+</span> <span class="n">snap</span><span class="o">.</span><span class="na">gets</span><span class="o">(</span><span class="s">"counter001"</span><span class="o">,</span> <span class="n">TOTAL_COL</span><span class="o">));</span>
     <span class="o">}</span>
   <span class="o">}</span>
 </code></pre>
diff --git a/tour/write-skew/index.html b/tour/write-skew/index.html
index dd6c898..65aa367 100644
--- a/tour/write-skew/index.html
+++ b/tour/write-skew/index.html
@@ -113,7 +113,7 @@
 <div id="tour-content">
   <p>The page on collisions showed that if two transactions overlap and write the same data then one will
 fail.  However, in the case where two transactions overlap and one reads data that another is writing
-then both can succeed.  This behavior is called write skew.</p>
+both can succeed.  This behavior is called write skew.</p>
 
 <p>The example below shows write skew.  In the example, <em>n0</em> is a node in a tree with two children <em>n01</em>
 and <em>n02</em>.  In <em>tx2</em>, the sum of <em>n0</em> is set to the sum of its children.  However, <em>tx2</em> misses the
@@ -138,8 +138,7 @@ different keys.</p>
 <p>The changes made by <em>tx3</em> will not be seen by <em>tx2</em>. This behavior is OK if the update made by <em>tx3</em>
 triggers a later update of <em>n0:data:sum</em>. Later pages in the tour will show that Observers can work
 this way, so that eventually the changes made by <em>tx3</em> are incorporated.  The <a href="/tour/weak-notifications/">Weak Notification
-Exercise</a> later in the tour shows an example of an Observer that works
-like this.</p>
+Exercise</a> later in the tour shows an example of this.</p>
 
 </div>
 

-- 
To stop receiving notification emails like this one, please contact
['"commits@fluo.apache.org" <commits@fluo.apache.org>'].

Mime
View raw message