diff --git a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.C b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.C
index afe4ea5f2ca37c7e7b61c3cb65a0d2731f3849c3..9d4b8400c80a32c181fbe566eaf7d5e0e6e8a629 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.C
+++ b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.C
@@ -41,7 +41,7 @@ namespace Foam
 
 
     template<>
-    const char* NamedEnum<fieldValues::cellSource::operationType, 10>::names[] =
+    const char* NamedEnum<fieldValues::cellSource::operationType, 11>::names[] =
     {
         "none",
         "sum",
@@ -49,6 +49,7 @@ namespace Foam
         "average",
         "weightedAverage",
         "volAverage",
+        "weightedVolAverage",
         "volIntegrate",
         "min",
         "max",
@@ -66,7 +67,7 @@ namespace Foam
 const Foam::NamedEnum<Foam::fieldValues::cellSource::sourceType, 2>
     Foam::fieldValues::cellSource::sourceTypeNames_;
 
-const Foam::NamedEnum<Foam::fieldValues::cellSource::operationType, 10>
+const Foam::NamedEnum<Foam::fieldValues::cellSource::operationType, 11>
     Foam::fieldValues::cellSource::operationTypeNames_;
 
 
diff --git a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.H b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.H
index a02584e769092f6d9344f3834fb5541117dfacd6..42f788d88443fc7f8d9d24a323377fc60d9dcfb1 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.H
+++ b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.H
@@ -85,6 +85,7 @@ Description
        average       | ensemble average
        weightedAverage | weighted average
        volAverage    | volume weighted average
+       weightedVolAverage | weighted volume average
        volIntegrate  | volume integral
        min           | minimum
        max           | maximum
@@ -149,6 +150,7 @@ public:
             opAverage,
             opWeightedAverage,
             opVolAverage,
+            opWeightedVolAverage,
             opVolIntegrate,
             opMin,
             opMax,
@@ -156,7 +158,7 @@ public:
         };
 
         //- Operation type names
-        static const NamedEnum<operationType, 10> operationTypeNames_;
+        static const NamedEnum<operationType, 11> operationTypeNames_;
 
 
 private:
diff --git a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSourceTemplates.C b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSourceTemplates.C
index f53755e3ff3bfcbddf3db930d8f9a8baeaa9b985..15030ea689cc451f206e1b1f34df8e27ec2dc103 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSourceTemplates.C
+++ b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSourceTemplates.C
@@ -102,17 +102,22 @@ Type Foam::fieldValues::cellSource::processValues
         }
         case opWeightedAverage:
         {
-            result = sum(values)/sum(weightField);
+            result = sum(weightField*values)/sum(weightField);
             break;
         }
         case opVolAverage:
         {
-            result = sum(values*V)/sum(V);
+            result = sum(V*values)/sum(V);
+            break;
+        }
+        case opWeightedVolAverage:
+        {
+            result = sum(weightField*V*values)/sum(weightField*V);
             break;
         }
         case opVolIntegrate:
         {
-            result = sum(values*V);
+            result = sum(V*values);
             break;
         }
         case opMin:
@@ -175,14 +180,11 @@ bool Foam::fieldValues::cellSource::writeValues(const word& fieldName)
         combineFields(V);
         combineFields(weightField);
 
-        // apply weight field
-        values *= weightField;
-
         if (Pstream::master())
         {
             Type result = processValues(values, V, weightField);
 
-            // add to result dictionary, over-writing any previous entry
+            // Add to result dictionary, over-writing any previous entry
             resultDict_.add(fieldName, result, true);
 
             if (valueOutput_)
@@ -198,7 +200,7 @@ bool Foam::fieldValues::cellSource::writeValues(const word& fieldName)
                         IOobject::NO_READ,
                         IOobject::NO_WRITE
                     ),
-                    values
+                    weightField*values
                 ).write();
             }
 
diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C
index 50804908c2eb6610aa5d98501d0100ce0875796c..4e1f79807de01b7554a5314ea987a351f5faa206 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C
+++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C
@@ -48,7 +48,7 @@ namespace Foam
 
 
     template<>
-    const char* NamedEnum<fieldValues::faceSource::operationType, 14>::names[] =
+    const char* NamedEnum<fieldValues::faceSource::operationType, 15>::names[] =
     {
         "none",
         "sum",
@@ -58,6 +58,7 @@ namespace Foam
         "average",
         "weightedAverage",
         "areaAverage",
+        "weightedAreaAverage",
         "areaIntegrate",
         "min",
         "max",
@@ -77,7 +78,7 @@ namespace Foam
 const Foam::NamedEnum<Foam::fieldValues::faceSource::sourceType, 3>
     Foam::fieldValues::faceSource::sourceTypeNames_;
 
-const Foam::NamedEnum<Foam::fieldValues::faceSource::operationType, 14>
+const Foam::NamedEnum<Foam::fieldValues::faceSource::operationType, 15>
     Foam::fieldValues::faceSource::operationTypeNames_;
 
 
diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H
index 87403aadb73948d2cddfea2eb1509e3a525f2dbf..e74b840f18a73bf56bb85c85f04ac74d59b0668f 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H
+++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H
@@ -97,6 +97,7 @@ Description
        average       | ensemble average
        weightedAverage | weighted average
        areaAverage   | area weighted average
+       weightedAreaAverage | weighted area average
        areaIntegrate | area integral
        min           | minimum
        max           | maximum
@@ -190,6 +191,7 @@ public:
             opAverage,
             opWeightedAverage,
             opAreaAverage,
+            opWeightedAreaAverage,
             opAreaIntegrate,
             opMin,
             opMax,
@@ -199,7 +201,7 @@ public:
         };
 
         //- Operation type names
-        static const NamedEnum<operationType, 14> operationTypeNames_;
+        static const NamedEnum<operationType, 15> operationTypeNames_;
 
 
 private:
diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C
index 27c392f56224f3dbc606444a74e9da10df164361..53bca6f1fab3ae2fbc1fdf8fa814d484dbb99991 100644
--- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C
+++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C
@@ -197,7 +197,7 @@ Type Foam::fieldValues::faceSource::processSameTypeValues
         {
             if (weightField.size())
             {
-                result = sum(values)/sum(weightField);
+                result = sum(weightField*values)/sum(weightField);
             }
             else
             {
@@ -209,14 +209,28 @@ Type Foam::fieldValues::faceSource::processSameTypeValues
         {
             const scalarField magSf(mag(Sf));
 
-            result = sum(values*magSf)/sum(magSf);
+            result = sum(magSf*values)/sum(magSf);
+            break;
+        }
+        case opWeightedAreaAverage:
+        {
+            const scalarField magSf(mag(Sf));
+
+            if (weightField.size())
+            {
+                result = sum(weightField*magSf*values)/sum(magSf*weightField);
+            }
+            else
+            {
+                result = sum(magSf*values)/sum(magSf);
+            }
             break;
         }
         case opAreaIntegrate:
         {
             const scalarField magSf(mag(Sf));
 
-            result = sum(values*magSf);
+            result = sum(magSf*values);
             break;
         }
         case opMin:
@@ -337,18 +351,14 @@ bool Foam::fieldValues::faceSource::writeValues
         }
 
 
-        // apply scale factor and weight field
+        // Apply scale factor
         values *= scaleFactor_;
-        if (weightField.size())
-        {
-            values *= weightField;
-        }
 
         if (Pstream::master())
         {
             Type result = processValues(values, Sf, weightField);
 
-            // add to result dictionary, over-writing any previous entry
+            // Add to result dictionary, over-writing any previous entry
             resultDict_.add(fieldName, result, true);
 
             file()<< tab << result;