diff --git a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.C b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.C
index 9d4b8400c80a32c181fbe566eaf7d5e0e6e8a629..40d3ff5bf67862e8c4bc30aaf648c68f21aedcd5 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.C
+++ b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.C
@@ -79,8 +79,6 @@ void Foam::fieldValues::cellSource::setCellZoneCells()
     {
         case stCellZone:
         {
-            dict().lookup("sourceName") >> sourceName_;
-
             label zoneId = mesh().cellZones().findZoneID(sourceName_);
 
             if (zoneId < 0)
@@ -135,7 +133,8 @@ void Foam::fieldValues::cellSource::initialise(const dictionary& dict)
         WarningIn
         (
             "Foam::fieldValues::cellSource::initialise(const dictionary&)"
-        )   << type() << " " << name_ << ": "
+        )
+            << type() << " " << name_ << ": "
             << sourceTypeNames_[source_] << "(" << sourceName_ << "):" << nl
             << "    Source has no cells - deactivating" << endl;
 
@@ -145,44 +144,46 @@ void Foam::fieldValues::cellSource::initialise(const dictionary& dict)
 
     volume_ = volume();
 
-    Info<< type() << " " << name_ << ":"
-        << sourceTypeNames_[source_] << "(" << sourceName_ << "):" << nl
-        << "    total cells  = " << nCells_ << nl
-        << "    total volume = " << volume_
-        << nl << endl;
+    if (log_)
+    {
+        Info<< type() << " " << name_ << ":"
+            << sourceTypeNames_[source_] << "(" << sourceName_ << "):" << nl
+            << "    total cells  = " << nCells_ << nl
+            << "    total volume = " << volume_
+            << nl << endl;
+    }
 
     if (dict.readIfPresent("weightField", weightFieldName_))
     {
-        Info<< "    weight field = " << weightFieldName_;
+        if (log_) Info << "    weight field = " << weightFieldName_;
     }
 
-    Info<< nl << endl;
+    if (log_) Info << nl << endl;
 }
 
 
-void Foam::fieldValues::cellSource::writeFileHeader(const label i)
+void Foam::fieldValues::cellSource::writeFileHeader(Ostream& os) const
 {
-    writeCommented(file(), "Source : ");
-    file() << sourceTypeNames_[source_] << " " << sourceName_ << endl;
-    writeCommented(file(), "Cells  : ");
-    file() << nCells_ << endl;
-    writeCommented(file(), "Volume : ");
-    file() << volume_ << endl;
-
-    writeCommented(file(), "Time");
+    writeHeaderValue(os, "Source", sourceTypeNames_[source_]);
+    writeHeaderValue(os, "Name", sourceName_);
+    writeHeaderValue(os, "Cells", nCells_);
+    writeHeaderValue(os, "Volume", volume_);
+    writeHeaderValue(os, "Scale factor", scaleFactor_);
+
+
+    writeCommented(os, "Time");
     if (writeVolume_)
     {
-        file() << tab << "Volume";
+        os  << tab << "Volume";
     }
 
     forAll(fields_, i)
     {
-        file()
-            << tab << operationTypeNames_[operation_]
+        os  << tab << operationTypeNames_[operation_]
             << "(" << fields_[i] << ")";
     }
 
-    file() << endl;
+    os << endl;
 }
 
 
@@ -204,7 +205,11 @@ Foam::fieldValues::cellSource::cellSource
     weightFieldName_("none"),
     writeVolume_(dict.lookupOrDefault("writeVolume", false))
 {
-    read(dict);
+    if (active_)
+    {
+        read(dict);
+        writeFileHeader(file());
+    }
 }
 
 
@@ -218,11 +223,11 @@ Foam::fieldValues::cellSource::~cellSource()
 
 void Foam::fieldValues::cellSource::read(const dictionary& dict)
 {
-    fieldValue::read(dict);
-
     if (active_)
     {
-        // no additional info to read
+        fieldValue::read(dict);
+
+        // No additional info to read
         initialise(dict);
     }
 }
@@ -234,33 +239,34 @@ void Foam::fieldValues::cellSource::write()
 
     if (active_)
     {
-        if (Pstream::master())
+        file() << obr_.time().value();
+
+        // Construct weight field. Note: zero size indicates unweighted
+        scalarField weightField;
+        if (weightFieldName_ != "none")
         {
-            file() << obr_.time().value();
+            weightField = setFieldValues<scalar>(weightFieldName_, true);
         }
-
+        
         if (writeVolume_)
         {
             volume_ = volume();
-            if (Pstream::master())
-            {
-                file() << tab << volume_;
-            }
+            file() << tab << volume_;
             if (log_) Info<< "    total volume = " << volume_ << endl;
         }
 
         forAll(fields_, i)
         {
             const word& fieldName = fields_[i];
-            bool processed = false;
+            bool ok = false;
 
-            processed = processed || writeValues<scalar>(fieldName);
-            processed = processed || writeValues<vector>(fieldName);
-            processed = processed || writeValues<sphericalTensor>(fieldName);
-            processed = processed || writeValues<symmTensor>(fieldName);
-            processed = processed || writeValues<tensor>(fieldName);
+            ok = ok || writeValues<scalar>(fieldName, weightField);
+            ok = ok || writeValues<vector>(fieldName, weightField);
+            ok = ok || writeValues<sphericalTensor>(fieldName, weightField);
+            ok = ok || writeValues<symmTensor>(fieldName, weightField);
+            ok = ok || writeValues<tensor>(fieldName, weightField);
 
-            if (!processed)
+            if (!ok)
             {
                 WarningIn("void Foam::fieldValues::cellSource::write()")
                     << "Requested field " << fieldName
@@ -269,10 +275,7 @@ void Foam::fieldValues::cellSource::write()
             }
         }
 
-        if (Pstream::master())
-        {
-            file()<< endl;
-        }
+        file()<< endl;
 
         if (log_) Info<< endl;
     }
diff --git a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.H b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.H
index 42f788d88443fc7f8d9d24a323377fc60d9dcfb1..8c59c8450d6fe274925d97a2651c71e4de81350b 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.H
+++ b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -62,11 +62,11 @@ Description
         log          | Write data to standard output | no    | no
         valueOutput  | Write the raw output values | yes     |
         writeVolume  | Write the volume of the cellSource | no |
-        source       | cell source: see below  | yes         |
-        sourceName   | name of cell source if required  | no |
-        operation    | operation to perform    | yes         |
-        weightField  | name of field to apply weighting | no |
-        fields       | list of fields to operate on | yes    |
+        source       | Cell source: see below  | yes         |
+        sourceName   | Name of cell source if required  | no |
+        operation    | Operation to perform    | yes         |
+        weightField  | Name of field to apply weighting | no |
+        fields       | List of fields to operate on | yes    |
     \endtable
 
     \linebreak
@@ -228,7 +228,7 @@ protected:
         ) const;
 
         //- Output file header information
-        virtual void writeFileHeader(const label i);
+        virtual void writeFileHeader(Ostream& os) const;
 
 
 public:
@@ -272,7 +272,11 @@ public:
 
             //- Templated helper function to output field values
             template<class Type>
-            bool writeValues(const word& fieldName);
+            bool writeValues
+            (
+                const word& fieldName,
+                const scalarField& weightField
+            );
 
             //- Filter a field according to cellIds
             template<class Type>
diff --git a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSourceTemplates.C b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSourceTemplates.C
index 15030ea689cc451f206e1b1f34df8e27ec2dc103..2cdc0b51950014b8078065cb5f6e73ee135f8832 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSourceTemplates.C
+++ b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSourceTemplates.C
@@ -87,52 +87,65 @@ Type Foam::fieldValues::cellSource::processValues
     {
         case opSum:
         {
-            result = sum(values);
+            result = gSum(values);
             break;
         }
         case opSumMag:
         {
-            result = sum(cmptMag(values));
+            result = gSum(cmptMag(values));
             break;
         }
         case opAverage:
         {
-            result = sum(values)/values.size();
+            label n = returnReduce(values.size(), sumOp<label>());
+            result = gSum(values)/(scalar(n) + ROOTVSMALL);
             break;
         }
         case opWeightedAverage:
         {
-            result = sum(weightField*values)/sum(weightField);
+            label wSize = returnReduce(weightField.size(), sumOp<label>());
+
+            if (wSize > 0)
+            {
+                result = gSum(weightField*values)/(gSum(weightField) + ROOTVSMALL);
+            }
+            else
+            {
+                label n = returnReduce(values.size(), sumOp<label>());
+                result = gSum(values)/(scalar(n) + ROOTVSMALL);
+            }
             break;
         }
         case opVolAverage:
         {
-            result = sum(V*values)/sum(V);
+            result = gSum(values*V)/(gSum(V) + ROOTVSMALL);
             break;
         }
         case opWeightedVolAverage:
         {
-            result = sum(weightField*V*values)/sum(weightField*V);
+            result = gSum(weightField*V*values)/gSum(weightField*V);
             break;
         }
         case opVolIntegrate:
         {
-            result = sum(V*values);
+            result = gSum(V*values);
             break;
         }
         case opMin:
         {
-            result = min(values);
+            result = gMin(values);
             break;
         }
         case opMax:
         {
-            result = max(values);
+            result = gMax(values);
             break;
         }
         case opCoV:
         {
-            Type meanValue = sum(values*V)/sum(V);
+            const scalar sumV = gSum(V);
+
+            Type meanValue = gSum(V*values)/sumV;
 
             const label nComp = pTraits<Type>::nComponents;
 
@@ -142,7 +155,7 @@ Type Foam::fieldValues::cellSource::processValues
                 scalar mean = component(meanValue, d);
                 scalar& res = setComponent(result, d);
 
-                res = sqrt(sum(V*sqr(vals - mean))/sum(V))/mean;
+                res = sqrt(gSum(V*sqr(vals - mean))/sumV)/(mean + ROOTVSMALL);
             }
 
             break;
@@ -160,7 +173,11 @@ Type Foam::fieldValues::cellSource::processValues
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class Type>
-bool Foam::fieldValues::cellSource::writeValues(const word& fieldName)
+bool Foam::fieldValues::cellSource::writeValues
+(
+    const word& fieldName,
+    const scalarField& weightField
+)
 {
     const bool ok = validField<Type>(fieldName);
 
@@ -168,26 +185,13 @@ bool Foam::fieldValues::cellSource::writeValues(const word& fieldName)
     {
         Field<Type> values(setFieldValues<Type>(fieldName));
         scalarField V(filterField(mesh().V()));
-        scalarField weightField(values.size(), 1.0);
 
-        if (weightFieldName_ != "none")
+        if (valueOutput_)
         {
-            weightField = setFieldValues<scalar>(weightFieldName_, true);
-        }
-
-        // Combine onto master
-        combineFields(values);
-        combineFields(V);
-        combineFields(weightField);
-
-        if (Pstream::master())
-        {
-            Type result = processValues(values, V, weightField);
-
-            // Add to result dictionary, over-writing any previous entry
-            resultDict_.add(fieldName, result, true);
+            Field<Type> allValues(values);
+            combineFields(allValues);
 
-            if (valueOutput_)
+            if (Pstream::master())
             {
                 IOField<Type>
                 (
@@ -200,17 +204,29 @@ bool Foam::fieldValues::cellSource::writeValues(const word& fieldName)
                         IOobject::NO_READ,
                         IOobject::NO_WRITE
                     ),
-                    weightField*values
+                    allValues
                 ).write();
             }
+        }
+
+        // Apply scale factor
+        values *= scaleFactor_;
 
+        Type result = processValues(values, V, weightField);
 
-            file()<< tab << result;
+        file()<< tab << result;
 
-            if (log_) Info<< "    " << operationTypeNames_[operation_]
+        if (log_)
+        {
+            Info<< "    " << operationTypeNames_[operation_]
                 << "(" << sourceName_ << ") of " << fieldName
                 <<  " = " << result << endl;
         }
+
+        // write state/results information
+        const word& opName = operationTypeNames_[operation_];
+        word resultName = opName + '(' + sourceName_ + ',' + fieldName + ')';
+        this->setResult(resultName, result);
     }
 
     return ok;
diff --git a/src/postProcessing/functionObjects/field/fieldValues/controlDict b/src/postProcessing/functionObjects/field/fieldValues/controlDict
index 5b0e8b7a3e1508de6c680093e31fb7c4de07e82e..6c5462e8b68fe1971f05042e373bcfa9f0a4f524 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/controlDict
+++ b/src/postProcessing/functionObjects/field/fieldValues/controlDict
@@ -60,10 +60,13 @@ functions
         // Output field values as well
         valueOutput     true;
 
+        // Output format for field values
+        surfaceFormat vtk;
+
         // Type of source: patch/faceZone/sampledSurface
         source          patch;
 
-        // if patch or faceZone: name of patch or faceZone
+        // If patch or faceZone: name of patch or faceZone
         sourceName      movingWall;
 
         //// if sampledSurface: dictionary with a sampledSurface
@@ -96,6 +99,7 @@ functions
         outputControl   outputTime;
         log             true;
         valueOutput     true;
+        surfaceFormat   vtk;
         source          faceZone;
         sourceName      f0;
         operation       sum;
diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C
index 4e1f79807de01b7554a5314ea987a351f5faa206..89f2037c36bcdc320b45e54860b7e914576000ad 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C
+++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C
@@ -352,7 +352,7 @@ void Foam::fieldValues::faceSource::combineSurfaceGeometry
 
         if (Pstream::parRun())
         {
-            // dimension as fraction of mesh bounding box
+            // Dimension as fraction of mesh bounding box
             scalar mergeDim = 1e-10*mesh().bounds().mag();
 
             labelList pointsMap;
@@ -400,8 +400,6 @@ Foam::scalar Foam::fieldValues::faceSource::totalArea() const
 
 void Foam::fieldValues::faceSource::initialise(const dictionary& dict)
 {
-    dict.lookup("sourceName") >> sourceName_;
-
     switch (source_)
     {
         case stFaceZone:
@@ -450,15 +448,14 @@ void Foam::fieldValues::faceSource::initialise(const dictionary& dict)
 
     totalArea_ = totalArea();
 
-    Info<< type() << " " << name_ << ":" << nl
-        << "    total faces  = " << nFaces_
-        << nl
-        << "    total area   = " << totalArea_
-        << nl;
+    if (log_) Info
+        << type() << " " << name_ << ":" << nl
+        << "    total faces  = " << nFaces_ << nl
+        << "    total area   = " << totalArea_ << nl;
 
     if (dict.readIfPresent("weightField", weightFieldName_))
     {
-        Info<< "    weight field = " << weightFieldName_ << nl;
+        if (log_) Info << "    weight field = " << weightFieldName_ << nl;
 
         if (source_ == stSampledSurface)
         {
@@ -480,7 +477,7 @@ void Foam::fieldValues::faceSource::initialise(const dictionary& dict)
         if (weightFieldName_ == "none")
         {
             dict.lookup("orientedWeightField") >>  weightFieldName_;
-            Info<< "    weight field = " << weightFieldName_ << nl;
+            if (log_) Info << "    weight field = " << weightFieldName_ << nl;
             orientWeightField_ = true;
         }
         else
@@ -506,12 +503,7 @@ void Foam::fieldValues::faceSource::initialise(const dictionary& dict)
         fields_.append(orientedFields);
     }
 
-    if (dict.readIfPresent("scaleFactor", scaleFactor_))
-    {
-        Info<< "    scale factor = " << scaleFactor_ << nl;
-    }
-
-    Info<< nl << endl;
+    if (log_) Info << nl << endl;
 
     if (valueOutput_)
     {
@@ -530,29 +522,27 @@ void Foam::fieldValues::faceSource::initialise(const dictionary& dict)
 }
 
 
-void Foam::fieldValues::faceSource::writeFileHeader(const label i)
+void Foam::fieldValues::faceSource::writeFileHeader(Ostream& os) const
 {
-    writeCommented(file(), "Source : ");
-    file() << sourceTypeNames_[source_] << " " << sourceName_ << endl;
-    writeCommented(file(), "Faces  : ");
-    file() << nFaces_ << endl;
-    writeCommented(file(), "Area   : ");
-    file() << totalArea_ << endl;
-
-    writeCommented(file(), "Time");
+    writeHeaderValue(os, "Source", sourceTypeNames_[source_]);
+    writeHeaderValue(os, "Name", sourceName_);
+    writeHeaderValue(os, "Faces", nFaces_);
+    writeHeaderValue(os, "Total area", totalArea_);
+    writeHeaderValue(os, "Scale factor", scaleFactor_);
+
+    writeCommented(os, "Time");
     if (writeArea_)
     {
-        file() << tab << "Area";
+        os  << tab << "Area";
     }
 
     forAll(fields_, i)
     {
-        file()
-            << tab << operationTypeNames_[operation_]
+        os  << tab << operationTypeNames_[operation_]
             << "(" << fields_[i] << ")";
     }
 
-    file() << endl;
+    os  << endl;
 }
 
 
@@ -569,14 +559,14 @@ Foam::scalar Foam::fieldValues::faceSource::processValues
         case opSumDirection:
         {
             vector n(dict_.lookup("direction"));
-            return sum(pos(values*(Sf & n))*mag(values));
+            return gSum(pos(values*(Sf & n))*mag(values));
         }
         case opSumDirectionBalance:
         {
             vector n(dict_.lookup("direction"));
             const scalarField nv(values*(Sf & n));
 
-            return sum(pos(nv)*mag(values) - neg(nv)*mag(values));
+            return gSum(pos(nv)*mag(values) - neg(nv)*mag(values));
         }
         default:
         {
@@ -603,7 +593,7 @@ Foam::vector Foam::fieldValues::faceSource::processValues
             n /= mag(n) + ROOTVSMALL;
             const scalarField nv(n & values);
 
-            return sum(pos(nv)*n*(nv));
+            return gSum(pos(nv)*n*(nv));
         }
         case opSumDirectionBalance:
         {
@@ -611,16 +601,16 @@ Foam::vector Foam::fieldValues::faceSource::processValues
             n /= mag(n) + ROOTVSMALL;
             const scalarField nv(n & values);
 
-            return sum(pos(nv)*n*(nv));
+            return gSum(pos(nv)*n*(nv));
         }
         case opAreaNormalAverage:
         {
-            scalar result = sum(values & Sf)/sum(mag(Sf));
+            scalar result = gSum(values & Sf)/gSum(mag(Sf));
             return vector(result, 0.0, 0.0);
         }
         case opAreaNormalIntegrate:
         {
-            scalar result = sum(values & Sf);
+            scalar result = gSum(values & Sf);
             return vector(result, 0.0, 0.0);
         }
         default:
@@ -649,14 +639,17 @@ Foam::fieldValues::faceSource::faceSource
     weightFieldName_("none"),
     orientWeightField_(false),
     orientedFieldsStart_(labelMax),
-    scaleFactor_(1.0),
     writeArea_(dict.lookupOrDefault("writeArea", false)),
     nFaces_(0),
     faceId_(),
     facePatchId_(),
     faceSign_()
 {
-    read(dict);
+    if (active_)
+    {
+        read(dict);
+        writeFileHeader(file());
+    }
 }
 
 
@@ -670,10 +663,11 @@ Foam::fieldValues::faceSource::~faceSource()
 
 void Foam::fieldValues::faceSource::read(const dictionary& dict)
 {
-    fieldValue::read(dict);
-
     if (active_)
     {
+        fieldValue::read(dict);
+
+        // No additional info to read
         initialise(dict);
     }
 }
@@ -690,27 +684,21 @@ void Foam::fieldValues::faceSource::write()
             surfacePtr_().update();
         }
 
-        if (Pstream::master())
-        {
-            file() << obr_.time().value();
-        }
+        file() << obr_.time().value();
 
         if (writeArea_)
         {
             totalArea_ = totalArea();
-            if (Pstream::master())
-            {
-                file() << tab << totalArea_;
-            }
+            file() << tab << totalArea_;
             if (log_) Info<< "    total area = " << totalArea_ << endl;
         }
 
-        // construct weight field. Note: zero size means weight = 1
+        // Construct weight field. Note: zero size indicates unweighted
         scalarField weightField;
         if (weightFieldName_ != "none")
         {
             weightField =
-                getFieldValues<scalar>
+                setFieldValues<scalar>
                 (
                     weightFieldName_,
                     true,
@@ -718,10 +706,7 @@ void Foam::fieldValues::faceSource::write()
                 );
         }
 
-        // Combine onto master
-        combineFields(weightField);
-
-        // process the fields
+        // Process the fields
         forAll(fields_, i)
         {
             const word& fieldName = fields_[i];
@@ -730,8 +715,8 @@ void Foam::fieldValues::faceSource::write()
             bool orient = i >= orientedFieldsStart_;
             ok = ok || writeValues<scalar>(fieldName, weightField, orient);
             ok = ok || writeValues<vector>(fieldName, weightField, orient);
-            ok = ok
-              || writeValues<sphericalTensor>(fieldName, weightField, orient);
+            ok = ok ||
+                writeValues<sphericalTensor>(fieldName, weightField, orient);
             ok = ok || writeValues<symmTensor>(fieldName, weightField, orient);
             ok = ok || writeValues<tensor>(fieldName, weightField, orient);
 
@@ -744,10 +729,7 @@ void Foam::fieldValues::faceSource::write()
             }
         }
 
-        if (Pstream::master())
-        {
-            file()<< endl;
-        }
+        file()<< endl;
 
         if (log_) Info<< endl;
     }
diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H
index e74b840f18a73bf56bb85c85f04ac74d59b0668f..77fde515c4dcb62a385f4a0b06453d8111269b6e 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H
+++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -257,9 +257,6 @@ protected:
         //- Start index of fields that require application of flipMap
         label orientedFieldsStart_;
 
-        //- Scale factor - optional
-        scalar scaleFactor_;
-
         //- Total area of the faceSource
         scalar totalArea_;
 
@@ -300,7 +297,7 @@ protected:
 
         //- Return field values by looking up field name
         template<class Type>
-        tmp<Field<Type> > getFieldValues
+        tmp<Field<Type> > setFieldValues
         (
             const word& fieldName,
             const bool mustGet = false,
@@ -328,7 +325,7 @@ protected:
         ) const;
 
         //- Output file header information
-        virtual void writeFileHeader(const label i);
+        virtual void writeFileHeader(Ostream& os) const;
 
 
 public:
diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C
index 53bca6f1fab3ae2fbc1fdf8fa814d484dbb99991..1598eb881fac32047c25c10567bdf8711e075722 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C
+++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -51,7 +51,7 @@ bool Foam::fieldValues::faceSource::validField(const word& fieldName) const
 
 
 template<class Type>
-Foam::tmp<Foam::Field<Type> > Foam::fieldValues::faceSource::getFieldValues
+Foam::tmp<Foam::Field<Type> > Foam::fieldValues::faceSource::setFieldValues
 (
     const word& fieldName,
     const bool mustGet,
@@ -113,7 +113,7 @@ Foam::tmp<Foam::Field<Type> > Foam::fieldValues::faceSource::getFieldValues
         FatalErrorIn
         (
             "Foam::tmp<Foam::Field<Type> > "
-            "Foam::fieldValues::faceSource::getFieldValues"
+            "Foam::fieldValues::faceSource::setFieldValues"
             "("
                 "const word&, "
                 "const bool, "
@@ -140,12 +140,12 @@ Type Foam::fieldValues::faceSource::processSameTypeValues
     {
         case opSum:
         {
-            result = sum(values);
+            result = gSum(values);
             break;
         }
         case opSumMag:
         {
-            result = sum(cmptMag(values));
+            result = gSum(cmptMag(values));
             break;
         }
         case opSumDirection:
@@ -190,18 +190,23 @@ Type Foam::fieldValues::faceSource::processSameTypeValues
         }
         case opAverage:
         {
-            result = sum(values)/values.size();
+            label n = returnReduce(values.size(), sumOp<label>());
+            result = gSum(values)/(scalar(n) + ROOTVSMALL);
             break;
         }
         case opWeightedAverage:
         {
-            if (weightField.size())
+            label wSize = returnReduce(weightField.size(), sumOp<label>());
+
+            if (wSize > 0)
             {
-                result = sum(weightField*values)/sum(weightField);
+                result =
+                    gSum(weightField*values)/(gSum(weightField) + ROOTVSMALL);
             }
             else
             {
-                result = sum(values)/values.size();
+                label n = returnReduce(values.size(), sumOp<label>());
+                result = gSum(values)/(scalar(n) + ROOTVSMALL);
             }
             break;
         }
@@ -209,20 +214,21 @@ Type Foam::fieldValues::faceSource::processSameTypeValues
         {
             const scalarField magSf(mag(Sf));
 
-            result = sum(magSf*values)/sum(magSf);
+            result = gSum(magSf*values)/gSum(magSf);
             break;
         }
         case opWeightedAreaAverage:
         {
             const scalarField magSf(mag(Sf));
+            label wSize = returnReduce(weightField.size(), sumOp<label>());
 
-            if (weightField.size())
+            if (wSize > 0)
             {
-                result = sum(weightField*magSf*values)/sum(magSf*weightField);
+                result = gSum(weightField*magSf*values)/gSum(magSf*weightField);
             }
             else
             {
-                result = sum(magSf*values)/sum(magSf);
+                result = gSum(magSf*values)/gSum(magSf);
             }
             break;
         }
@@ -230,24 +236,26 @@ Type Foam::fieldValues::faceSource::processSameTypeValues
         {
             const scalarField magSf(mag(Sf));
 
-            result = sum(magSf*values);
+            result = gSum(magSf*values);
             break;
         }
         case opMin:
         {
-            result = min(values);
+            result = gMin(values);
             break;
         }
         case opMax:
         {
-            result = max(values);
+            result = gMax(values);
             break;
         }
         case opCoV:
         {
             const scalarField magSf(mag(Sf));
 
-            Type meanValue = sum(values*magSf)/sum(magSf);
+            const scalar gSumMagSf = gSum(magSf);
+
+            Type meanValue = gSum(values*magSf)/gSumMagSf;
 
             const label nComp = pTraits<Type>::nComponents;
 
@@ -257,7 +265,9 @@ Type Foam::fieldValues::faceSource::processSameTypeValues
                 scalar mean = component(meanValue, d);
                 scalar& res = setComponent(result, d);
 
-                res = sqrt(sum(magSf*sqr(vals - mean))/sum(magSf))/mean;
+                res =
+                    sqrt(gSum(magSf*sqr(vals - mean))/gSumMagSf)
+                   /(mean + ROOTVSMALL);
             }
 
             break;
@@ -299,7 +309,7 @@ bool Foam::fieldValues::faceSource::writeValues
 
     if (ok)
     {
-        Field<Type> values(getFieldValues<Type>(fieldName, true, orient));
+        Field<Type> values(setFieldValues<Type>(fieldName, true, orient));
 
         vectorField Sf;
         if (surfacePtr_.valid())
@@ -313,13 +323,12 @@ bool Foam::fieldValues::faceSource::writeValues
             Sf = filterField(mesh().Sf(), true);
         }
 
-        // Combine onto master
-        combineFields(values);
-        combineFields(Sf);
-
         // Write raw values on surface if specified
         if (surfaceWriterPtr_.valid())
         {
+            Field<Type> allValues(values);
+            combineFields(allValues);
+
             faceList faces;
             pointField points;
 
@@ -344,29 +353,30 @@ bool Foam::fieldValues::faceSource::writeValues
                     points,
                     faces,
                     fieldName,
-                    values,
+                    allValues,
                     false
                 );
             }
         }
 
-
         // Apply scale factor
         values *= scaleFactor_;
 
-        if (Pstream::master())
-        {
-            Type result = processValues(values, Sf, weightField);
-
-            // Add to result dictionary, over-writing any previous entry
-            resultDict_.add(fieldName, result, true);
+        Type result = processValues(values, Sf, weightField);
 
-            file()<< tab << result;
+        file()<< tab << result;
 
-            if (log_) Info<< "    " << operationTypeNames_[operation_]
-                << "(" << sourceName_ << ") of " << fieldName
+        if (log_)
+        {
+            Info<< "    " << operationTypeNames_[operation_]
+                << "(" << sourceName_ << ") for " << fieldName
                 <<  " = " << result << endl;
         }
+
+        // Write state/results information
+        const word& opName = operationTypeNames_[operation_];
+        word resultName = opName + '(' + sourceName_ + ',' + fieldName + ')';
+        this->setResult(resultName, result);
     }
 
     return ok;
diff --git a/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValue.C b/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValue.C
index 9e6fe09a734626945d883f6ad920271d0197ac7f..b744457cf7167e0d2bbf6f40d4e00f9a2f321dd9 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValue.C
+++ b/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValue.C
@@ -75,10 +75,10 @@ Foam::fieldValue::fieldValue
     const bool loadFromFiles
 )
 :
+    functionObjectState(obr, name),
     functionObjectFile(obr, name, valueType, dict),
     obr_(obr),
     dict_(dict),
-    active_(true),
     log_(true),
     sourceName_(dict.lookupOrDefault<word>("sourceName", "sampledSurface")),
     fields_(),
@@ -86,25 +86,10 @@ Foam::fieldValue::fieldValue
     scaleFactor_(1.0)
 {
     // Only active if obr is an fvMesh
-    if (isA<fvMesh>(obr_))
+    if (setActive<fvMesh>())
     {
         read(dict);
     }
-    else
-    {
-        WarningIn
-        (
-            "fieldValue::fieldValue"
-            "("
-                "const word&, "
-                "const objectRegistry&, "
-                "const dictionary&, "
-                "const bool"
-            ")"
-        )   << "No fvMesh available, deactivating " << name << nl
-            << endl;
-        active_ = false;
-    }
 }
 
 
diff --git a/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValue.H b/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValue.H
index d5d364d1fb2207afd341ca34e82f6e6c94c75e67..5e3d4e3223ab20c697ffffa66d27fa5f9d3c4bef 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValue.H
+++ b/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValue.H
@@ -38,6 +38,7 @@ SourceFiles
 #ifndef fieldValue_H
 #define fieldValue_H
 
+#include "functionObjectState.H"
 #include "functionObjectFile.H"
 #include "Switch.H"
 #include "OFstream.H"
@@ -62,6 +63,7 @@ class mapPolyMesh;
 
 class fieldValue
 :
+    public functionObjectState,
     public functionObjectFile
 {
 
@@ -69,18 +71,12 @@ protected:
 
     // Protected data
 
-        //- Name of this fieldValue object
-        word name_;
-
         //- Database this class is registered to
         const objectRegistry& obr_;
 
         //- Construction dictionary
         dictionary dict_;
 
-        //- Active flag
-        bool active_;
-
         //- Switch to send output to Info as well as to file
         Switch log_;
 
@@ -93,9 +89,6 @@ protected:
         //- Output field values flag
         Switch valueOutput_;
 
-        //- Results dictionary for external access of results
-        dictionary resultDict_;
-
         //- Scale factor - optional
         scalar scaleFactor_;
 
@@ -176,9 +169,6 @@ public:
             //- Helper function to return the reference to the mesh
             inline const fvMesh& mesh() const;
 
-            //- Return access to the latest set of results
-            inline const dictionary& resultDict() const;
-
 
         // Function object functions
 
diff --git a/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValueI.H b/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValueI.H
index 55651a3539ed50705d18fe6a75cf10f4425e9d59..f1a88185f81025777eaef3392f55bf71cb60a206 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValueI.H
+++ b/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValueI.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -82,10 +82,4 @@ inline const Foam::fvMesh& Foam::fieldValue::mesh() const
 }
 
 
-inline const Foam::dictionary& Foam::fieldValue::resultDict() const
-{
-    return resultDict_;
-}
-
-
 // ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValueTemplates.C b/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValueTemplates.C
index 43d1a18d99ce117d57117d35a9b8b8bf86b64d5f..d9945b9570344e0ad73839cf309400342bc9c653 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValueTemplates.C
+++ b/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValueTemplates.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -37,16 +37,14 @@ void Foam::fieldValue::combineFields(Field<Type>& field)
     allValues[Pstream::myProcNo()] = field;
 
     Pstream::gatherList(allValues);
-
-    if (Pstream::master())
-    {
-        field =
-            ListListOps::combine<Field<Type> >
-            (
-                allValues,
-                accessOp<Field<Type> >()
-            );
-    }
+    Pstream::scatterList(allValues);
+
+    field =
+        ListListOps::combine<Field<Type> >
+        (
+            allValues,
+            accessOp<Field<Type> >()
+        );
 }
 
 
diff --git a/src/postProcessing/functionObjects/field/fieldValues/fieldValueDelta/fieldValueDelta.C b/src/postProcessing/functionObjects/field/fieldValues/fieldValueDelta/fieldValueDelta.C
index 9715348ebab691b01b8932c18e779932d70d13e9..091ae05ec7a2240d441a40787ac8bcf23b4963f7 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/fieldValueDelta/fieldValueDelta.C
+++ b/src/postProcessing/functionObjects/field/fieldValues/fieldValueDelta/fieldValueDelta.C
@@ -95,34 +95,16 @@ Foam::fieldValues::fieldValueDelta::fieldValueDelta
     const bool loadFromFiles
 )
 :
+    functionObjectState(obr, name),
     functionObjectFile(obr, name, typeName, dict),
-    name_(name),
     obr_(obr),
-    active_(true),
     loadFromFiles_(loadFromFiles),
     log_(true),
     operation_(opSubtract),
     source1Ptr_(NULL),
     source2Ptr_(NULL)
 {
-    // Check if the available mesh is an fvMesh otherise deactivate
-    if (!isA<fvMesh>(obr_))
-    {
-        active_ = false;
-        WarningIn
-        (
-            "fieldMinMax::fieldMinMax"
-            "("
-                "const word&, "
-                "const objectRegistry&, "
-                "const dictionary&, "
-                "const bool"
-            ")"
-        )   << "No fvMesh available, deactivating " << name_
-            << endl;
-    }
-
-    if (active_)
+    if (setActive<fvMesh>())
     {
         read(dict);
         writeFileHeader(file());
@@ -174,55 +156,97 @@ void Foam::fieldValues::fieldValueDelta::read(const dictionary& dict)
 
 
 void Foam::fieldValues::fieldValueDelta::write()
+{
+    // Do nothing
+}
+
+
+void Foam::fieldValues::fieldValueDelta::execute()
 {
     if (active_)
     {
         source1Ptr_->write();
         source2Ptr_->write();
 
-        if (Pstream::master())
-        {
-            file()<< obr_.time().value();
-        }
+        file()<< obr_.time().value();
 
-        if (log_) Info<< type() << " " << name_ << " output:" << endl;
+        if (log_) Info << type() << " " << name_ << " output:" << endl;
 
-        bool found = false;
-        processFields<scalar>(found);
-        processFields<vector>(found);
-        processFields<sphericalTensor>(found);
-        processFields<symmTensor>(found);
-        processFields<tensor>(found);
+        const word& name1 = source1Ptr_->name();
+        const word& name2 = source2Ptr_->name();
 
-        if (Pstream::master())
+        const wordList entries1 = objectResultEntries(name1);
+        const wordList entries2 = objectResultEntries(name2);
+
+        if (entries1.size() != entries2.size())
         {
-            file()<< endl;
+            FatalErrorIn("void Foam::fieldValues::fieldValueDelta::execute()")
+                << name_ << ": objects must generate the same number of results"
+                << nl
+                << "    " << name1 << " objects: " << entries1 << nl
+                << "    " << name2 << " objects: " << entries2 << nl
+                << exit(FatalError);
         }
 
-        if (log_)
+        forAll(entries1, i)
         {
-            if (!found)
+            const word& entry1(entries1[i]);
+            const word& entry2(entries2[i]);
+            const word type1 = objectResultType(name1, entry1);
+            const word type2 = objectResultType(name2, entry2);
+
+            if (type1 != type2)
             {
-                Info<< "    none" << endl;
+                FatalErrorIn
+                (
+                    "void Foam::fieldValues::fieldValueDelta::execute()"
+                )
+                    << name_
+                    << ": input values for operation must be of the same type"
+                    << nl
+                    << "    " << entry1 << ": " << type1 << nl
+                    << "    " << entry2 << ": " << type2 << nl
+                    << exit(FatalError);
             }
-            else
+
+            bool found = false;
+
+            apply<scalar>(type1, name1, name2, entry1, entry2, found);
+            apply<vector>(type1, name1, name2, entry1, entry2, found);
+            apply<sphericalTensor>(type1, name1, name2, entry1, entry2, found);
+            apply<symmTensor>(type1, name1, name2, entry1, entry2, found);
+            apply<tensor>(type1, name1, name2, entry1, entry2, found);
+
+            if (log_ && !found)
             {
-                Info<< endl;
+                Info<< "Operation between "
+                    << name1 << " with result " << entry1 << " and "
+                    << name2 << " with result " << entry2 << " not applied"
+                    << endl;
             }
         }
-    }
-}
 
+        if (log_)
+        {
+            if (entries1.empty())
+            {
+                Info<< "    none";
+            }
+            
+            Info<< endl;
+        }
 
-void Foam::fieldValues::fieldValueDelta::execute()
-{
-    // Do nothing
+        file()<< endl;
+    }
 }
 
 
 void Foam::fieldValues::fieldValueDelta::end()
 {
-    // Do nothing
+    if (active_)
+    {
+        execute();
+    }
 }
 
 
diff --git a/src/postProcessing/functionObjects/field/fieldValues/fieldValueDelta/fieldValueDelta.H b/src/postProcessing/functionObjects/field/fieldValues/fieldValueDelta/fieldValueDelta.H
index 7c7eb9fc497b8d78f62e4c1637c44c362809599c..f4133d6a666b652cbe40b2e7e42e9221aa183fa2 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/fieldValueDelta/fieldValueDelta.H
+++ b/src/postProcessing/functionObjects/field/fieldValues/fieldValueDelta/fieldValueDelta.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2012-2013 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -28,8 +28,11 @@ Group
     grpFieldFunctionObjects
 
 Description
-    This function object provides a differencing option between two 'field
-    value' function objects.
+    This function object provides applies an operation to the output of two
+    fieldValue function objects.
+
+    The operation is applied to all results of each fieldValue object.
+    Accordingly, each object must generate the same number and type of results.
 
     Example of function object specification:
     \verbatim
@@ -39,11 +42,11 @@ Description
         functionObjectLibs ("libfieldFunctionObjects.so");
         operation       subtract;
 
-        fieldValue1
+        source1
         {
             ...
         }
-        fieldValue2
+        source2
         {
             ...
         }
@@ -65,6 +68,7 @@ Description
        max           | maximum
        average       | average
     \endplaintable
+
 SeeAlso
     Foam::fieldValue
 
@@ -76,6 +80,7 @@ SourceFiles
 #ifndef fieldValueDelta_H
 #define fieldValueDelta_H
 
+#include "functionObjectState.H"
 #include "functionObjectFile.H"
 #include "fieldValue.H"
 #include "autoPtr.H"
@@ -94,6 +99,7 @@ namespace fieldValues
 
 class fieldValueDelta
 :
+    public functionObjectState,
     public functionObjectFile
 {
 public:
@@ -115,15 +121,9 @@ private:
 
     // Private data
 
-        //- Name of this fieldValue object
-        word name_;
-
         //- Database this class is registered to
         const objectRegistry& obr_;
 
-        //- On/off switch
-        bool active_;
-
         //- Flag to indicate to load from files
         bool loadFromFiles_;
 
@@ -142,13 +142,17 @@ private:
 
     // Private Member Functions
 
-        //- Templated function to process common fields
-        template<class Type>
-        void processFields(bool& found);
-
         //- Templated function to apply the operation
         template<class Type>
-        Type applyOperation(const Type& value1, const Type& value2) const;
+        void apply
+        (
+            const word& resultType,
+            const word& name1,
+            const word& name2,
+            const word& entryName1,
+            const word& entryName2,
+            bool& found
+        );
 
 
 protected:
diff --git a/src/postProcessing/functionObjects/field/fieldValues/fieldValueDelta/fieldValueDeltaTemplates.C b/src/postProcessing/functionObjects/field/fieldValues/fieldValueDelta/fieldValueDeltaTemplates.C
index 70c64effabdc00a0b147f8b6b27a4a75308d2384..65c521ef00cd62544f93230530bb07f14765d086 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/fieldValueDelta/fieldValueDeltaTemplates.C
+++ b/src/postProcessing/functionObjects/field/fieldValues/fieldValueDelta/fieldValueDeltaTemplates.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2012-2015 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -23,21 +23,31 @@ License
 
 \*---------------------------------------------------------------------------*/
 
-#include "GeometricField.H"
-#include "volMesh.H"
-#include "surfaceMesh.H"
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class Type>
-Type Foam::fieldValues::fieldValueDelta::applyOperation
+void Foam::fieldValues::fieldValueDelta::apply
 (
-    const Type& value1,
-    const Type& value2
-) const
+    const word& resultType,
+    const word& name1,
+    const word& name2,
+    const word& entryName1,
+    const word& entryName2,
+    bool& found
+)
 {
+    if (pTraits<Type>::typeName != resultType)
+    {
+        return;
+    }
+
     Type result = pTraits<Type>::zero;
 
+    Type value1 = this->getObjectResult<Type>(name1, entryName1);
+    Type value2 = this->getObjectResult<Type>(name2, entryName2);
+
+    const word& opName = operationTypeNames_[operation_];
+
     switch (operation_)
     {
         case opAdd:
@@ -69,63 +79,33 @@ Type Foam::fieldValues::fieldValueDelta::applyOperation
         {
             FatalErrorIn
             (
-                "Type Foam::fieldValues::fieldValueDelta::applyOperation"
+                "void Foam::fieldValues::fieldValueDelta::applyOperation"
                 "("
-                    "const Type&, "
-                    "const Type&"
+                    "const word&, "
+                    "const word&, "
+                    "const word&, "
+                    "const word&, "
+                    "const word&"
+                    "bool&"
                 ") const"
             )
-                << "Unable to process operation "
-                << operationTypeNames_[operation_]
+                << "Operation not supported: "
+                << opName
                 << abort(FatalError);
         }
     }
 
-    return result;
-}
-
-
-template<class Type>
-void Foam::fieldValues::fieldValueDelta::processFields(bool& found)
-{
-    typedef GeometricField<Type, fvPatchField, volMesh> vf;
-    typedef GeometricField<Type, fvsPatchField, surfaceMesh> sf;
-
-    const wordList& fields1 = source1Ptr_->fields();
-
-    const dictionary& results1 = source1Ptr_->resultDict();
-    const dictionary& results2 = source2Ptr_->resultDict();
-
-    Type r1(pTraits<Type>::zero);
-    Type r2(pTraits<Type>::zero);
-
-    forAll(fields1, i)
-    {
-        const word& fieldName = fields1[i];
-
-        if
-        (
-            (obr_.foundObject<vf>(fieldName) || obr_.foundObject<sf>(fieldName))
-         && results2.found(fieldName)
-        )
-        {
-            results1.lookup(fieldName) >> r1;
-            results2.lookup(fieldName) >> r2;
+    const word
+    	resultName(opName + '(' + entryName1 + ',' + entryName2 + ')');
 
-            Type result = applyOperation(r1, r2);
+    if (log_) Info << "    " << resultName << " = " << result << endl;
 
-            if (log_) Info<< "    " << operationTypeNames_[operation_]
-                << "(" << fieldName << ") = " << result
-                << endl;
+    this->file()<< tab << result;
 
-            if (Pstream::master())
-            {
-                file()<< tab << result;
-            }
+    // Write state/results information
+    this->setResult(resultName, result);
 
-            found = true;
-        }
-    }
+    found = true;
 }