diff --git a/Guides-a4/ProgrammersGuide.pdf b/Guides-a4/ProgrammersGuide.pdf
deleted file mode 100644
index ebd495d608b7234950bf6d1323bc4357be6f0731..0000000000000000000000000000000000000000
Binary files a/Guides-a4/ProgrammersGuide.pdf and /dev/null differ
diff --git a/Guides-a4/UserGuide.pdf b/Guides-a4/UserGuide.pdf
deleted file mode 100644
index 7524e9d8006e4921e1bacd33cac54a1fe8489e75..0000000000000000000000000000000000000000
Binary files a/Guides-a4/UserGuide.pdf and /dev/null differ
diff --git a/Guides-usletter/ProgrammersGuide.pdf b/Guides-usletter/ProgrammersGuide.pdf
deleted file mode 100644
index a97bc6d99d4e5c294e752e696ae9400856c54234..0000000000000000000000000000000000000000
Binary files a/Guides-usletter/ProgrammersGuide.pdf and /dev/null differ
diff --git a/Guides-usletter/UserGuide.pdf b/Guides-usletter/UserGuide.pdf
deleted file mode 100644
index 8960561f15d7ef68ca0a0e288705a2b111df3a84..0000000000000000000000000000000000000000
Binary files a/Guides-usletter/UserGuide.pdf and /dev/null differ
diff --git a/applications/solvers/DNS/dnsFoam/Allwmake b/applications/solvers/DNS/dnsFoam/Allwmake
new file mode 100755
index 0000000000000000000000000000000000000000..759041a131e01941d648a64d0f0c3e40fd28f2bb
--- /dev/null
+++ b/applications/solvers/DNS/dnsFoam/Allwmake
@@ -0,0 +1,14 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+if [ -f "$FFTW_ARCH_PATH/include/fftw3.h" ] || \
+   [ "${FFTW_ARCH_PATH##*-}" = system -a -f "/usr/include/fftw3.h" ]
+then
+    wmake
+else
+    echo
+    echo "Skipping dnsFoam solver (no FFTW)"
+    echo
+fi
+
+#------------------------------------------------------------------------------
diff --git a/applications/utilities/mesh/conversion/Optional/Allwmake b/applications/utilities/mesh/conversion/Optional/Allwmake
index f84479c089b562dd6fb360331dc87275b91789b1..adf350c5c871f2404c4ec272fbd42a4c51650327 100755
--- a/applications/utilities/mesh/conversion/Optional/Allwmake
+++ b/applications/utilities/mesh/conversion/Optional/Allwmake
@@ -8,7 +8,7 @@ cd ${0%/*} || exit 1    # Run from this directory
 . $WM_PROJECT_DIR/wmake/scripts/AllwmakeParseArguments
 # Get version info and arch-path
 . $WM_PROJECT_DIR/etc/config.sh/functions
-_foamSource $($WM_PROJECT_DIR/bin/foamEtcFile config.sh/libccmio)
+_foamSource $($WM_PROJECT_DIR/bin/foamEtcFile config.sh/ccmio)
 
 set -x
 
diff --git a/applications/utilities/miscellaneous/foamInfoExec/foamInfoExec.C b/applications/utilities/miscellaneous/foamInfoExec/foamInfoExec.C
index 3b336287f855375e09c4d621e6c652098f3e4929..3b671c5b4cc3b825d2fc44338926acb860657533 100644
--- a/applications/utilities/miscellaneous/foamInfoExec/foamInfoExec.C
+++ b/applications/utilities/miscellaneous/foamInfoExec/foamInfoExec.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) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -23,6 +23,8 @@ License
 
 Application
     foamInfoExec
+    To simplify parsing of the output, The normal banner information
+    is suppressed.
 
 Group
     grpMiscUtilities
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/CMakeLists.txt b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/CMakeLists.txt
index fbaedcfb30a1122f68f888090b6ac8c66d513417..2761e18f4329a5212bcef25394d43c2dadcd6e71 100644
--- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/CMakeLists.txt
+++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/CMakeLists.txt
@@ -47,11 +47,14 @@ QT4_WRAP_CPP(MOC_SRCS pqPVFoamReaderPanel.h)
 
 ADD_PARAVIEW_OBJECT_PANEL(IFACES IFACE_SRCS
   CLASS_NAME pqPVFoamReaderPanel
-  XML_NAME  PVFoamReader  # name of SourceProxy in *SM.xml
+  XML_NAME  PVFoamReader                # name of SourceProxy in *SM.xml
   XML_GROUP sources
 )
 
-IF("${PARAVIEW_VERSION_MINOR}" EQUAL 0)
+# Separate GUI_RESOURCE_FILES deprecated with paraview 4.3
+# so check if version < 4.4
+
+IF(("${PARAVIEW_VERSION_MAJOR}" LESS 5) AND ("${PARAVIEW_VERSION_MINOR}" LESS 4))
     ADD_PARAVIEW_PLUGIN(
         PVFoamReader_SM "1.0"
         SERVER_MANAGER_XML PVFoamReader_SM.xml
@@ -61,7 +64,7 @@ IF("${PARAVIEW_VERSION_MINOR}" EQUAL 0)
             ${MOC_SRCS} ${UI_SRCS} ${IFACE_SRCS}
         GUI_RESOURCE_FILES PVFoamReader.xml
     )
-ELSE("${PARAVIEW_VERSION_MINOR}" EQUAL 0)
+ELSE()
     ADD_PARAVIEW_PLUGIN(
         PVFoamReader_SM "1.0"
         SERVER_MANAGER_XML PVFoamReader_SM.xml
@@ -70,7 +73,7 @@ ELSE("${PARAVIEW_VERSION_MINOR}" EQUAL 0)
         GUI_SOURCES pqPVFoamReaderPanel.cxx
             ${MOC_SRCS} ${UI_SRCS} ${IFACE_SRCS}
     )
-ENDIF("${PARAVIEW_VERSION_MINOR}" EQUAL 0)
+ENDIF()
 
 TARGET_LINK_LIBRARIES(
     PVFoamReader_SM
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/PVFoamReader.xml b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/PVFoamReader.xml
index aef46449b349bae63421e3177a6287a041c24a40..5507293c67bd74b9dbe0363ce396797a3ea4fc6a 100644
--- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/PVFoamReader.xml
+++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/PVFoamReader.xml
@@ -1,4 +1,5 @@
 <ParaViewReaders>
+  <!-- deprecated with paraview-4.3, use hints in *SM.xml -->
   <Reader name="PVFoamReader"
           extensions="OpenFOAM"
           file_description="OpenFOAM Reader">
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/Make/options b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/Make/options
index a78b301d97e675bbe65bedacec923e44d47735d4..a2bd6aa18d8d16b41bdec584a4a24697d389d0a1 100644
--- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/Make/options
+++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/Make/options
@@ -1,18 +1,12 @@
-/* Note: enable vtkPolyhedron when available */
-
 EXE_INC = \
     -I$(LIB_SRC)/meshTools/lnInclude \
     -I$(LIB_SRC)/finiteVolume/lnInclude \
     -I$(LIB_SRC)/dynamicMesh/lnInclude \
     -I$(LIB_SRC)/lagrangian/basic/lnInclude \
-    -I../../vtkPVReaders/lnInclude \
-    -I../PVFoamReader \
     -I$(ParaView_INCLUDE_DIR) \
     -I$(ParaView_INCLUDE_DIR)/vtkkwiml \
-    $(shell \
-        test -f $(ParaView_INCLUDE_DIR)/vtkPolyhedron.h && \
-        echo "-DHAS_VTK_POLYHEDRON" || echo "-UHAS_VTK_POLYHEDRON" \
-    )
+    -I../../vtkPVReaders/lnInclude \
+    -I../PVFoamReader
 
 LIB_LIBS = \
     -lmeshTools \
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMeshVolume.C b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMeshVolume.C
index c4a52dbc98bc3fbd7dd9a2c13b84e3ff6bdda557..1d7b732339a403196540eb829c6f1a0190bf16d1 100644
--- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMeshVolume.C
+++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMeshVolume.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -275,7 +275,6 @@ vtkUnstructuredGrid* Foam::vtkPVFoam::volumeVTKMesh
             // Polyhedral cell - use VTK_POLYHEDRON
             const labelList& cFaces = mesh.cells()[cellI];
 
-#ifdef HAS_VTK_POLYHEDRON
             vtkIdType nFaces = cFaces.size();
             vtkIdType nLabels = nFaces;
 
@@ -320,33 +319,6 @@ vtkUnstructuredGrid* Foam::vtkPVFoam::volumeVTKMesh
             }
 
             vtkmesh->InsertNextCell(VTK_POLYHEDRON, nFaces, faceStream.data());
-#else
-            // this is a horrible substitute
-            // but avoids crashes when there is no vtkPolyhedron support
-
-            // establish unique node ids used
-            HashSet<vtkIdType, Hash<label>> hashUniqId(2*256);
-
-            forAll(cFaces, cFaceI)
-            {
-                const face& f = mesh.faces()[cFaces[cFaceI]];
-
-                forAll(f, fp)
-                {
-                    hashUniqId.insert(f[fp]);
-                }
-            }
-
-            // use face stream to store unique node ids:
-            faceStream = hashUniqId.sortedToc();
-
-            vtkmesh->InsertNextCell
-            (
-                VTK_CONVEX_POINT_SET,
-                vtkIdType(faceStream.size()),
-                faceStream.data()
-            );
-#endif
         }
         else
         {
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/PVblockMeshReader/CMakeLists.txt b/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/PVblockMeshReader/CMakeLists.txt
index 2b28dafd1ae7b7388d20a1b4a93f8ada1566ea5d..78832c57599b4c350bea4daf02a65aea2cdbc559 100644
--- a/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/PVblockMeshReader/CMakeLists.txt
+++ b/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/PVblockMeshReader/CMakeLists.txt
@@ -46,13 +46,16 @@ QT4_WRAP_CPP(MOC_SRCS pqPVblockMeshReaderPanel.h)
 
 ADD_PARAVIEW_OBJECT_PANEL(IFACES IFACE_SRCS
   CLASS_NAME pqPVblockMeshReaderPanel
-  XML_NAME  PVblockMeshReader # name of SourceProxy in *SM.xml
+  XML_NAME  PVblockMeshReader           # name of SourceProxy in *SM.xml
   XML_GROUP sources
 )
 
-IF("${PARAVIEW_VERSION_MINOR}" EQUAL 0)
-        ADD_PARAVIEW_PLUGIN(
-            PVblockMeshReader_SM "1.0"
+# Separate GUI_RESOURCE_FILES deprecated with paraview 4.3
+# so check if version < 4.4
+
+IF(("${PARAVIEW_VERSION_MAJOR}" LESS 5) AND ("${PARAVIEW_VERSION_MINOR}" LESS 4))
+    ADD_PARAVIEW_PLUGIN(
+        PVblockMeshReader_SM "1.0"
         SERVER_MANAGER_XML PVblockMeshReader_SM.xml
         SERVER_MANAGER_SOURCES  vtkPVblockMeshReader.cxx
         GUI_INTERFACES ${IFACES}
@@ -60,16 +63,16 @@ IF("${PARAVIEW_VERSION_MINOR}" EQUAL 0)
             ${MOC_SRCS} ${UI_SRCS} ${IFACE_SRCS}
         GUI_RESOURCE_FILES PVblockMeshReader.xml
     )
-ELSE("${PARAVIEW_VERSION_MINOR}" EQUAL 0)
-        ADD_PARAVIEW_PLUGIN(
-            PVblockMeshReader_SM "1.0"
+ELSE()
+    ADD_PARAVIEW_PLUGIN(
+        PVblockMeshReader_SM "1.0"
         SERVER_MANAGER_XML PVblockMeshReader_SM.xml
         SERVER_MANAGER_SOURCES  vtkPVblockMeshReader.cxx
         GUI_INTERFACES ${IFACES}
         GUI_SOURCES pqPVblockMeshReaderPanel.cxx
             ${MOC_SRCS} ${UI_SRCS} ${IFACE_SRCS}
     )
-ENDIF("${PARAVIEW_VERSION_MINOR}" EQUAL 0)
+ENDIF()
 
 # Build the client-side plugin
 
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/PVblockMeshReader/PVblockMeshReader.xml b/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/PVblockMeshReader/PVblockMeshReader.xml
index 18413ee30078159f21ba6ecf801861b251f67f59..9354a13525226607a3785092249488fa1f5f2839 100644
--- a/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/PVblockMeshReader/PVblockMeshReader.xml
+++ b/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/PVblockMeshReader/PVblockMeshReader.xml
@@ -1,4 +1,5 @@
 <ParaViewReaders>
+  <!-- deprecated with paraview-4.3, use hints in *SM.xml -->
   <Reader name="PVblockMeshReader"
       extensions="blockMesh"
       file_description="OpenFOAM blockMesh reader">
diff --git a/applications/utilities/postProcessing/miscellaneous/foamListTimes/foamListTimes.C b/applications/utilities/postProcessing/miscellaneous/foamListTimes/foamListTimes.C
index 553f9f7f52dbe6f50e72b5c48e178cf18268f061..3e20143e1b396319e17e91d3f2950411eb64b90c 100644
--- a/applications/utilities/postProcessing/miscellaneous/foamListTimes/foamListTimes.C
+++ b/applications/utilities/postProcessing/miscellaneous/foamListTimes/foamListTimes.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) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -29,6 +29,8 @@ Group
 
 Description
     List times using timeSelector.
+    To simplify parsing of the output, the normal banner information
+    is suppressed.
 
 Usage
 
diff --git a/applications/utilities/postProcessing/noise/Allwmake b/applications/utilities/postProcessing/noise/Allwmake
new file mode 100755
index 0000000000000000000000000000000000000000..84c6a2ac82197aa7cd4847a64dfaca1ec021e44a
--- /dev/null
+++ b/applications/utilities/postProcessing/noise/Allwmake
@@ -0,0 +1,14 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+if [ -f "$FFTW_ARCH_PATH/include/fftw3.h" ] || \
+   [ "${FFTW_ARCH_PATH##*-}" = system -a -f "/usr/include/fftw3.h" ]
+then
+    wmake
+else
+    echo
+    echo "Skipping noise utility (no FFTW)"
+    echo
+fi
+
+#------------------------------------------------------------------------------
diff --git a/applications/utilities/postProcessing/noise/Make/options b/applications/utilities/postProcessing/noise/Make/options
index b29b939580748d59669a36947c8687210c2b4bc5..2fc476e7419aac049558489d7c1cf86e69f36933 100644
--- a/applications/utilities/postProcessing/noise/Make/options
+++ b/applications/utilities/postProcessing/noise/Make/options
@@ -1,6 +1,7 @@
 EXE_INC = \
     -I$(LIB_SRC)/randomProcesses/lnInclude \
-    -I$(LIB_SRC)/sampling/lnInclude
+    -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/surfMesh/lnInclude
 
 EXE_LIBS = \
     -lrandomProcesses \
diff --git a/applications/utilities/postProcessing/noise/noise.C b/applications/utilities/postProcessing/noise/noise.C
index 1b0ca07fec6c8f66e7b6569c2ef78e7d131439fa..4f9b1948a6101dfd11e1983806517ee7c8156f8f 100644
--- a/applications/utilities/postProcessing/noise/noise.C
+++ b/applications/utilities/postProcessing/noise/noise.C
@@ -2,8 +2,8 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+    \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -28,157 +28,103 @@ Group
     grpPostProcessingUtilities
 
 Description
-    Utility to perform noise analysis of pressure data using the noiseFFT
-    library.
+    Utility to perform noise analysis of pressure data.
 
-    Control settings are read from the $FOAM_CASE/system/noiseDict dictionary,
-    or user-specified dictionary using the -dict option.  Pressure data is
-    read using a CSV reader:
+    The utility provides a light wrapper around the run-time selectable
+    noise model.  Current options include:
+    - point, and
+    - surface noise.
 
-    \heading Usage
+    \heading Example usage
 
     \verbatim
-    pRef        101325;
-    N           65536;
-    nw          100;
-    f1          25;
-    fU          10000;
-    graphFormat raw;
-
-    pressureData
+    noiseModel      surfaceNoise; // pointNoise
+
+    surfaceNoiseCoeffs
     {
-        fileName        "pressureData"
-        nHeaderLine         1;          // number of header lines
-        refColumn           0;          // reference column index
-        componentColumns    (1);        // component column indices
-        separator           " ";        // optional (defaults to ",")
-        mergeSeparators     no;         // merge multiple separators
-        outOfBounds         clamp;      // optional out-of-bounds handling
-        interpolationScheme linear;     // optional interpolation scheme
+        windowModel     Hanning;
+
+        HanningCoeffs
+        {
+            // Window overlap percentage
+            overlapPercent  50;
+            symmetric       yes;
+            extended        yes;
+
+            // Optional number of windows, default = all available
+            nWindow         5;
+        }
+
+
+        // Input file
+        inputFile   "postProcessing/faceSource1/surface/patch/patch.case";
+
+        // Surface reader
+        reader      ensight;
+
+        // Surface writer
+        writer      ensight;
+
+        // Collate times for ensight output - ensures geometry is only written once
+        writeOptions
+        {
+            ensight
+            {
+                collateTimes true;
+            }
+        }
+
+        // Number of samples in sampling window
+        // Must be a power of 2, default = 2^16 (=65536)
+        N               4096;
+
+        // Write interval for FFT data, default = 1
+        fftWriteInterval 100;
     }
     \endverbatim
 
-    where
-    \table
-        Property    | Description                   | Required  | Default value
-        pRef        | Reference pressure            | no        | 0
-        N           | Number of samples in sampling window | no | 65536
-        nw          | Number of sampling windows    | no        | 100
-        fl          | Lower frequency band          | no        | 25
-        fU          | Upper frequency band          | no        | 10000
-        graphFormat | Output graph format          | no        | raw
-    \endtable
-
-    Current graph outputs include:
-    - FFT of the pressure data
-    - narrow-band PFL (pressure-fluctuation level) spectrum
-    - one-third-octave-band PFL spectrum
-    - one-third-octave-band pressure spectrum
 
 SeeAlso
-    CSV.H
     noiseFFT.H
+    noiseModel.H
+    windowModel.H
 
 \*---------------------------------------------------------------------------*/
 
-
-#include "noiseFFT.H"
 #include "argList.H"
 #include "Time.H"
-#include "functionObjectFile.H"
-#include "CSV.H"
+#include "noiseModel.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 using namespace Foam;
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-Foam::scalar checkUniformTimeStep(const scalarField& t)
-{
-    // check that a uniform time step has been applied
-    scalar deltaT = -1.0;
-    if (t.size() > 1)
-    {
-        for (label i = 1; i < t.size(); i++)
-        {
-            scalar dT = t[i] - t[i-1];
-            if (deltaT < 0)
-            {
-                deltaT = dT;
-            }
-
-            if (mag(deltaT - dT) > SMALL)
-            {
-                FatalErrorInFunction
-                    << "Unable to process data with a variable time step"
-                    << exit(FatalError);
-            }
-        }
-    }
-    else
-    {
-        FatalErrorInFunction
-            << "Unable to create FFT with a single value"
-            << exit(FatalError);
-    }
-
-    return deltaT;
-}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 int main(int argc, char *argv[])
 {
-    argList::noParallel();
     #include "addDictOption.H"
     #include "setRootCase.H"
     #include "createTime.H"
-    #include "createFields.H"
 
-    Info<< "Reading data file" << endl;
-    Function1Types::CSV<scalar> pData("pressure", dict, "Data");
-
-    // time history data
-    const scalarField t(pData.x());
-
-    // pressure data
-    const scalarField p(pData.y());
-
-    if (t.size() < N)
+    fileName dictName(runTime.system()/"noiseDict");
+    if (args.optionFound("dict"))
     {
-        FatalErrorInFunction
-            << "Block size N = " << N
-            << " is larger than number of data = " << t.size()
-            << exit(FatalError);
+        dictName = args["dict"];
     }
 
-    Info<< "    read " << t.size() << " values" << nl << endl;
-
-
-    Info<< "Creating noise FFT" << endl;
-    noiseFFT nfft(checkUniformTimeStep(t), p);
-
-    nfft -= pRef;
-
-    fileName baseFileName(pData.fName().lessExt());
-
-    graph Pf(nfft.RMSmeanPf(N, min(nfft.size()/N, nw)));
-    Info<< "    Creating graph for " << Pf.title() << endl;
-    Pf.write(baseFileName + graph::wordify(Pf.title()), graphFormat);
-
-    graph Lf(nfft.Lf(Pf));
-    Info<< "    Creating graph for " << Lf.title() << endl;
-    Lf.write(baseFileName + graph::wordify(Lf.title()), graphFormat);
-
-    graph Ldelta(nfft.Ldelta(Lf, f1, fU));
-    Info<< "    Creating graph for " << Ldelta.title() << endl;
-    Ldelta.write(baseFileName + graph::wordify(Ldelta.title()), graphFormat);
-
-    graph Pdelta(nfft.Pdelta(Pf, f1, fU));
-    Info<< "    Creating graph for " << Pdelta.title() << endl;
-    Pdelta.write(baseFileName + graph::wordify(Pdelta.title()), graphFormat);
+    IOdictionary dict
+    (
+        IOobject
+        (
+            dictName,
+            runTime,
+            IOobject::MUST_READ
+        )
+    );
+
+    autoPtr<noiseModel> model(noiseModel::New(dict));
+    model->calculate();
 
     Info<< nl << "End\n" << endl;
 
diff --git a/applications/utilities/postProcessing/noise/noiseDict b/applications/utilities/postProcessing/noise/noiseDict
new file mode 100644
index 0000000000000000000000000000000000000000..95eedffff161de4806787493d683e86dd43aee88
--- /dev/null
+++ b/applications/utilities/postProcessing/noise/noiseDict
@@ -0,0 +1,136 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      noiseDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+noiseModel      surfaceNoise;
+
+surfaceNoiseCoeffs
+{
+    windowModel     Hanning;
+
+    HanningCoeffs
+    {
+        // Window overlap percentage
+        overlapPercent  50;
+        symmetric       yes;
+        extended        yes;
+
+        // Optional number of windows, default = all available
+        // nWindow         1;
+    }
+
+/*
+    windowModel     uniform;
+
+    uniformCoeffs
+    {
+        // Window overlap percentage
+        overlapPercent  50;
+
+        value           1;
+
+        // Optional number of windows, default = all available
+        // nWindow         1;
+    }
+*/
+
+
+    // Input file
+    inputFile   "postProcessing/faceSource1/surface/patch_motorBike_rider-helmet%65/patch_motorBike_rider-helmet%65.case";
+
+    // Surface reader
+    reader      ensight;
+
+    // Surface writer
+    writer      ensight;
+
+    // Collate times for ensight output - ensures geometry is only written once
+    writeOptions
+    {
+        ensight
+        {
+            collateTimes true;
+        }
+    }
+
+    // Reference density (to convert from kinematic to static pressure)
+    rhoRef          1.205;
+
+    // Number of samples in sampling window
+    // Must be a power of 2, default = 2^16 (=65536)
+    N               4096; // 8192; // 4096;
+
+    // Lower frequency limit, default = 25Hz
+    //fl              25;
+
+    // Upper frequency limit, default = 10kHz
+    fu              15000;
+
+    // Start time, default = 0s
+    //startTime       0;
+
+    // Write interval for FFT data, default = 1
+//    fftWriteInterval 100;
+}
+
+pointNoiseCoeffs
+{
+    csvFileData
+    {
+        fileName        "pressureData";
+        nHeaderLine     1;
+        refColumn       0;
+        componentColumns (1);
+        separator       " ";
+        mergeSeparators yes;
+    }
+
+    HanningCoeffs
+    {
+        // Window overlap percentage
+        overlapPercent  50;
+        symmetric       yes;
+        extended        yes;
+
+        // Optional number of windows, default = all available
+        //nWindow         5;
+    }
+
+    // Graph format, default = raw
+    graphFormat     raw;
+
+    // Reference density (to convert from kinematic to static pressure)
+    rhoRef          1.2;
+
+    // Number of samples in sampling window
+    // Must be a power of 2, default = 2^16 (=65536)
+    N               4096;
+
+    // Lower frequency limit, default = 25Hz
+    //fl              25;
+
+    // Upper frequency limit, default = 10kHz
+    //fu              10000;
+
+    // Start time, default = 0s
+    //startTime       0;
+
+    // Write interval for FFT data, default = 1
+    fftWriteInterval 100;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/utilities/postProcessing/sampling/sample/sampleDict b/applications/utilities/postProcessing/sampling/sample/sampleDict
index 8e77428d6ac0d42bd551a0ab8751016704a53a45..541911cfc08ecae2d3f41ca682683a7eb8b73451 100644
--- a/applications/utilities/postProcessing/sampling/sample/sampleDict
+++ b/applications/utilities/postProcessing/sampling/sample/sampleDict
@@ -71,7 +71,7 @@ formatOptions
     {
         // ascii/binary format
         format  ascii;
-        //collateTimes true;  // write single file containing multiple timesteps
+        collateTimes true;    // write single file containing multiple timesteps
                               // (only for static surfaces)
     }
     vtk
diff --git a/applications/utilities/preProcessing/boxTurb/Allwmake b/applications/utilities/preProcessing/boxTurb/Allwmake
new file mode 100755
index 0000000000000000000000000000000000000000..46d04eebf53d77b99725437e3b5094b842f992cc
--- /dev/null
+++ b/applications/utilities/preProcessing/boxTurb/Allwmake
@@ -0,0 +1,14 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+if [ -f "$FFTW_ARCH_PATH/include/fftw3.h" ] || \
+   [ "${FFTW_ARCH_PATH##*-}" = system -a -f "/usr/include/fftw3.h" ]
+then
+    wmake
+else
+    echo
+    echo "Skipping boxTurb utility (no FFTW)"
+    echo
+fi
+
+#------------------------------------------------------------------------------
diff --git a/applications/utilities/surface/surfaceMeshInfo/surfaceMeshInfo.C b/applications/utilities/surface/surfaceMeshInfo/surfaceMeshInfo.C
index 3ea27c4f8b677b92260c7254055196bc18b1200e..0bc6fb59922ef89cbcae2bf8a8e126108887788e 100644
--- a/applications/utilities/surface/surfaceMeshInfo/surfaceMeshInfo.C
+++ b/applications/utilities/surface/surfaceMeshInfo/surfaceMeshInfo.C
@@ -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) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -29,6 +29,8 @@ Group
 
 Description
     Miscellaneous information about surface meshes.
+    To simplify parsing of the output, the normal banner information
+    is suppressed.
 
 Usage
     - surfaceMeshInfo surfaceFile [OPTION]
diff --git a/bin/engridFoam b/bin/engridFoam
deleted file mode 100755
index 42acafdb65e0b1779d2dfba2709e942bf0454ef3..0000000000000000000000000000000000000000
--- a/bin/engridFoam
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/bin/sh
-#------------------------------------------------------------------------------
-# =========                 |
-# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-#  \\    /   O peration     |
-#   \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
-#    \\/     M anipulation  |
-#-------------------------------------------------------------------------------
-# License
-#     This file is part of OpenFOAM.
-#
-#     OpenFOAM is free software: you can redistribute it and/or modify it
-#     under the terms of the GNU General Public License as published by
-#     the Free Software Foundation, either version 3 of the License, or
-#     (at your option) any later version.
-#
-#     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-#     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-#     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-#     for more details.
-#
-#     You should have received a copy of the GNU General Public License
-#     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
-#
-# Script
-#     engridFoam
-#
-# Description
-#     start engrid using the paraview libraries from OpenFOAM
-#
-#------------------------------------------------------------------------------
-usage() {
-    exec 1>&2
-    while [ "$#" -ge 1 ]; do echo "$1"; shift; done
-    cat<<USAGE
-
-Usage: ${0##*/} [OPTION]
-options:
-  -help
-
-* start engrid using the paraview-$ParaView_MAJOR libraries
-  passes through engrid options unmodified
-
-USAGE
-    exit 1
-}
-
-# report usage
-[ "$1" = "-h" -o "$1" = "-help" ] && usage
-
-bindir=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/engrid
-libdir="$ParaView_DIR/lib/paraview-${ParaView_MAJOR:-unknown}"
-
-[ -x $bindir/engrid ] || usage "engrid executable not found in $bindir"
-[ -d $libdir ] || usage "paraview libraries not found"
-
-export LD_LIBRARY_PATH=$libdir:$LD_LIBRARY_PATH
-echo "starting $bindir/engrid $@"
-eval "exec $bindir/engrid $@ &"
-
-#------------------------------------------------------------------------------
diff --git a/bin/paraFoam b/bin/paraFoam
index 84b82ecdbf8d05e49cebb92ae13d35adc2077db4..2b31fd379815fa14b97debac613ec48f0d0cb1fd 100755
--- a/bin/paraFoam
+++ b/bin/paraFoam
@@ -4,7 +4,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  |
+#    \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 #-------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM.
@@ -40,17 +40,18 @@ usage() {
 Usage: ${0##*/} [OPTION] [PARAVIEW_OPTION]
 options:
   -block            use blockMesh reader  (uses .blockMesh extension)
-  -builtin          use VTK builtin OpenFOAM reader  (uses .foam extension)
   -case <dir>       specify alternative case directory, default is the cwd
   -region <name>    specify alternative mesh region
   -touch            only create the file  (eg, .blockMesh, .OpenFOAM, etc)
   -touchAll         create .blockMesh, .OpenFOAM files (and for all regions)
+  -vtk | -builtin   use VTK builtin OpenFOAM reader  (uses .foam extension)
   -help             print the usage
 
+Paraview options start with a double dashes.
 
-paraview options start with a double dashes
+* start paraview with the OpenFOAM libraries
 
-* start paraview $ParaView_VERSION with the OpenFOAM libraries
+  paraview=$(command -v paraview)
 
 USAGE
     exit 1
@@ -67,10 +68,9 @@ unset regionName optTouch
 # already 2010-07)
 export LC_ALL=C
 
-# Reader extension
+# Reader extension and plugin
 extension=OpenFOAM
-
-requirePV=1
+plugin=PVFoamReader
 
 # Parse options
 while [ "$#" -gt 0 ]
@@ -81,11 +81,12 @@ do
         ;;
     -block | -blockMesh)
         extension=blockMesh
+        plugin=PVblockMeshReader
         shift
         ;;
-    -builtin)
+    -builtin | -vtk)
         extension=foam
-        requirePV=0
+        unset plugin
         shift
         ;;
     -case)
@@ -100,12 +101,12 @@ do
         ;;
     -touch)
         optTouch=true
-        requirePV=0
+        unset plugin
         shift
         ;;
     -touchAll)
         optTouch=all
-        requirePV=0
+        unset plugin
         shift
         ;;
     --)
@@ -116,26 +117,34 @@ do
         break    # Stop here, treat this and balance as paraview options
         ;;
     *)
-        usage "unknown option/argument: '$*'"
+        usage "unknown option/argument: '$1'"
         ;;
     esac
 done
 
-# Check that reader module has been built
-if [ $requirePV -eq 1 -a ! -f $PV_PLUGIN_PATH/libPVFoamReader_SM.so ]
-then
-    cat<< BUILDREADER
-
-FATAL ERROR: ParaView reader module libraries do not exist
+# If a reader module is needed, check that it exists
+[ -z "$plugin" -o -f $PV_PLUGIN_PATH/lib${plugin}_SM.so ] || {
+    cat<< BUILDREADER 1>&2
 
+ERROR: ParaView reader module library ($plugin) does not exist
 Please build the reader module before continuing:
-cd \$FOAM_UTILITIES/postProcessing/graphics/PVReaders
-./Allwclean
-./Allwmake
+
+    cd \$FOAM_UTILITIES/postProcessing/graphics/PVReaders
+    ./Allwclean
+    ./Allwmake
 
 BUILDREADER
-    exit 1
-fi
+
+    # Fallback to native reader, if possible
+    if [ "$extension" = OpenFOAM ]
+    then
+        extension=foam
+        echo "Using the native VTK/OpenFOAM reader instead" 1>&2
+    else
+        exit 1
+    fi
+}
+
 
 # Check for --data=... argument
 hasDataArg()
@@ -165,7 +174,7 @@ if [ -n "$regionName" ]
 then
     if [ ! -d constant/$regionName ]
     then
-        echo "FATAL ERROR: Region $regionName does not exist"
+        echo "FATAL ERROR: Region $regionName does not exist" 1>&2
         exit 1
     else
         caseFile="$caseName{$regionName}.$extension"
@@ -179,10 +188,10 @@ all)
     if [ -f system/blockMeshDict -o -f constant/polyMesh/blockMeshDict ]
     then
         touch "$caseName.blockMesh"
-        echo "Created '$caseName.blockMesh'"
+        echo "Created '$caseName.blockMesh'" 1>&2
     fi
     touch "$caseName.$extension"
-    echo "Created '$caseName.$extension'"
+    echo "Created '$caseName.$extension'" 1>&2
     # Discover probable regions
     for region in constant/*
     do
@@ -190,14 +199,14 @@ all)
         then
             regionName=${region##*/}
             touch "$caseName{$regionName}.$extension"
-            echo "Created '$caseName{$regionName}.$extension'"
+            echo "Created '$caseName{$regionName}.$extension'" 1>&2
         fi
     done
     exit 0
     ;;
 true)
     touch "$caseFile"
-    echo "Created '$caseFile'"
+    echo "Created '$caseFile'" 1>&2
     exit 0
     ;;
 esac
@@ -222,14 +231,14 @@ else
     warn="WARN file does not exist:"
     case $extension in
         blockMesh)
-            blockMeshDictDir=system/blockMeshDict
+            blockMeshDict=system/blockMeshDict
             if [ -f constant/polyMesh/blockMeshDict ]
             then
-                blockMeshDictDir=constant/polyMesh/blockMeshDict
+                blockMeshDict=constant/polyMesh/blockMeshDict
             fi
             for check in \
                 system/controlDict \
-                    $blockMeshDictDir \
+                    $blockMeshDict \
                 ;
             do
                 [ -s "$parentDir/$check" ] || {
@@ -240,7 +249,7 @@ else
             done
             ;;
 
-        builtin | OpenFOAM)
+        OpenFOAM)
             for check in \
                 system/controlDict \
                     $fvControls/fvSchemes \
@@ -268,7 +277,7 @@ else
     [ -e $caseFile ] || {
         trap "rm -f $caseFile 2>/dev/null; exit 0" EXIT TERM INT
         touch "$caseFile"
-        echo "Created temporary '$caseFile'"
+        echo "Created temporary '$caseFile'" 1>&2
     }
 
     # For now filter out any ld.so errors. Caused by non-system compiler?
diff --git a/etc/config.csh/CGAL b/etc/config.csh/CGAL
index 5371099a251cd595f4446c04eac57303564cc73c..2fd06120eb67550b22e6a5ad752a89238c22abc8 100644
--- a/etc/config.csh/CGAL
+++ b/etc/config.csh/CGAL
@@ -50,7 +50,7 @@
 #
 #------------------------------------------------------------------------------
 
-set boost_version=boost-system
+set boost_version=boost_1_61_0
 set cgal_version=CGAL-4.8
 
 setenv BOOST_ARCH_PATH $WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$boost_version
diff --git a/etc/config.csh/FFTW b/etc/config.csh/FFTW
index 514216e1bff676f8955c876296cd9a8f1a51c393..78d24e17b10babd88ffaa80f18a058c0dd157a8a 100644
--- a/etc/config.csh/FFTW
+++ b/etc/config.csh/FFTW
@@ -48,7 +48,7 @@
 #
 #------------------------------------------------------------------------------
 
-set fftw_version=fftw-system
+set fftw_version=fftw-3.3.4
 
 setenv FFTW_ARCH_PATH $WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$fftw_version
 
diff --git a/etc/config.sh/CGAL b/etc/config.sh/CGAL
index afb178d709f1813ef172905e6bec59d1e5b66503..e23164d2c920402a636f6921a2500c5f89461434 100644
--- a/etc/config.sh/CGAL
+++ b/etc/config.sh/CGAL
@@ -49,7 +49,7 @@
 #         - the LD_LIBRARY_PATH is not adjusted.
 #------------------------------------------------------------------------------
 
-boost_version=boost-system
+boost_version=boost_1_61_0
 cgal_version=CGAL-4.8
 
 export BOOST_ARCH_PATH=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$boost_version
diff --git a/etc/config.sh/FFTW b/etc/config.sh/FFTW
index 74115fccfcaafaea1f2406394741a085a3c285c2..7c0a48861d18f46df946629b0996f97baa014924 100644
--- a/etc/config.sh/FFTW
+++ b/etc/config.sh/FFTW
@@ -47,7 +47,7 @@
 #         - the LD_LIBRARY_PATH is not adjusted.
 #------------------------------------------------------------------------------
 
-fftw_version=fftw-system
+fftw_version=fftw-3.3.4
 
 export FFTW_ARCH_PATH=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$fftw_version
 
diff --git a/etc/config.sh/libccmio b/etc/config.sh/ccmio
similarity index 98%
rename from etc/config.sh/libccmio
rename to etc/config.sh/ccmio
index 1ef420564042ea7555e4175a281bcf6d3fd5fb90..6bd6aa42aca28f02677428a2aadbde5bcbd51ce2 100644
--- a/etc/config.sh/libccmio
+++ b/etc/config.sh/ccmio
@@ -22,7 +22,7 @@
 #     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
 #
 # File
-#     etc/config.sh/libccmio
+#     etc/config.sh/ccmio
 #
 # Description
 #     Setup file for libccmio include/libraries.
diff --git a/etc/config.sh/functions b/etc/config.sh/functions
index dcec6549d474c5ac2eaeb6a943dd24c18162c8f0..026755edc4f3e16a695779dac3e0051e7e93ba35 100644
--- a/etc/config.sh/functions
+++ b/etc/config.sh/functions
@@ -116,7 +116,7 @@ else
     # Cleanup environment:
     # ~~~~~~~~~~~~~~~~~~~~
     unset WM_BASH_FUNCTIONS
-    unset _foamAddPath _foamAddLib _foamAddMan
-    unset _foamSource _foamEval
+    unset -f _foamAddPath _foamAddLib _foamAddMan
+    unset -f _foamSource _foamEval
 
 fi
diff --git a/src/Allwmake b/src/Allwmake
index e07067fb6651de95cca646b2370beeb7267938be..cc3d1b89b75d46321fd0dff27d507eb6d2e07094 100755
--- a/src/Allwmake
+++ b/src/Allwmake
@@ -58,10 +58,9 @@ wmake $targetType sampling
 
 # Compile scotchDecomp, metisDecomp etc.
 parallel/Allwmake $targetType $*
+randomProcesses/Allwmake $targetType $*
 
 wmake $targetType ODE
-wmake $targetType randomProcesses
-
 wmake $targetType fvMotionSolver
 
 transportModels/Allwmake $targetType $*
diff --git a/src/conversion/Make/files b/src/conversion/Make/files
index 7c5a0aa91c070a5903667e22ed7a76f864bfee0e..b4a38476a1f36cf356a883a6a8d44a59a1cdacf9 100644
--- a/src/conversion/Make/files
+++ b/src/conversion/Make/files
@@ -1,5 +1,6 @@
 ensight/file/ensightFile.C
 ensight/file/ensightGeoFile.C
+ensight/readFile/ensightReadFile.C
 ensight/part/ensightPart.C
 ensight/part/ensightPartIO.C
 ensight/part/ensightPartCells.C
diff --git a/src/conversion/ensight/file/ensightFile.C b/src/conversion/ensight/file/ensightFile.C
index 700b39c014f7b1770096bf19c50fdcda085a9a6f..05003b2a0029dc54cb5661ecfc6ee04c1e4dbc3a 100644
--- a/src/conversion/ensight/file/ensightFile.C
+++ b/src/conversion/ensight/file/ensightFile.C
@@ -281,14 +281,15 @@ Foam::Ostream& Foam::ensightFile::writeKeyword(const keyType& key)
 {
     if (allowUndef_)
     {
-        write(string(key + " undef"));
+        write(string(static_cast<const string&>(key) + " undef"));
         newline();
         write(undefValue_);
         newline();
     }
     else
     {
-        write(key);
+        // ensure we get ensightFile::write(const string&)
+        write(static_cast<const string&>(key));
         newline();
     }
     return *this;
diff --git a/src/conversion/ensight/file/ensightGeoFile.C b/src/conversion/ensight/file/ensightGeoFile.C
index 9c0ceecdf93a6fb35af90dc4af36d0079c09c60b..c52aa79356a3270bc85ba9d1c04b1a7614262954 100644
--- a/src/conversion/ensight/file/ensightGeoFile.C
+++ b/src/conversion/ensight/file/ensightGeoFile.C
@@ -25,8 +25,6 @@ License
 
 #include "ensightGeoFile.H"
 
-#include "IOstreams.H"
-
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
 void Foam::ensightGeoFile::initialize()
@@ -76,10 +74,8 @@ Foam::ensightGeoFile::~ensightGeoFile()
 
 Foam::Ostream& Foam::ensightGeoFile::writeKeyword(const keyType& key)
 {
-    // Note: make sure to hit ensightFile::write(const string&)
-    write(string(key));
-
-    newline();
+    // ensure we get ensightFile::write(const string&)
+    write(static_cast<const string&>(key)); newline();
 
     return *this;
 }
diff --git a/src/conversion/ensight/readFile/ensightReadFile.C b/src/conversion/ensight/readFile/ensightReadFile.C
new file mode 100644
index 0000000000000000000000000000000000000000..f73d95199e541aeb42939407a3296de95a91cc7d
--- /dev/null
+++ b/src/conversion/ensight/readFile/ensightReadFile.C
@@ -0,0 +1,157 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "ensightReadFile.H"
+#include <sstream>
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::ensightReadFile::ensightReadFile
+(
+    const fileName& pathname,
+    IOstream::streamFormat format
+)
+:
+    IFstream(pathname, format)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::ensightReadFile::~ensightReadFile()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+Foam::Istream& Foam::ensightReadFile::read
+(
+    char* buf,
+    std::streamsize count
+)
+{
+    stdStream().read(buf, count);
+    return *this;
+}
+
+
+Foam::Istream& Foam::ensightReadFile::read(string& value)
+{
+    if (format() == IOstream::BINARY)
+    {
+        char buf[80];
+
+        read(reinterpret_cast<char*>(buf), sizeof(buf));
+
+        string strBuf(value);
+
+        const size_t iEnd = strBuf.find('\0', 0);
+        if (iEnd == string::npos)
+        {
+            value = buf;
+        }
+        else
+        {
+            value = strBuf.substr(0, iEnd - 1);
+        }
+    }
+    else
+    {
+        value = "";
+        while (value.empty() && !eof())
+        {
+            getLine(value);
+        }
+    }
+
+    return *this;
+}
+
+
+Foam::Istream& Foam::ensightReadFile::read(label& value)
+{
+    int ivalue;
+
+    if (format() == IOstream::BINARY)
+    {
+        read
+        (
+            reinterpret_cast<char*>(&ivalue),
+            sizeof(ivalue)
+        );
+    }
+    else
+    {
+        stdStream() >> ivalue;
+    }
+
+    value = ivalue;
+    return *this;
+}
+
+
+Foam::Istream& Foam::ensightReadFile::read(scalar& value)
+{
+    float fvalue;
+
+    if (format() == IOstream::BINARY)
+    {
+        read
+        (
+            reinterpret_cast<char*>(&fvalue),
+            sizeof(fvalue)
+        );
+
+        value = fvalue;
+    }
+    else
+    {
+        stdStream() >> value;
+    }
+
+    return *this;
+}
+
+
+Foam::Istream& Foam::ensightReadFile::readKeyword(string& key)
+{
+    read(key);
+    return *this;
+}
+
+
+Foam::Istream& Foam::ensightReadFile::readBinaryHeader()
+{
+    if (format() == IOstream::BINARY)
+    {
+        string buffer;
+        read(buffer);
+    }
+
+    return *this;
+}
+
+
+// ************************************************************************* //
diff --git a/src/conversion/ensight/readFile/ensightReadFile.H b/src/conversion/ensight/readFile/ensightReadFile.H
new file mode 100644
index 0000000000000000000000000000000000000000..aa6723352bc1a3f1b5cd132410dc90073bfd1564
--- /dev/null
+++ b/src/conversion/ensight/readFile/ensightReadFile.H
@@ -0,0 +1,110 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::ensightReadFile
+
+Description
+    Ensight output with specialized read() for strings, integers and floats.
+    Correctly handles binary read as well.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef ensightReadFile_H
+#define ensightReadFile_H
+
+#include "IFstream.H"
+#include "IOstream.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                       Class ensightReadFile Declaration
+\*---------------------------------------------------------------------------*/
+
+class ensightReadFile
+:
+    public IFstream
+{
+    // Private Member Functions
+
+        //- Disallow default bitwise assignment
+        void operator=(const ensightReadFile&);
+
+        //- Disallow default copy constructor
+        ensightReadFile(const ensightReadFile&);
+
+
+public:
+
+    // Constructors
+
+        //- Construct from pathname
+        ensightReadFile
+        (
+            const fileName& pathname,
+            IOstream::streamFormat format=IOstream::BINARY
+        );
+
+
+    //- Destructor
+    ~ensightReadFile();
+
+
+    // Output
+
+        //- Inherit read from Istream
+        using Istream::read;
+
+        //- Binary read
+        virtual Istream& read(char* buf, std::streamsize count);
+
+        //- Read string as "%80s" or as binary
+        Istream& read(string& value);
+
+        //- Read integer as "%10d" or as binary
+        Istream& read(label& value);
+
+        //- Read float as "%12.5e" or as binary
+        Istream& read(scalar& value);
+
+        //- Read element keyword
+        virtual Istream& readKeyword(string& key);
+
+        //- Read "C Binary" for binary files (eg, geometry/measured)
+        Istream& readBinaryHeader();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/turbulentDFSEMInlet/turbulentDFSEMInletFvPatchVectorField.C b/src/finiteVolume/fields/fvPatchFields/derived/turbulentDFSEMInlet/turbulentDFSEMInletFvPatchVectorField.C
index 23eaed91eb803461f92466754e787cd3eee467aa..b0df476fe0d279b1a48c0e2ef26c8c2e9bd6a53c 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/turbulentDFSEMInlet/turbulentDFSEMInletFvPatchVectorField.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/turbulentDFSEMInlet/turbulentDFSEMInletFvPatchVectorField.C
@@ -80,10 +80,14 @@ void Foam::turbulentDFSEMInletFvPatchVectorField::writeEddyOBJ() const
         //    label i2 = ((i + 1) % nPoint) + nPoint;
         //    os  << "l " << i1 << " " << i2 << nl;
         //}
-    }   
+    }
 
     {
-        OFstream os(db().time().path()/"eddies.obj");
+        const Time& time = db().time();
+        OFstream os
+        (
+            time.path()/"eddies_" + Foam::name(time.timeIndex()) + ".obj"
+        );
 
         label pointOffset = 0;
         forAll(eddies_, eddyI)
@@ -91,7 +95,7 @@ void Foam::turbulentDFSEMInletFvPatchVectorField::writeEddyOBJ() const
             const eddy& e = eddies_[eddyI];
             pointOffset += e.writeSurfaceOBJ(pointOffset, patchNormal_, os);
         }
-    }                 
+    }
 }
 
 
@@ -137,7 +141,7 @@ void Foam::turbulentDFSEMInletFvPatchVectorField::writeLumleyCoeffs() const
             scalar eta = sqrt(-ii/3.0);
             os  << xi << token::TAB << eta << token::TAB
                 << ii << token::TAB << iii << endl;
-        }    
+        }
     }
 
     // After interpolation
@@ -1103,7 +1107,7 @@ void Foam::turbulentDFSEMInletFvPatchVectorField::write(Ostream& os) const
     writeEntryIfDifferent(os, "d", 1.0, d_);
     writeEntryIfDifferent(os, "kappa", 0.41, kappa_);
     writeEntryIfDifferent(os, "perturb", 1e-5, perturb_);
-    writeEntryIfDifferent(os, "nCellPerEddy", 5, nCellPerEddy_);
+    writeEntryIfDifferent<label>(os, "nCellPerEddy", 5, nCellPerEddy_);
     writeEntryIfDifferent(os, "writeEddies", false, writeEddies_);
 
     if (!interpolateR_)
diff --git a/src/fvOptions/sources/derived/acousticDampingSource/acousticDampingSource.C b/src/fvOptions/sources/derived/acousticDampingSource/acousticDampingSource.C
index 7c9f27febc138522ec0f8218c9296175f07d2105..8b5cad4be5939e7925289b9abded8bce1b2ce7a9 100644
--- a/src/fvOptions/sources/derived/acousticDampingSource/acousticDampingSource.C
+++ b/src/fvOptions/sources/derived/acousticDampingSource/acousticDampingSource.C
@@ -67,9 +67,9 @@ void Foam::fv::acousticDampingSource::setBlendingFactor()
         {
             blendFactor_[celli] = 0.0;
         }
-        else if ((d >= r1_) && (d <= (r1_ + r2_)))
+        else if ((d >= r1_) && (d <= r2_))
         {
-            blendFactor_[celli] = (1.0 - cos(pi*mag(d - r1_)/r2_))/2.0;
+            blendFactor_[celli] = (1.0 - cos(pi*mag(d - r1_)/(r2_ - r1_)))/2.0;
         }
     }
 
@@ -206,6 +206,8 @@ bool Foam::fv::acousticDampingSource::read(const dictionary& dict)
             Info<< name_ << ": Setting stencil width to " << w_ << endl;
         }
 
+        setBlendingFactor();
+
         return true;
     }
     else
diff --git a/src/meshTools/coordinateSystems/coordinateRotation/EulerCoordinateRotation.H b/src/meshTools/coordinateSystems/coordinateRotation/EulerCoordinateRotation.H
index 6560a084a0cde32a953567deb2d917cdddb5b886..cdaee882322d7d95096c79d2e47fb062d453f81c 100644
--- a/src/meshTools/coordinateSystems/coordinateRotation/EulerCoordinateRotation.H
+++ b/src/meshTools/coordinateSystems/coordinateRotation/EulerCoordinateRotation.H
@@ -25,12 +25,17 @@ Class
     Foam::EulerCoordinateRotation
 
 Description
-    A coordinateRotation defined in the z-x-y Euler convention.
+    A coordinateRotation defined in the z-x-z (intrinsic) Euler convention.
+
+    The 3 rotations are defined in the Euler intrinsic convention
+    (around Z, around X' and around Z'').
+    The order of the parameter arguments matches this rotation order.
 
-    The 3 rotations are defined in the Euler convention
-    (around Z, around X' and around Z').
     For reference and illustration, see
     http://mathworld.wolfram.com/EulerAngles.html
+    and
+    https://en.wikipedia.org/wiki/Euler_angles#Conventions
+
     Note, however, that it is the reverse transformation
     (local->global) that is defined here.
 
diff --git a/src/postProcessing/functionObjects/utilities/Make/files b/src/postProcessing/functionObjects/utilities/Make/files
index 89186248875d555fddc9147ed8e60b2352c261ee..29ca6fe361cd309388fcafafd0542770a98be9ca 100644
--- a/src/postProcessing/functionObjects/utilities/Make/files
+++ b/src/postProcessing/functionObjects/utilities/Make/files
@@ -18,10 +18,8 @@ fluxSummary/fluxSummaryFunctionObject.C
 Lambda2/Lambda2.C
 Lambda2/Lambda2FunctionObject.C
 
-/*
 mapFields/mapFields.C
 mapFields/mapFieldsFunctionObject.C
-*/
 
 Peclet/Peclet.C
 Peclet/PecletFunctionObject.C
diff --git a/src/postProcessing/functionObjects/utilities/mapFields/IOmapFields.H b/src/postProcessing/functionObjects/utilities/mapFields/IOmapFields.H
new file mode 100644
index 0000000000000000000000000000000000000000..abcd07e3b2725d002c6d27f771c544c29c0a82df
--- /dev/null
+++ b/src/postProcessing/functionObjects/utilities/mapFields/IOmapFields.H
@@ -0,0 +1,49 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Typedef
+    Foam::IOmapFields
+
+Description
+    Instance of the generic IOOutputFilter for mapFields.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef IOmapFields_H
+#define IOmapFields_H
+
+#include "mapFields.H"
+#include "IOOutputFilter.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    typedef IOOutputFilter<mapFields> IOmapFields;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/utilities/mapFields/mapFields.C b/src/postProcessing/functionObjects/utilities/mapFields/mapFields.C
new file mode 100644
index 0000000000000000000000000000000000000000..136b321005745c00a6df2a0af20a265bdd0d9064
--- /dev/null
+++ b/src/postProcessing/functionObjects/utilities/mapFields/mapFields.C
@@ -0,0 +1,221 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "mapFields.H"
+#include "meshToMesh.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(mapFieldsFO, 0);
+}
+
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+void Foam::mapFieldsFO::createInterpolation(const dictionary& dict)
+{
+    const fvMesh& meshTarget = static_cast<const fvMesh&>(obr_);
+    const word mapRegionName(dict.lookup("mapRegion"));
+
+    if (log_)
+    {
+        Info<< name_ << ':' << nl
+            << "    Reading mesh " << mapRegionName << endl;
+    }
+
+    mapRegionPtr_.reset
+    (
+        new fvMesh
+        (
+            IOobject
+            (
+                mapRegionName,
+                meshTarget.time().constant(),
+                meshTarget.time()
+            )
+        )
+    );
+    const fvMesh& mapRegion = mapRegionPtr_();
+    word mapMethodName(dict.lookup("mapMethod"));
+    if (!meshToMesh::interpolationMethodNames_.found(mapMethodName))
+    {
+        FatalErrorInFunction
+            << type() << " " << name_ << ": unknown map method "
+            << mapMethodName << nl
+            << "Available methods include: "
+            << meshToMesh::interpolationMethodNames_.sortedToc()
+            << exit(FatalError);
+    }
+
+    meshToMesh::interpolationMethod mapMethod
+    (
+        meshToMesh::interpolationMethodNames_[mapMethodName]
+    );
+
+    // Lookup corresponding AMI method
+    word patchMapMethodName =
+        AMIPatchToPatchInterpolation::interpolationMethodToWord
+        (
+            meshToMesh::interpolationMethodAMI(mapMethod)
+        );
+
+    // Optionally override
+    if (dict.readIfPresent("patchMapMethod", patchMapMethodName))
+    {
+        if (log_)
+            Info<< "    Patch mapping method: " << patchMapMethodName << endl;
+    }
+
+    bool consistent = readBool(dict.lookup("consistent"));
+
+    if (log_) Info<< "    Creating mesh to mesh interpolation" << endl;
+
+    if (consistent)
+    {
+        interpPtr_.reset
+        (
+            new meshToMesh
+            (
+                mapRegion,
+                meshTarget,
+                mapMethodName,
+                patchMapMethodName
+            )
+        );
+    }
+    else
+    {
+        HashTable<word> patchMap(dict.lookup("patchMap"));
+        wordList cuttingPatches(dict.lookup("cuttingPatches"));
+
+        interpPtr_.reset
+        (
+            new meshToMesh
+            (
+                mapRegion,
+                meshTarget,
+                mapMethodName,
+                patchMapMethodName,
+                patchMap,
+                cuttingPatches
+            )
+        );
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::mapFieldsFO::mapFieldsFO
+(
+    const word& name,
+    const objectRegistry& obr,
+    const dictionary& dict,
+    const bool loadFromFiles
+)
+:
+    name_(name),
+    obr_(obr),
+    active_(true),
+    log_(true),
+    mapRegionPtr_(),
+    interpPtr_(),
+    fieldNames_()
+{
+    if (!isA<fvMesh>(obr_))
+    {
+        active_ = false;
+        WarningInFunction
+            << "No fvMesh available, deactivating " << name_ << nl
+            << endl;
+    }
+
+    read(dict);
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::mapFieldsFO::~mapFieldsFO()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::mapFieldsFO::read(const dictionary& dict)
+{
+    if (active_)
+    {
+        log_.readIfPresent("log", dict);
+        dict.lookup("fields") >> fieldNames_;
+
+        createInterpolation(dict);
+    }
+}
+
+
+void Foam::mapFieldsFO::execute()
+{}
+
+
+void Foam::mapFieldsFO::end()
+{}
+
+
+void Foam::mapFieldsFO::timeSet()
+{}
+
+
+void Foam::mapFieldsFO::write()
+{
+    if (active_)
+    {
+        if (log_) Info
+            << type() << " " << name_ << " output:" << nl;
+
+        bool ok = false;
+
+        ok = writeFieldType<scalar>() || ok;
+        ok = writeFieldType<vector>() || ok;
+        ok = writeFieldType<sphericalTensor>() || ok;
+        ok = writeFieldType<symmTensor>() || ok;
+        ok = writeFieldType<tensor>() || ok;
+
+        if (log_)
+        {
+            if (!ok)
+            {
+                Info<< "    none" << nl;
+            }
+
+            Info<< endl;
+        }
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/utilities/mapFields/mapFields.H b/src/postProcessing/functionObjects/utilities/mapFields/mapFields.H
new file mode 100644
index 0000000000000000000000000000000000000000..80c2ebe1193cf1b8580fad52c97c2438e0357b2c
--- /dev/null
+++ b/src/postProcessing/functionObjects/utilities/mapFields/mapFields.H
@@ -0,0 +1,200 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::mapFields
+
+Group
+    grpUtilitiesFunctionObjects
+
+Description
+    Map fields from local mesh to secondary mesh at run-time.
+
+    Example of function object specification to map fields:
+    \verbatim
+    mapFields1
+    {
+        type            mapFields;
+        functionObjectLibs ("libutilityFunctionObjects.so");
+        ...
+
+        mapRegion       coarseMesh;
+        mapMethod       cellVolumeWeight;
+        consistent      yes;
+
+        fields          ("U.*" p);
+    }
+
+    \heading Function object usage
+    \table
+        Property     | Description                | Required  | Default value
+        type         | Type name: mapFields       | yes       |
+        mapRgion     | Name of region to map to   | yes       |
+        mapMethod    | Mapping method             | yes       |
+        patchMapMethod | Patch mapping method     | no        | <auto>
+        consistent   | Mapping meshes have consistent boundaries | yes |
+        fields       | List of field names to map | yes       |
+        log          | Log to standard output     | no        | yes
+    \endtable
+
+
+SourceFiles
+    mapFields.C
+    IOmapFields.H
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef mapFieldsFO_H
+#define mapFieldsFO_H
+
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of classes
+class objectRegistry;
+class dictionary;
+class polyMesh;
+class mapPolyMesh;
+class meshToMesh;
+
+/*---------------------------------------------------------------------------*\
+                          Class mapFields Declaration
+\*---------------------------------------------------------------------------*/
+
+class mapFieldsFO
+{
+    // Private data
+
+        //- Name of this set of mapFields objects
+        word name_;
+
+        //- Reference to the database
+        const objectRegistry& obr_;
+
+        //- On/off switch
+        bool active_;
+
+        //- Switch to send output to Info as well as to file
+        Switch log_;
+
+        //- Locally cached map region mesh (map to this mesh)
+        autoPtr<fvMesh> mapRegionPtr_;
+
+        //- Mesh-to-mesh interpolation
+        autoPtr<meshToMesh> interpPtr_;
+
+        //- List of field names to interpolate
+        wordReList fieldNames_;
+
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        mapFieldsFO(const mapFieldsFO&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const mapFieldsFO&) = delete;
+
+        //- Helper function to create the mesh-to-mesh interpolation
+        void createInterpolation(const dictionary& dict);
+
+        //- Helper function to interpolate and write the fied
+        template<class Type>
+        bool writeFieldType() const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("mapFieldsFO");
+
+
+    // Constructors
+
+        //- Construct for given objectRegistry and dictionary.
+        //  Allow the possibility to load fields from files
+        mapFieldsFO
+        (
+            const word& name,
+            const objectRegistry&,
+            const dictionary&,
+            const bool loadFromFiles = false
+        );
+
+
+    //- Destructor
+    virtual ~mapFieldsFO();
+
+
+    // Member Functions
+
+        //- Return name of the set of mapFields
+        virtual const word& name() const
+        {
+            return name_;
+        }
+
+        //- Read the mapFields data
+        virtual void read(const dictionary&);
+
+        //- Execute, currently does nothing
+        virtual void execute();
+
+        //- Execute at the final time-loop, currently does nothing
+        virtual void end();
+
+        //- Called when time was set at the end of the Time::operator++
+        virtual void timeSet();
+
+        //- Calculate the mapFields and write
+        virtual void write();
+
+        //- Update for changes of mesh
+        virtual void updateMesh(const mapPolyMesh&)
+        {}
+
+        //- Update for changes of mesh
+        virtual void movePoints(const polyMesh&)
+        {}
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+    #include "mapFieldsTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/utilities/mapFields/mapFieldsFunctionObject.C b/src/postProcessing/functionObjects/utilities/mapFields/mapFieldsFunctionObject.C
new file mode 100644
index 0000000000000000000000000000000000000000..f9d94f7b517c6d282c6362aeb340a40c7d2f913d
--- /dev/null
+++ b/src/postProcessing/functionObjects/utilities/mapFields/mapFieldsFunctionObject.C
@@ -0,0 +1,42 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "mapFieldsFunctionObject.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineNamedTemplateTypeNameAndDebug(mapFieldsFunctionObject, 0);
+
+    addToRunTimeSelectionTable
+    (
+        functionObject,
+        mapFieldsFunctionObject,
+        dictionary
+    );
+}
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/utilities/mapFields/mapFieldsFunctionObject.H b/src/postProcessing/functionObjects/utilities/mapFields/mapFieldsFunctionObject.H
new file mode 100644
index 0000000000000000000000000000000000000000..087d93d230a82b979753c9889a8c0d4c1e67ecff
--- /dev/null
+++ b/src/postProcessing/functionObjects/utilities/mapFields/mapFieldsFunctionObject.H
@@ -0,0 +1,53 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Typedef
+    Foam::mapFieldsFunctionObject
+
+Description
+    FunctionObject wrapper around mapFields to allow it to be created
+    via the functions entry within controlDict.
+
+SourceFiles
+    mapFieldsFunctionObject.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef mapFieldsFunctionObject_H
+#define mapFieldsFunctionObject_H
+
+#include "mapFields.H"
+#include "OutputFilterFunctionObject.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    typedef OutputFilterFunctionObject<mapFieldsFO> mapFieldsFunctionObject;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/utilities/mapFields/mapFieldsTemplates.C b/src/postProcessing/functionObjects/utilities/mapFields/mapFieldsTemplates.C
new file mode 100644
index 0000000000000000000000000000000000000000..de269ea8674b87ffda7a4104633b66f77e2c2a81
--- /dev/null
+++ b/src/postProcessing/functionObjects/utilities/mapFields/mapFieldsTemplates.C
@@ -0,0 +1,65 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "meshToMesh.H"
+
+template<class Type>
+bool Foam::mapFieldsFO::writeFieldType() const
+{
+    typedef GeometricField<Type, fvPatchField, volMesh> FieldType;
+
+    const fvMesh& mapRegion = mapRegionPtr_();
+
+    wordList fieldNames(obr_.names(FieldType::typeName));
+    labelList selected = findStrings(fieldNames_, fieldNames);
+    forAll(selected, i)
+    {
+        const word& fieldName = fieldNames[selected[i]];
+        const FieldType& field = obr_.lookupObject<FieldType>(fieldName);
+
+        if (log_) Info << "    " << fieldName;
+
+        IOobject mapRegionIO
+        (
+            fieldName,
+            field.time().timeName(),
+            mapRegion
+        );
+
+        tmp<FieldType> tfieldMapRegion(interpPtr_->mapTgtToSrc(field));
+
+        if (log_) Info<< ": interpolated";
+
+        FieldType fieldMapRegion(mapRegionIO, tfieldMapRegion);
+        fieldMapRegion.write();
+
+        if (log_) Info<< " and written" << nl;
+    }
+
+    return selected.size() > 0;
+}
+
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/Allwmake b/src/randomProcesses/Allwmake
new file mode 100755
index 0000000000000000000000000000000000000000..e1ce66ba6abab5e5e9a49683c20d4048e8183b15
--- /dev/null
+++ b/src/randomProcesses/Allwmake
@@ -0,0 +1,18 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Parse arguments for library compilation
+targetType=libso
+. $WM_PROJECT_DIR/wmake/scripts/AllwmakeParseArguments
+
+if [ -f "$FFTW_ARCH_PATH/include/fftw3.h" ] || \
+   [ "${FFTW_ARCH_PATH##*-}" = system -a -f "/usr/include/fftw3.h" ]
+then
+    wmake $targetType
+else
+    echo
+    echo "Skipping randomProcesses library (no FFTW)"
+    echo
+fi
+
+#------------------------------------------------------------------------------
diff --git a/src/randomProcesses/Kmesh/Kmesh.C b/src/randomProcesses/Kmesh/Kmesh.C
index 5bc6ad1de3dbbe80a9cc8051c87473c0e5e0930b..362874cdb20f139c92352f601e3d59444f0b06e0 100644
--- a/src/randomProcesses/Kmesh/Kmesh.C
+++ b/src/randomProcesses/Kmesh/Kmesh.C
@@ -35,7 +35,7 @@ inline Foam::label Foam::Kmesh::index
     const label i,
     const label j,
     const label k,
-    const labelList& nn
+    const UList<int>& nn
 )
 {
     return (k + j*nn[2] + i*nn[1]*nn[2]);
diff --git a/src/randomProcesses/Kmesh/Kmesh.H b/src/randomProcesses/Kmesh/Kmesh.H
index d09a5894cbfd4af1b21f0ff2135c4074948cb045..417f1feacd4684ecf992a65f65da1e4ad792efe3 100644
--- a/src/randomProcesses/Kmesh/Kmesh.H
+++ b/src/randomProcesses/Kmesh/Kmesh.H
@@ -57,7 +57,7 @@ class Kmesh
         vector l_;
 
         //- Multi-dimensional addressing array
-        labelList nn_;
+        List<int> nn_;
 
         //- Maximum wavenumber
         scalar kmax_;
@@ -71,7 +71,7 @@ class Kmesh
             const label i,
             const label j,
             const label k,
-            const labelList& nn
+            const UList<int>& nn
         );
 
 
@@ -92,7 +92,7 @@ public:
             return l_;
         }
 
-        const labelList& nn() const
+        const List<int>& nn() const
         {
             return nn_;
         }
diff --git a/src/randomProcesses/Make/files b/src/randomProcesses/Make/files
index 90cb360357923e76248efb57794d3b8b6d3c2a01..11138bd932cb2bf7bdb1d04e273ac406c25d6671 100644
--- a/src/randomProcesses/Make/files
+++ b/src/randomProcesses/Make/files
@@ -1,25 +1,31 @@
-Kmesh                       = Kmesh
-
-fft                         = fft
-
-processes                   = processes
-UOprocess                   = $(processes)/UOprocess
-
-turbulence                  = turbulence
-
-noise                       = noise
-
+Kmesh = Kmesh
 $(Kmesh)/Kmesh.C
 
+fft = fft
 $(fft)/fft.C
-$(fft)/fftRenumber.C
 $(fft)/calcEk.C
 $(fft)/kShellIntegration.C
 
+processes = processes
+UOprocess = $(processes)/UOprocess
 $(UOprocess)/UOprocess.C
 
+turbulence = turbulence
 $(turbulence)/turbGen.C
 
-$(noise)/noiseFFT.C
+noise = noise
+$(noise)/noiseFFT/noiseFFT.C
+$(noise)/noiseModels/noiseModel/noiseModel.C
+$(noise)/noiseModels/noiseModel/noiseModelNew.C
+$(noise)/noiseModels/pointNoise/pointNoise.C
+$(noise)/noiseModels/surfaceNoise/surfaceNoise.C
+
+
+windowModels = windowModels
+$(windowModels)/windowModel/windowModel.C
+$(windowModels)/windowModel/windowModelNew.C
+$(windowModels)/Hanning/Hanning.C
+$(windowModels)/uniform/uniform.C
+
 
 LIB = $(FOAM_LIBBIN)/librandomProcesses
diff --git a/src/randomProcesses/Make/options b/src/randomProcesses/Make/options
index 71b7873964d544eddf96d22aa40f4c3372c23c9c..e1eddd51d2e71217d6f2143c9258a3d396d4f7ea 100644
--- a/src/randomProcesses/Make/options
+++ b/src/randomProcesses/Make/options
@@ -1,5 +1,11 @@
 EXE_INC = \
-    -I$(LIB_SRC)/finiteVolume/lnInclude
+    -I$(FFTW_ARCH_PATH)/include \
+    -I$(LIB_SRC)/finiteVolume/lnInclude \
+    -I$(LIB_SRC)/sampling/lnInclude \
+    -I$(LIB_SRC)/surfMesh/lnInclude
 
 LIB_LIBS = \
-    -lfiniteVolume
+    -L$(FFTW_ARCH_PATH)/lib$(WM_COMPILER_LIB_ARCH) -lfftw3 \
+    -lfiniteVolume \
+    -lsampling \
+    -lsurfMesh
diff --git a/src/randomProcesses/fft/fft.C b/src/randomProcesses/fft/fft.C
index f859b37f529212cd0fe6393eaa8338736bae37e4..fd44c0109df10e7ab98a7df1456789ee5d56b0d8 100644
--- a/src/randomProcesses/fft/fft.C
+++ b/src/randomProcesses/fft/fft.C
@@ -2,8 +2,8 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+    \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -24,7 +24,8 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "fft.H"
-#include "fftRenumber.H"
+
+#include <fftw3.h>
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -33,16 +34,11 @@ namespace Foam
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-#define SWAP(a,b) tempr=(a); (a)=(b); (b)=tempr
-#define TWOPI 6.28318530717959
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
 void fft::transform
 (
     complexField& field,
-    const labelList& nn,
-    transformDirection isign
+    const UList<int>& nn,
+    transformDirection dir
 )
 {
     forAll(nn, idim)
@@ -59,134 +55,64 @@ void fft::transform
         }
     }
 
-    const label ndim = nn.size();
+    // Copy field into fftw containers
+    label N = field.size();
+    fftw_complex in[N], out[N];
 
-    label i1, i2, i3, i2rev, i3rev, ip1, ip2, ip3, ifp1, ifp2;
-    label ibit, k1, k2, n, nprev, nrem, idim;
-    scalar tempi, tempr;
-    scalar theta, wi, wpi, wpr, wr, wtemp;
-    scalar* data = reinterpret_cast<scalar*>(field.begin()) - 1;
-
-
-    // if inverse transform : renumber before transform
-
-    if (isign == REVERSE_TRANSFORM)
+    forAll(field, i)
     {
-        fftRenumber(field, nn);
+        in[i][0] = field[i].Re();
+        in[i][1] = field[i].Im();
     }
 
+    // Create the plan
+    // FFTW_FORWARD = -1
+    // FFTW_BACKWARD = 1
 
-    label ntot = 1;
-    forAll(nn, idim)
-    {
-        ntot *= nn[idim];
-    }
-
+    // 1-D plan
+    // fftw_plan plan =
+    //    fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
 
-    nprev = 1;
+    // Generic 1..3-D plan
+    label rank = nn.size();
+    fftw_plan plan =
+        fftw_plan_dft(rank, nn.begin(), in, out, dir, FFTW_ESTIMATE);
 
-    for (idim=ndim; idim>=1; idim--)
-    {
-        n = nn[idim-1];
-        nrem = ntot/(n*nprev);
-        ip1 = nprev << 1;
-        ip2 = ip1*n;
-        ip3 = ip2*nrem;
-        i2rev = 1;
-
-        for (i2=1; i2<=ip2; i2+=ip1)
-        {
-            if (i2 < i2rev)
-            {
-                for (i1=i2; i1<=i2 + ip1 - 2; i1+=2)
-                {
-                    for (i3=i1; i3<=ip3; i3+=ip2)
-                    {
-                        i3rev = i2rev + i3 - i2;
-                        SWAP(data[i3], data[i3rev]);
-                        SWAP(data[i3 + 1], data[i3rev + 1]);
-                    }
-                }
-            }
-
-            ibit = ip2 >> 1;
-            while (ibit >= ip1 && i2rev > ibit)
-            {
-                i2rev -= ibit;
-                ibit >>= 1;
-            }
-
-            i2rev += ibit;
-        }
+    // Compute the FFT
+    fftw_execute(plan);
 
-        ifp1 = ip1;
-
-        while (ifp1 < ip2)
-        {
-            ifp2 = ifp1 << 1;
-            theta = isign*TWOPI/(ifp2/ip1);
-            wtemp = sin(0.5*theta);
-            wpr = -2.0*wtemp*wtemp;
-            wpi = sin(theta);
-            wr = 1.0;
-            wi = 0.0;
-
-            for (i3 = 1; i3 <= ifp1; i3 += ip1)
-            {
-                for (i1 = i3; i1 <= i3 + ip1 - 2; i1 += 2)
-                {
-                    for (i2 = i1; i2 <= ip3; i2 += ifp2)
-                    {
-                        k1 = i2;
-                        k2 = k1 + ifp1;
-                        tempr = scalar(wr*data[k2]) - scalar(wi*data[k2 + 1]);
-                        tempi = scalar(wr*data[k2 + 1]) + scalar(wi*data[k2]);
-                        data[k2] = data[k1] - tempr;
-                        data[k2 + 1] = data[k1 + 1] - tempi;
-                        data[k1] += tempr;
-                        data[k1 + 1] += tempi;
-                    }
-                }
-
-                wr = (wtemp = wr)*wpr - wi*wpi + wr;
-                wi = wi*wpr + wtemp*wpi + wi;
-            }
-            ifp1 = ifp2;
-        }
-        nprev *= n;
-    }
-
-
-    // if forward transform : renumber after transform
-
-    if (isign == FORWARD_TRANSFORM)
+    forAll(field, i)
     {
-        fftRenumber(field, nn);
+        field[i].Re() = out[i][0];
+        field[i].Im() = out[i][1];
     }
 
+    fftw_destroy_plan(plan);
 
-    // scale result (symmetric scale both forward and inverse transform)
+/*
+    fftw_real in[N], out[N];
+    // Create a plan for real data input
+    // - generates 1-sided FFT
+    // - direction given by FFTW_R2HC or FFTW_HC2R.
+    // - in[N] is the array of real input val ues
+    // - out[N] is the array of N/2 real valuea followed by N/2 complex values
+    // - 0 component = DC component
+    fftw_plan plan = fftw_plan_r2r_2d(N, in, out, FFTW_R2HC, FFTW_ESTIMATE)
 
-    scalar recRootN = 1.0/sqrt(scalar(ntot));
+    // Compute the FFT
+    fftw_execute(plan);
 
-    forAll(field, i)
-    {
-        field[i] *= recRootN;
-    }
+    fftw_destroy_plan(plan);
+*/
 }
 
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#undef SWAP
-#undef TWOPI
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 tmp<complexField> fft::forwardTransform
 (
     const tmp<complexField>& tfield,
-    const labelList& nn
+    const UList<int>& nn
 )
 {
     tmp<complexField> tfftField(new complexField(tfield));
@@ -202,7 +128,7 @@ tmp<complexField> fft::forwardTransform
 tmp<complexField> fft::reverseTransform
 (
     const tmp<complexField>& tfield,
-    const labelList& nn
+    const UList<int>& nn
 )
 {
     tmp<complexField> tifftField(new complexField(tfield));
@@ -218,7 +144,7 @@ tmp<complexField> fft::reverseTransform
 tmp<complexVectorField> fft::forwardTransform
 (
     const tmp<complexVectorField>& tfield,
-    const labelList& nn
+    const UList<int>& nn
 )
 {
     tmp<complexVectorField> tfftVectorField
@@ -247,7 +173,7 @@ tmp<complexVectorField> fft::forwardTransform
 tmp<complexVectorField> fft::reverseTransform
 (
     const tmp<complexVectorField>& tfield,
-    const labelList& nn
+    const UList<int>& nn
 )
 {
     tmp<complexVectorField> tifftVectorField
diff --git a/src/randomProcesses/fft/fft.H b/src/randomProcesses/fft/fft.H
index f176261eb5f92c707bed3c9268b4bff3d5845419..11cc07575e99b99c41f8942f31647223982d0360 100644
--- a/src/randomProcesses/fft/fft.H
+++ b/src/randomProcesses/fft/fft.H
@@ -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) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -25,14 +25,16 @@ Class
     Foam::fft
 
 Description
-    Fast fourier transform derived from the Numerical
-    Recipes in C routine.
+    Fast fourier transform using the fftw library.
 
     The complex transform field is returned in the field supplied.  The
-    direction of transform is supplied as an argument (1 = forward, -1 =
+    direction of transform is supplied as an argument (-1 = forward, 1 =
     reverse).  The dimensionality and organisation of the array of values
     in space is supplied in the nn indexing array.
 
+Note
+    The fftw library uses int only (no longs) for its dimensionality.
+
 SourceFiles
     fft.C
 
@@ -42,7 +44,7 @@ SourceFiles
 #define fft_H
 
 #include "complexFields.H"
-#include "labelList.H"
+#include "UList.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -56,15 +58,15 @@ public:
 
     enum transformDirection
     {
-        FORWARD_TRANSFORM = 1,
-        REVERSE_TRANSFORM = -1
+        FORWARD_TRANSFORM = -1,
+        REVERSE_TRANSFORM = 1
     };
 
 
     static void transform
     (
         complexField& field,
-        const labelList& nn,
+        const UList<int>& nn,
         transformDirection fftDirection
     );
 
@@ -72,28 +74,28 @@ public:
     static tmp<complexField> forwardTransform
     (
         const tmp<complexField>& field,
-        const labelList& nn
+        const UList<int>& nn
     );
 
 
     static tmp<complexField> reverseTransform
     (
         const tmp<complexField>& field,
-        const labelList& nn
+        const UList<int>& nn
     );
 
 
     static tmp<complexVectorField> forwardTransform
     (
         const tmp<complexVectorField>& field,
-        const labelList& nn
+        const UList<int>& nn
     );
 
 
     static tmp<complexVectorField> reverseTransform
     (
         const tmp<complexVectorField>& field,
-        const labelList& nn
+        const UList<int>& nn
     );
 };
 
diff --git a/src/randomProcesses/fft/fftRenumber.C b/src/randomProcesses/fft/fftRenumber.C
deleted file mode 100644
index 07f8b238be44c89599647741eff6defde027d8eb..0000000000000000000000000000000000000000
--- a/src/randomProcesses/fft/fftRenumber.C
+++ /dev/null
@@ -1,124 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
--------------------------------------------------------------------------------
-License
-    This file is part of OpenFOAM.
-
-    OpenFOAM is free software: you can redistribute it and/or modify it
-    under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-    for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
-
-Description
-    Multi-dimensional renumbering used in the Numerical Recipes
-   fft routine. This version is recursive, so works in n-d :
-   determined by the length of array nn
-
-\*---------------------------------------------------------------------------*/
-
-#include "fftRenumber.H"
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-void Foam::fftRenumberRecurse
-(
-    List<complex>& data,
-    List<complex>& renumData,
-    const labelList& nn,
-    label nnprod,
-    label ii,
-    label l1,
-    label l2
-)
-{
-    if (ii == nn.size())
-    {
-        // we've worked out the renumbering scheme. Now copy
-        // the components across
-
-        data[l1] = complex(renumData[l2].Re(),renumData[l2].Im());
-    }
-    else
-    {
-        // do another level of folding. First work out the
-        // multiplicative value of the index
-
-        nnprod /= nn[ii];
-        label i_1(0);
-
-        for (label i=0; i<nn[ii]; i++)
-        {
-            // now evaluate the indices (both from array 1 and to
-            // array 2). These get multiplied by nnprod to (cumulatively)
-            // find the real position in the list corresponding to
-            // this set of indices.
-
-            if (i<nn[ii]/2)
-            {
-                i_1 = i + nn[ii]/2;
-            }
-            else
-            {
-                i_1 = i - nn[ii]/2;
-            }
-
-
-            // go to the next level of recursion.
-
-            fftRenumberRecurse
-            (
-                data,
-                renumData,
-                nn,
-                nnprod,
-                ii+1,
-                l1+i*nnprod,
-                l2+i_1*nnprod
-            );
-        }
-    }
-}
-
-
-void Foam::fftRenumber
-(
-    List<complex>& data,
-    const labelList& nn
-)
-{
-    List<complex> renumData(data);
-
-    label nnprod(1);
-    forAll(nn, i)
-    {
-        nnprod *= nn[i];
-    }
-
-    label ii(0), l1(0), l2(0);
-
-    fftRenumberRecurse
-    (
-        data,
-        renumData,
-        nn,
-        nnprod,
-        ii,
-        l1,
-        l2
-    );
-}
-
-
-// ************************************************************************* //
diff --git a/src/randomProcesses/noise/noiseFFT.C b/src/randomProcesses/noise/noiseFFT.C
deleted file mode 100644
index 0f09cdf817450e18461c9eb49371a82847538d40..0000000000000000000000000000000000000000
--- a/src/randomProcesses/noise/noiseFFT.C
+++ /dev/null
@@ -1,454 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
--------------------------------------------------------------------------------
-License
-    This file is part of OpenFOAM.
-
-    OpenFOAM is free software: you can redistribute it and/or modify it
-    under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-    for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
-
-\*---------------------------------------------------------------------------*/
-
-#include "noiseFFT.H"
-#include "IFstream.H"
-#include "DynamicList.H"
-#include "fft.H"
-#include "SubField.H"
-#include "mathematicalConstants.H"
-
-// * * * * * * * * * * * * * * Static Member Data  * * * * * * * * * * * * * //
-
-Foam::scalar Foam::noiseFFT::p0 = 2e-5;
-
-
-// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
-
-Foam::noiseFFT::noiseFFT
-(
-    const scalar deltat,
-    const scalarField& pressure
-)
-:
-    scalarField(pressure),
-    deltat_(deltat)
-{}
-
-
-Foam::noiseFFT::noiseFFT(const fileName& pFileName, const label skip)
-:
-    scalarField(),
-    deltat_(0.0)
-{
-    // Construct pressure data file
-    IFstream pFile(pFileName);
-
-    // Check pFile stream is OK
-    if (!pFile.good())
-    {
-        FatalErrorInFunction
-            << "Cannot read file " << pFileName
-            << exit(FatalError);
-    }
-
-    if (skip)
-    {
-        scalar dummyt, dummyp;
-
-        for (label i=0; i<skip; i++)
-        {
-            pFile >> dummyt;
-
-            if (!pFile.good() || pFile.eof())
-            {
-                FatalErrorInFunction
-                    << "Number of points in file " << pFileName
-                    << " is less than the number to be skipped = " << skip
-                    << exit(FatalError);
-            }
-
-            pFile >> dummyp;
-        }
-    }
-
-    scalar t = 0, T = 0;
-    DynamicList<scalar> pData(100000);
-    label i = 0;
-
-    while (!(pFile >> t).eof())
-    {
-        T = t;
-        pFile >> pData(i++);
-    }
-
-    deltat_ = T/pData.size();
-
-    this->transfer(pData);
-}
-
-
-// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
-
-Foam::graph Foam::noiseFFT::pt() const
-{
-    scalarField t(size());
-    forAll(t, i)
-    {
-        t[i] = i*deltat_;
-    }
-
-    return graph
-    (
-        "p(t)",
-        "t [s]",
-        "p(t) [Pa]",
-        t,
-        *this
-    );
-}
-
-
-Foam::tmp<Foam::scalarField> Foam::noiseFFT::window
-(
-    const label N,
-    const label ni
-) const
-{
-    label windowOffset = N;
-
-    if ((N + ni*windowOffset) > size())
-    {
-        FatalErrorInFunction
-            << "Requested window is outside set of data" << endl
-            << "number of data = " << size() << endl
-            << "size of window = " << N << endl
-            << "window  = " << ni
-            << exit(FatalError);
-    }
-
-    tmp<scalarField> tpw(new scalarField(N));
-    scalarField& pw = tpw.ref();
-
-    label offset = ni*windowOffset;
-
-    forAll(pw, i)
-    {
-        pw[i] = operator[](i + offset);
-    }
-
-    return tpw;
-}
-
-
-Foam::tmp<Foam::scalarField> Foam::noiseFFT::Hanning(const label N) const
-{
-    scalarField t(N);
-    forAll(t, i)
-    {
-        t[i] = i*deltat_;
-    }
-
-    scalar T = N*deltat_;
-
-    return 2*(0.5 - 0.5*cos(constant::mathematical::twoPi*t/T));
-}
-
-
-Foam::tmp<Foam::scalarField> Foam::noiseFFT::Pf
-(
-    const tmp<scalarField>& tpn
-) const
-{
-    tmp<scalarField> tPn2
-    (
-        mag
-        (
-            fft::reverseTransform
-            (
-                ReComplexField(tpn),
-                labelList(1, tpn().size())
-            )
-        )
-    );
-
-    tpn.clear();
-
-    tmp<scalarField> tPn
-    (
-        new scalarField
-        (
-            scalarField::subField(tPn2(), tPn2().size()/2)
-        )
-    );
-    scalarField& Pn = tPn.ref();
-
-    Pn *= 2.0/sqrt(scalar(tPn2().size()));
-    Pn[0] /= 2.0;
-
-    return tPn;
-}
-
-
-Foam::graph Foam::noiseFFT::meanPf
-(
-    const label N,
-    const label nw
-) const
-{
-    if (N > size())
-    {
-        FatalErrorInFunction
-            << "Requested window is outside set of data" << nl
-            << "number of data = " << size() << nl
-            << "size of window = " << N << nl
-            << "window  = " << nw
-            << exit(FatalError);
-    }
-
-    scalarField MeanPf(N/2, 0.0);
-
-    scalarField Hwf(Hanning(N));
-
-    for (label wi=0; wi<nw; ++wi)
-    {
-        MeanPf += Pf(Hwf*window(N, wi));
-    }
-
-    MeanPf /= nw;
-
-    scalarField f(MeanPf.size());
-    scalar deltaf = 1.0/(N*deltat_);
-
-    forAll(f, i)
-    {
-        f[i] = i*deltaf;
-    }
-
-    return graph
-    (
-        "P(f)",
-        "f [Hz]",
-        "P(f) [Pa]",
-        f,
-        MeanPf
-    );
-}
-
-
-Foam::graph Foam::noiseFFT::RMSmeanPf
-(
-    const label N,
-    const label nw
-) const
-{
-    if (N > size())
-    {
-        FatalErrorInFunction
-            << "Requested window is outside set of data" << endl
-            << "number of data = " << size() << endl
-            << "size of window = " << N << endl
-            << "window  = " << nw
-            << exit(FatalError);
-    }
-
-    scalarField RMSMeanPf(N/2, 0.0);
-
-    scalarField Hwf(Hanning(N));
-
-    for (label wi=0; wi<nw; ++wi)
-    {
-        RMSMeanPf += sqr(Pf(Hwf*window(N, wi)));
-    }
-
-    RMSMeanPf = sqrt(RMSMeanPf/nw);
-
-    scalarField f(RMSMeanPf.size());
-    scalar deltaf = 1.0/(N*deltat_);
-
-    forAll(f, i)
-    {
-        f[i] = i*deltaf;
-    }
-
-    return graph
-    (
-        "P(f)",
-        "f [Hz]",
-        "P(f) [Pa]",
-        f,
-        RMSMeanPf
-    );
-}
-
-
-Foam::graph Foam::noiseFFT::Lf(const graph& gPf) const
-{
-    return graph
-    (
-        "L(f)",
-        "f [Hz]",
-        "L(f) [dB]",
-        gPf.x(),
-        20*log10(gPf.y()/p0)
-    );
-}
-
-
-Foam::graph Foam::noiseFFT::Ldelta
-(
-    const graph& gLf,
-    const scalar f1,
-    const scalar fU
-) const
-{
-    const scalarField& f = gLf.x();
-    const scalarField& Lf = gLf.y();
-
-    scalarField ldelta(Lf.size(), 0.0);
-    scalarField fm(ldelta.size());
-
-    scalar fratio = cbrt(2.0);
-    scalar deltaf = 1.0/(2*Lf.size()*deltat_);
-
-    scalar fl = f1/sqrt(fratio);
-    scalar fu = fratio*fl;
-
-    label istart = label(fl/deltaf);
-    label j = 0;
-
-    for (label i = istart; i<Lf.size(); i++)
-    {
-        scalar fmi = sqrt(fu*fl);
-
-        if (fmi > fU + 1) break;
-
-        if (f[i] >= fu)
-        {
-            fm[j] = fmi;
-            ldelta[j] = 10*log10(ldelta[j]);
-
-            j++;
-
-            fl = fu;
-            fu *= fratio;
-        }
-
-        ldelta[j] += pow(10, Lf[i]/10.0);
-    }
-
-    fm.setSize(j);
-    ldelta.setSize(j);
-
-    return graph
-    (
-        "Ldelta",
-        "fm [Hz]",
-        "Ldelta [dB]",
-        fm,
-        ldelta
-    );
-}
-
-
-Foam::graph Foam::noiseFFT::Pdelta
-(
-    const graph& gPf,
-    const scalar f1,
-    const scalar fU
-) const
-{
-    const scalarField& f = gPf.x();
-    const scalarField& Pf = gPf.y();
-
-    scalarField pdelta(Pf.size(), 0.0);
-    scalarField fm(pdelta.size());
-
-    scalar fratio = cbrt(2.0);
-    scalar deltaf = 1.0/(2*Pf.size()*deltat_);
-
-    scalar fl = f1/sqrt(fratio);
-    scalar fu = fratio*fl;
-
-    label istart = label(fl/deltaf + 1.0 - SMALL);
-    label j = 0;
-
-    for (label i = istart; i<Pf.size(); i++)
-    {
-        scalar fmi = sqrt(fu*fl);
-
-        if (fmi > fU + 1) break;
-
-        if (f[i] >= fu)
-        {
-            fm[j] = fmi;
-            pdelta[j] = sqrt((2.0/3.0)*pdelta[j]);
-
-            j++;
-
-            fl = fu;
-            fu *= fratio;
-        }
-
-        pdelta[j] += sqr(Pf[i]);
-    }
-
-    fm.setSize(j);
-    pdelta.setSize(j);
-
-    return graph
-    (
-        "Pdelta",
-        "fm [Hz]",
-        "Pdelta [dB]",
-        fm,
-        pdelta
-    );
-}
-
-
-Foam::scalar Foam::noiseFFT::Lsum(const graph& gLf) const
-{
-    const scalarField& Lf = gLf.y();
-
-    scalar lsum = 0.0;
-
-    forAll(Lf, i)
-    {
-        lsum += pow(10, Lf[i]/10.0);
-    }
-
-    lsum = 10*log10(lsum);
-
-    return lsum;
-}
-
-
-Foam::scalar Foam::noiseFFT::dbToPa(const scalar db) const
-{
-    return p0*pow(10.0, db/20.0);
-}
-
-
-Foam::tmp<Foam::scalarField> Foam::noiseFFT::dbToPa
-(
-    const tmp<scalarField>& db
-) const
-{
-    return p0*pow(10.0, db/20.0);
-}
-
-
-// ************************************************************************* //
diff --git a/src/randomProcesses/noise/noiseFFT/noiseFFT.C b/src/randomProcesses/noise/noiseFFT/noiseFFT.C
new file mode 100644
index 0000000000000000000000000000000000000000..3a61c9b0dd130a909379d841b7a1aa2797a5c5e0
--- /dev/null
+++ b/src/randomProcesses/noise/noiseFFT/noiseFFT.C
@@ -0,0 +1,474 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "noiseFFT.H"
+#include "IFstream.H"
+#include "DynamicList.H"
+#include "SubField.H"
+#include "mathematicalConstants.H"
+#include "HashSet.H"
+#include "fft.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Member Data  * * * * * * * * * * * * * //
+
+Foam::scalar Foam::noiseFFT::p0 = 2e-5;
+
+
+Foam::tmp<Foam::scalarField> Foam::noiseFFT::frequencies
+(
+    const label N,
+    const scalar deltaT
+)
+{
+    tmp<scalarField> tf(new scalarField(N/2, 0));
+    scalarField& f = tf.ref();
+
+    scalar deltaf = 1.0/(N*deltaT);
+    forAll(f, i)
+    {
+        f[i] = i*deltaf;
+    }
+
+    return tf;
+}
+
+
+Foam::tmp<Foam::scalarField> Foam::noiseFFT::PSD(const scalarField& PSDf)
+{
+    return 10*log10(PSDf/sqr(p0));
+}
+
+
+Foam::tmp<Foam::scalarField> Foam::noiseFFT::SPL(const scalarField& Prms2)
+{
+    return 10*log10(Prms2/sqr(p0));
+}
+
+
+void Foam::noiseFFT::octaveBandInfo
+(
+    const scalarField& f,
+    const scalar fLower,
+    const scalar fUpper,
+    const scalar octave,
+    labelList& fBandIDs,
+    scalarField& fCentre
+)
+{
+    // Set the indices of to the lower frequency bands for the input frequency
+    // range. Ensure that the centre frequency passes though 1000 Hz
+
+    // Low frequency bound given by:
+    //     fLow = f0*(2^(0.5*bandI/octave))
+
+    // Initial (lowest centre frequency)
+    scalar fTest = 15.625;
+
+    const scalar fRatio = pow(2, 1.0/octave);
+    const scalar fRatioL2C = pow(2, 0.5/octave);
+
+    // IDs of band IDs
+    labelHashSet bandIDs(f.size());
+
+    // Centre frequencies
+    DynamicList<scalar> fc;
+
+    // Convert to lower band limit
+    fTest /= fRatioL2C;
+
+    forAll(f, i)
+    {
+        if (f[i] >= fTest)
+        {
+            // Advance band if appropriate
+            while (f[i] > fTest)
+            {
+                fTest *= fRatio;
+            }
+            fTest /= fRatio;
+
+            if (bandIDs.insert(i))
+            {
+                // Also store (next) centre frequency
+                fc.append(fTest*fRatioL2C);
+            }
+            fTest *= fRatio;
+
+            if (fTest > fUpper)
+            {
+                break;
+            }
+        }
+    }
+
+    fBandIDs = bandIDs.toc();
+
+    // Remove the last centre frequency (beyond upper frequency limit)
+    fc.remove();
+
+    fCentre.transfer(fc);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::noiseFFT::noiseFFT
+(
+    const scalar deltaT,
+    const scalarField& pressure
+)
+:
+    scalarField(pressure),
+    deltaT_(deltaT)
+{
+    scalarField& p = *this;
+    p -= average(p);
+}
+
+
+Foam::noiseFFT::noiseFFT(const fileName& pFileName, const label skip)
+:
+    scalarField(),
+    deltaT_(0.0)
+{
+    // Construct pressure data file
+    IFstream pFile(pFileName);
+
+    // Check pFile stream is OK
+    if (!pFile.good())
+    {
+        FatalErrorInFunction
+            << "Cannot read file " << pFileName
+            << exit(FatalError);
+    }
+
+    if (skip)
+    {
+        scalar dummyt, dummyp;
+
+        for (label i = 0; i < skip; i++)
+        {
+            pFile >> dummyt;
+
+            if (!pFile.good() || pFile.eof())
+            {
+                FatalErrorInFunction
+                    << "Number of points in file " << pFileName
+                    << " is less than the number to be skipped = " << skip
+                    << exit(FatalError);
+            }
+
+            pFile >> dummyp;
+        }
+    }
+
+    scalar t = 0, T0 = 0, T1 = 0;
+    DynamicList<scalar> pData(100000);
+    label i = 0;
+
+    while (!(pFile >> t).eof())
+    {
+        if (i == 0)
+        {
+            T0 = t;
+        }
+
+        T1 = t;
+        pFile >> pData(i++);
+    }
+
+    // Note: assumes fixed time step
+    deltaT_ = (T1 - T0)/pData.size();
+
+    this->transfer(pData);
+
+    scalarField& p = *this;
+    p -= average(p);
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+Foam::graph Foam::noiseFFT::pt() const
+{
+    scalarField t(size());
+    forAll(t, i)
+    {
+        t[i] = i*deltaT_;
+    }
+
+    return graph
+    (
+        "p(t)",
+        "t [s]",
+        "p(t) [Pa]",
+        t,
+        *this
+    );
+}
+
+
+Foam::tmp<Foam::scalarField> Foam::noiseFFT::Pf
+(
+    const tmp<scalarField>& tpn
+) const
+{
+    // Calculate the 2-sided fft
+    // Note: result not scaled
+    tmp<scalarField> tPn2
+    (
+        mag
+        (
+            fft::reverseTransform
+            (
+                ReComplexField(tpn),
+                List<int>(1, tpn().size())
+            )
+        )
+    );
+
+    tpn.clear();
+
+    // Only storing the positive half
+    // Note: storing (N/2) values, DC component at position (0)
+    tmp<scalarField> tPn
+    (
+        new scalarField
+        (
+            scalarField::subField(tPn2(), tPn2().size()/2 + 1)
+        )
+    );
+
+    return tPn;
+}
+
+
+Foam::graph Foam::noiseFFT::meanPf(const windowModel& window) const
+{
+    const label N = window.nSamples();
+    const label nWindow = window.nWindow();
+
+    scalarField meanPf(N/2 + 1, 0.0);
+
+    for (label windowI = 0; windowI < nWindow; ++windowI)
+    {
+        meanPf += Pf(window.apply<scalar>(*this, windowI));
+    }
+
+    meanPf /= scalar(nWindow);
+
+    scalar deltaf = 1.0/(N*deltaT_);
+    scalarField f(meanPf.size());
+    forAll(f, i)
+    {
+        f[i] = i*deltaf;
+    }
+
+    return graph
+    (
+        "P(f)",
+        "f [Hz]",
+        "P(f) [Pa]",
+        f,
+        meanPf
+    );
+}
+
+
+Foam::graph Foam::noiseFFT::RMSmeanPf(const windowModel& window) const
+{
+    const label N = window.nSamples();
+    const label nWindow = window.nWindow();
+
+    scalarField RMSMeanPf(N/2 + 1, 0.0);
+    for (label windowI = 0; windowI < nWindow; ++windowI)
+    {
+        RMSMeanPf += sqr(Pf(window.apply<scalar>(*this, windowI)));
+    }
+
+    RMSMeanPf = sqrt(RMSMeanPf/scalar(nWindow))/scalar(N);
+
+    scalar deltaf = 1.0/(N*deltaT_);
+    scalarField f(RMSMeanPf.size());
+    forAll(f, i)
+    {
+        f[i] = i*deltaf;
+    }
+
+    return graph
+    (
+        "Prms(f)",
+        "f [Hz]",
+        "Prms(f) [Pa]",
+        f,
+        RMSMeanPf
+    );
+}
+
+
+Foam::graph Foam::noiseFFT::PSDf(const windowModel& window) const
+{
+    const label N = window.nSamples();
+    const label nWindow = window.nWindow();
+
+    scalarField psd(N/2 + 1, 0.0);
+
+    for (label windowI = 0; windowI < nWindow; ++windowI)
+    {
+        psd += sqr(Pf(window.apply<scalar>(*this, windowI)));
+    }
+
+    scalar deltaf = 1.0/(N*deltaT_);
+    scalar fs =  1.0/deltaT_;
+    psd /= scalar(nWindow)*fs*N;
+
+    // Scaling due to use of 1-sided FFT
+    // Note: do not scale DC component
+    psd *= 2;
+    psd.first() /= 2;
+    psd.last() /= 2;
+
+    scalarField f(psd.size());
+
+    if (0) // if (debug)
+    {
+        Pout<< "Average PSD: " << average(psd) << endl;
+    }
+
+    forAll(f, i)
+    {
+        f[i] = i*deltaf;
+    }
+
+    return graph
+    (
+        "PSD(f)",
+        "f [Hz]",
+        "PSD(f) [PaPa_Hz]",
+        f,
+        psd
+    );
+}
+
+
+Foam::graph Foam::noiseFFT::PSD(const graph& gPSDf) const
+{
+    return graph
+    (
+        "PSD(f)",
+        "f [Hz]",
+        "PSD_dB(f) [dB_Hz]",
+        gPSDf.x(),
+        10*log10(gPSDf.y()/sqr(p0))
+    );
+}
+
+
+Foam::graph Foam::noiseFFT::octaves
+(
+    const graph& g,
+    const labelList& freqBandIDs,
+    bool integrate
+) const
+{
+    if (freqBandIDs.size() < 2)
+    {
+        WarningInFunction
+            << "Octave frequency bands are not defined "
+            << "- skipping octaves calculation"
+            << endl;
+
+        return graph
+        (
+            "octave",
+            "x",
+            "y",
+            scalarField(),
+            scalarField()
+        );
+    }
+
+    const scalarField& f = g.x();
+    const scalarField& data = g.y();
+
+    scalarField octData(freqBandIDs.size() - 1, 0.0);
+    scalarField fm(freqBandIDs.size() -1, 0.0);
+
+    for (label bandI = 0; bandI < freqBandIDs.size() - 1; bandI++)
+    {
+        label fb0 = freqBandIDs[bandI];
+        label fb1 = freqBandIDs[bandI+1];
+        fm[bandI] = f[fb0];
+
+        if (fb0 == fb1) continue;
+
+        if (integrate)
+        {
+            for (label freqI = fb0; freqI < fb1; freqI++)
+            {
+                label f0 = f[freqI];
+                label f1 = f[freqI + 1];
+                scalar dataAve = 0.5*(data[freqI] + data[freqI + 1]);
+                octData[bandI] += dataAve*(f1 - f0);
+            }
+        }
+        else
+        {
+            for (label freqI = fb0; freqI < fb1; freqI++)
+            {
+                octData[bandI] += data[freqI];
+            }
+        }
+    }
+
+    return graph
+    (
+        "octaves(f)",
+        "fm [Hz]",
+        "octave data",
+        fm,
+        octData
+    );
+}
+
+
+Foam::scalar Foam::noiseFFT::dbToPa(const scalar db) const
+{
+    return p0*pow(10.0, db/20.0);
+}
+
+
+Foam::tmp<Foam::scalarField> Foam::noiseFFT::dbToPa
+(
+    const tmp<scalarField>& db
+) const
+{
+    return p0*pow(10.0, db/20.0);
+}
+
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/noise/noiseFFT.H b/src/randomProcesses/noise/noiseFFT/noiseFFT.H
similarity index 53%
rename from src/randomProcesses/noise/noiseFFT.H
rename to src/randomProcesses/noise/noiseFFT/noiseFFT.H
index 085702964cd5a28e0b4bf39a0040b230a3544d8d..6439a2f429a427e0b0a8d3c82d68235138088712 100644
--- a/src/randomProcesses/noise/noiseFFT.H
+++ b/src/randomProcesses/noise/noiseFFT/noiseFFT.H
@@ -2,8 +2,8 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
-     \\/     M anipulation  |
+    \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -25,11 +25,26 @@ Class
     Foam::noiseFFT
 
 Description
-    FFT of the pressure field
+    Performs FFT of pressure field to generate noise data.
+
+    General functionality:
+    - Pf: fft of the pressure data
+    - meanPf: multi-window mean fft
+    - RMSmeanPf: multi-window RMS mean fft
+    - PSDf: multi-window power spectral density (PSD) in frequency domain
+    - PSD: power spectral density in dB/Hz
+    - SPL: sound pressure level in dB
+
+    Octave-based data:
+    - PSD spectrum
+    - SPL spectrum
 
 SourceFiles
     noiseFFT.C
 
+SeeAlso
+    windowModel.H
+
 \*---------------------------------------------------------------------------*/
 
 #ifndef noiseFFT_H
@@ -37,6 +52,7 @@ SourceFiles
 
 #include "scalarField.H"
 #include "graph.H"
+#include "windowModel.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -44,7 +60,7 @@ namespace Foam
 {
 
 /*---------------------------------------------------------------------------*\
-                           Class noiseFFT Declaration
+                          Class noiseFFT Declaration
 \*---------------------------------------------------------------------------*/
 
 class noiseFFT
@@ -54,7 +70,18 @@ class noiseFFT
     // Private data
 
         //- Time spacing of the raw data
-        scalar deltat_;
+        scalar deltaT_;
+
+    struct octaveBandInfo
+    {
+        label octave;
+
+        // IDs of bin boundaries in pressure data
+        labelList binIDs;
+
+        // Centre frequencies for each bin
+        scalarField centreFreq;
+    };
 
 
 public:
@@ -81,37 +108,61 @@ public:
 
     // Member Functions
 
-        //- Return the graph of p(t)
-        graph pt() const;
+        //- Return the FFT frequencies
+        static tmp<scalarField> frequencies
+        (
+            const label N,
+            const scalar deltaT
+        );
+
+        //- Return the PSD [dB/Hz]
+        //  Input PSD in [Pa^2/Hz]
+        static tmp<scalarField> PSD(const scalarField& PSDf);
 
-        //- Return the nth window
-        tmp<scalarField> window(const label N, const label n) const;
+        //- Return the SPL [dB]
+        //  Input P(rms)^2 in [Pa^2]
+        static tmp<scalarField> SPL(const scalarField& Prms2);
+
+        //- Return a list of the frequency indices wrt f field that
+        //  correspond to the bands limits for a given octave
+        static void octaveBandInfo
+        (
+            const scalarField& f,
+            const scalar fLower,
+            const scalar fUpper,
+            const scalar octave,
+            labelList& fBandIDs,
+            scalarField& fCentre
+        );
 
-        //- Return the Hanning window function
-        tmp<scalarField> Hanning(const label N) const;
+        //- Return the graph of pressure as a function of time
+        graph pt() const;
 
         //- Return the fft of the given pressure data
         tmp<scalarField> Pf(const tmp<scalarField>& pn) const;
 
-        //- Return the multi-window mean fft of the complete pressure data
-        graph meanPf(const label N, const label nw) const;
+        //- Return the multi-window mean fft of the complete pressure data [Pa]
+        graph meanPf(const windowModel& window) const;
 
-        //- Return the multi-window RMS mean fft of the complete pressure data
-        graph RMSmeanPf(const label N, const label nw) const;
+        //- Return the multi-window RMS mean fft of the complete pressure
+        //  data [Pa]
+        graph RMSmeanPf(const windowModel& window) const;
 
-        //- Return the narrow-band PFL (pressure-fluctuation level) spectrum
-        graph Lf(const graph& gPf) const;
+        //- Return the multi-window PSD (power spectral density) of the complete
+        //  pressure data [Pa^2/Hz]
+        graph PSDf(const windowModel& window) const;
 
-        //- Return the one-third-octave-band PFL spectrum
-        //  starting at octave with mean frequency f1
-        graph Ldelta(const graph& gLf, const scalar f1, const scalar fU) const;
+        //- Return the PSD [dB/Hz]
+        //  Takes PSD in [Pa^2/Hz]
+        graph PSD(const graph& gPSDf) const;
 
-        //- Return the one-third-octave-band pressure spectrum
-        //  starting at octave with mean frequency f1
-        graph Pdelta(const graph& gLf, const scalar f1, const scalar fU) const;
-
-        //- Return the total PFL as the sum of Lf over all frequencies
-        scalar Lsum(const graph& gLf) const;
+        //- Generate octave data
+        graph octaves
+        (
+            const graph& g,
+            const labelList& freqBandIDs,
+            bool integrate
+        ) const;
 
         //- Convert the db into Pa
         scalar dbToPa(const scalar db) const;
diff --git a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..145f992725047247f649688a9e88cff14b86753b
--- /dev/null
+++ b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C
@@ -0,0 +1,151 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "noiseModel.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(noiseModel, 0);
+    defineRunTimeSelectionTable(noiseModel, dictionary);
+}
+
+// * * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * //
+
+Foam::scalar Foam::noiseModel::checkUniformTimeStep
+(
+    const scalarList& times
+) const
+{
+    scalar deltaT = -1.0;
+
+    if (times.size() > 1)
+    {
+        for (label i = 1; i < times.size(); i++)
+        {
+            scalar dT = times[i] - times[i-1];
+
+            if (deltaT < 0)
+            {
+                deltaT = dT;
+            }
+
+            if (mag(deltaT - dT) > SMALL)
+            {
+                FatalErrorInFunction
+                    << "Unable to process data with a variable time step"
+                    << exit(FatalError);
+            }
+        }
+    }
+    else
+    {
+        FatalErrorInFunction
+            << "Unable to create FFT with a single value"
+            << exit(FatalError);
+    }
+
+    return deltaT;
+}
+
+
+Foam::label Foam::noiseModel::findStartTimeIndex
+(
+    const instantList& allTimes,
+    const scalar startTime
+) const
+{
+    forAll(allTimes, timeI)
+    {
+        const instant& i = allTimes[timeI];
+
+        if (i.value() >= startTime)
+        {
+            return timeI;
+        }
+    }
+
+    return 0;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::noiseModel::noiseModel(const dictionary& dict)
+:
+    dict_(dict),
+    rhoRef_(dict.lookupOrDefault<scalar>("rhoRef", 1)),
+    nSamples_(dict.lookupOrDefault<label>("N", 65536)),
+    fLower_(dict.lookupOrDefault<scalar>("fl", 25)),
+    fUpper_(dict.lookupOrDefault<scalar>("fu", 10000)),
+    startTime_(dict.lookupOrDefault<scalar>("startTime", 0)),
+    windowModelPtr_(windowModel::New(dict, nSamples_)),
+    graphFormat_(dict.lookupOrDefault<word>("graphFormat", "raw"))
+{
+    // Check number of samples  - must be a power of 2 for our FFT
+    bool powerOf2 = ((nSamples_ != 0) && !(nSamples_ & (nSamples_ - 1)));
+    if (!powerOf2)
+    {
+        FatalIOErrorInFunction(dict)
+            << "N: Number of samples in sampling windows must be a "
+            << "power of 2"
+            << exit(FatalIOError);
+    }
+
+    if (fLower_ < 0)
+    {
+        FatalIOErrorInFunction(dict)
+            << "fl: lower frequency bound must be greater than zero"
+            << exit(FatalIOError);
+
+    }
+
+    if (fUpper_ < 0)
+    {
+        FatalIOErrorInFunction(dict)
+            << "fu: upper frequency bound must be greater than zero"
+            << exit(FatalIOError);
+
+    }
+
+    if (fUpper_ < fLower_)
+    {
+        FatalIOErrorInFunction(dict)
+            << "fu: upper frequency bound must be greater than lower "
+            << "frequency bound (fl)"
+            << exit(FatalIOError);
+
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::noiseModel::~noiseModel()
+{}
+
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..28643cbf564fe1c48bc670ac7e4aaa5e5dbd5707
--- /dev/null
+++ b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H
@@ -0,0 +1,179 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::noiseModel
+
+Description
+    Base class for noise models.
+
+    Data is read from a dictionary, e.g.
+
+    \verbatim
+    rhoRef          0;
+    N               4096;
+    fl              25;
+    fu              25;
+    startTime       0;
+    \endverbatim
+
+    where
+    \table
+        Property    | Description                   | Required  | Default value
+        rhoRef      | Reference density             | no        | 1
+        N           | Number of samples in sampling window | no | 65536 (2^16)
+        fl          | Lower frequency bounds        | no        | 25
+        fu          | Upper frequency bounds        | no        | 10000
+        startTime   | Start time                    | no        | 0
+        graphFormat | Graph format                  | no        | raw
+    \endtable
+
+Note
+    The number of samples in the sampling window must be a power of 2
+
+
+SourceFiles
+    noiseModel.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef noiseModel_H
+#define noiseModel_H
+
+#include "dictionary.H"
+#include "scalarList.H"
+#include "instantList.H"
+#include "windowModel.H"
+#include "runTimeSelectionTables.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                         Class noiseModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class noiseModel
+{
+
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        noiseModel(const noiseModel&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const noiseModel&);
+
+
+protected:
+
+    // Protected Data
+
+        //- Copy of dictionary used for construction
+        const dictionary dict_;
+
+        //- Reference density (to convert from kinematic to static pressure)
+        scalar rhoRef_;
+
+        //- Number of samples in sampling window, default = 2^16
+        label nSamples_;
+
+        //- Lower frequency limit, default = 25Hz
+        scalar fLower_;
+
+        //- Upper frequency limit, default = 10kHz
+        scalar fUpper_;
+
+        //- Start time, default = 0s
+        scalar startTime_;
+
+        //- Window model
+        autoPtr<windowModel> windowModelPtr_;
+
+        //- Graph format
+        word graphFormat_;
+
+
+    // Protected Member Functions
+
+        //- Check and return uniform time step
+        scalar checkUniformTimeStep
+        (
+            const scalarList& times
+        ) const; 
+
+        //- Find and return start time index
+        label findStartTimeIndex
+        (
+            const instantList& allTimes,
+            const scalar startTime
+        ) const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("noiseModel");
+
+    //- Run time selection table  
+    declareRunTimeSelectionTable
+    (
+        autoPtr,
+        noiseModel,
+        dictionary,
+        (
+            const dictionary& dict
+        ),
+        (dict)
+    );
+
+    //- Selector
+    static autoPtr<noiseModel> New(const dictionary& dict);
+
+    //- Constructor
+    noiseModel(const dictionary& dict);
+
+    //- Destructor
+    virtual ~noiseModel();
+
+
+    // Public Member Functions
+
+        //- Abstract call to calculate
+        virtual void calculate() = 0;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModelNew.C b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModelNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..3f5fa4f25f8e38d716767f947bdf1f7a070e09f3
--- /dev/null
+++ b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModelNew.C
@@ -0,0 +1,53 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "noiseModel.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::autoPtr<Foam::noiseModel> Foam::noiseModel::New(const dictionary& dict)
+{
+    const word modelType(dict.lookup("noiseModel"));
+
+    Info<< "Selecting noiseModel " << modelType << endl;
+
+    dictionaryConstructorTable::iterator cstrIter =
+        dictionaryConstructorTablePtr_->find(modelType);
+
+    if (cstrIter == dictionaryConstructorTablePtr_->end())
+    {
+        FatalErrorInFunction
+            << "Unknown noiseModel type "
+            << modelType << nl << nl
+            << "Valid noiseModel types are:" << nl
+            << dictionaryConstructorTablePtr_->sortedToc()
+            << exit(FatalError);
+    }
+
+    return autoPtr<noiseModel>(cstrIter()(dict.subDict(modelType + "Coeffs")));
+}
+
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C b/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C
new file mode 100644
index 0000000000000000000000000000000000000000..fc03d0300330d2ff6bee5c98593cf154e69358f1
--- /dev/null
+++ b/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C
@@ -0,0 +1,207 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "pointNoise.H"
+#include "noiseFFT.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace noiseModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(pointNoise, 0);
+addToRunTimeSelectionTable(noiseModel, pointNoise, dictionary);
+
+// * * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * //
+
+void pointNoise::filterTimeData
+(
+    const Function1Types::CSV<scalar>& pData,
+    scalarField& t,
+    scalarField& p
+)
+{
+    const scalarField t0(pData.x());
+    const scalarField p0(pData.y());
+
+    DynamicList<scalar> tf(t0.size());
+    DynamicList<scalar> pf(t0.size());
+
+    forAll(t0, timeI)
+    {
+        if (t0[timeI] >= startTime_)
+        {
+            tf.append(t0[timeI]);
+            pf.append(p0[timeI]);
+        }
+    }
+
+    t.transfer(tf);
+    p.transfer(pf);
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void pointNoise::calculate()
+{
+    // Point data only handled by master
+    if (!Pstream::master())
+    {
+        return;
+    }
+
+    Info<< "Reading data file" << endl;
+
+    Function1Types::CSV<scalar> pData("pressure", dict_, "Data");
+
+    // Time and pressure history data
+    scalarField t, p;
+    filterTimeData(pData, t, p);
+    p *= rhoRef_;
+
+    Info<< "    read " << t.size() << " values" << nl << endl;
+
+    Info<< "Creating noise FFT" << endl;
+    const scalar deltaT = checkUniformTimeStep(t);
+
+    // Determine the windowing
+    windowModelPtr_->validate(t.size());
+    const windowModel& win = windowModelPtr_();
+    const scalar deltaf = 1.0/(deltaT*win.nSamples());
+    fileName outDir(fileName("postProcessing")/"noise"/typeName);
+
+    // Create the fft
+    noiseFFT nfft(deltaT, p);
+
+
+    // Narrow band data
+    // ----------------
+
+    // RMS pressure [Pa]
+    graph Prmsf(nfft.RMSmeanPf(win));
+    Info<< "    Creating graph for " << Prmsf.title() << endl;
+    Prmsf.write(outDir, graph::wordify(Prmsf.title()), graphFormat_);
+
+    // PSD [Pa^2/Hz]
+    graph PSDf(nfft.PSDf(win));
+    Info<< "    Creating graph for " << PSDf.title() << endl;
+    PSDf.write(outDir, graph::wordify(PSDf.title()), graphFormat_);
+
+    // PSD [dB/Hz]
+    graph PSDg
+    (
+        "PSD_dB_Hz(f)",
+        "f [Hz]",
+        "PSD(f) [dB_Hz]",
+        Prmsf.x(),
+        noiseFFT::PSD(PSDf.y())
+    );
+    Info<< "    Creating graph for " << PSDg.title() << endl;
+    PSDg.write(outDir, graph::wordify(PSDg.title()), graphFormat_);
+
+    // SPL [dB]
+    graph SPLg
+    (
+        "SPL_dB(f)",
+        "f [Hz]",
+        "SPL(f) [dB]",
+        Prmsf.x(),
+        noiseFFT::SPL(PSDf.y()*deltaf)
+    );
+    Info<< "    Creating graph for " << SPLg.title() << endl;
+    SPLg.write(outDir, graph::wordify(SPLg.title()), graphFormat_);
+
+    labelList octave13BandIDs;
+    scalarField octave13FreqCentre;
+    noiseFFT::octaveBandInfo
+    (
+        Prmsf.x(),
+        fLower_,
+        fUpper_,
+        3,
+        octave13BandIDs,
+        octave13FreqCentre
+    );
+
+
+    // 1/3 octave data
+    // ---------------
+
+    // PSD [Pa^2/Hz]
+    graph PSD13f(nfft.octaves(PSDf, octave13BandIDs, false));
+
+    // Integrated PSD = P(rms)^2 [Pa^2]
+    graph Prms13f2(nfft.octaves(PSDf, octave13BandIDs, true));
+
+    graph PSD13g
+    (
+        "PSD13_dB_Hz(fm)",
+        "fm [Hz]",
+        "PSD(fm) [dB_Hz]",
+        octave13FreqCentre,
+        noiseFFT::PSD(PSD13f.y())
+    );
+    Info<< "    Creating graph for " << PSD13g.title() << endl;
+    PSD13g.write(outDir, graph::wordify(PSD13g.title()), graphFormat_);
+
+    graph SPL13g
+    (
+        "SPL13_dB(fm)",
+        "fm [Hz]",
+        "SPL(fm) [dB]",
+        octave13FreqCentre,
+        noiseFFT::SPL(Prms13f2.y())
+    );
+    Info<< "    Creating graph for " << SPL13g.title() << endl;
+    SPL13g.write(outDir, graph::wordify(SPL13g.title()), graphFormat_);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+pointNoise::pointNoise(const dictionary& dict)
+:
+    noiseModel(dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+pointNoise::~pointNoise()
+{}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace noiseModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.H b/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.H
new file mode 100644
index 0000000000000000000000000000000000000000..30bc669ae96433c3ba8cf689afb9304a79a21067
--- /dev/null
+++ b/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.H
@@ -0,0 +1,142 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::noiseModels::pointNoise
+
+Description
+    Perform noise analysis on point-based pressure data.
+
+    Input data is read from a dictionary, e.g.
+
+    \verbatim
+    // Pressure reference
+    pRef            0;
+
+    // Number of samples in sampling window
+    // Must be a power of 2, default = 2^16 (=65536)
+    N               4096;
+
+    // Lower frequency bounds
+    fl              25;
+
+    // Upper frequency bounds
+    fu              25;
+
+    // Start time
+    startTime       0;
+
+    windowModel     <modelType>
+    <modelType>Coeffs
+    {
+        ...
+    }
+
+    // Pressure data supplied in CSV file format
+    csvFileData
+    {
+        fileName        "pressureData";
+        nHeaderLine     1;
+        refColumn       0;
+        componentColumns (1);
+        separator       " ";
+        mergeSeparators yes;
+    }
+
+    graphFormat     raw;
+
+    \endverbatim
+
+SourceFiles
+    pointNoise.C
+
+SeeAlso
+    noiseModel.H
+    windowModel.H
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef pointNoise_H
+#define pointNoise_H
+
+#include "noiseModel.H"
+#include "CSV.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace noiseModels
+{
+
+/*---------------------------------------------------------------------------*\
+                         Class pointNoise Declaration
+\*---------------------------------------------------------------------------*/
+
+class pointNoise
+:
+    public noiseModel
+{
+
+protected:
+
+    // Protected Member Functions
+
+        void filterTimeData
+        (
+            const Function1Types::CSV<scalar>& pData,
+            scalarField& t,
+            scalarField& p
+        );
+
+
+public:
+
+    //- Runtime type information
+    TypeName("pointNoise");
+
+    //- Constructor
+    pointNoise(const dictionary& dict);
+
+    //- Destructor
+    virtual ~pointNoise();
+
+
+    // Public Member Functions
+
+        //- Calculate
+        virtual void calculate();
+
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace noiseModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C
new file mode 100644
index 0000000000000000000000000000000000000000..b8e312c0ce5e0a156e3cba9206298389655b6877
--- /dev/null
+++ b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C
@@ -0,0 +1,705 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "surfaceNoise.H"
+#include "surfaceReader.H"
+#include "surfaceWriter.H"
+#include "noiseFFT.H"
+#include "graph.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace noiseModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(surfaceNoise, 0);
+addToRunTimeSelectionTable(noiseModel, surfaceNoise, dictionary);
+
+// * * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * //
+
+void surfaceNoise::initialise(const dictionary& dict)
+{
+    label nAvailableTimes = 0;
+
+    // All reading performed on the master processor only
+    if (Pstream::master())
+    {
+        // Create the surface reader
+        const word readerType(dict.lookup("reader"));
+        readerPtr_.reset(surfaceReader::New(readerType, inputFileName_).ptr());
+
+        // Find the index of the pressure data
+        const word pName(dict.lookupOrDefault<word>("pName", "p"));
+        const List<word> fieldNames(readerPtr_->fieldNames(0));
+        pIndex_ = findIndex(fieldNames, pName);
+        if (pIndex_ == -1)
+        {
+            FatalErrorInFunction
+                << "Unable to find pressure field name " << pName
+                << " in list of available fields: " << fieldNames
+                << exit(FatalError);
+        }
+
+        // Create the surface writer
+        // - Could be done later, but since this utility can process a lot of
+        //   data we can ensure that the user-input is correct prior to doing
+        //   the heavy lifting
+        const word writerType(dict.lookup("writer"));
+        dictionary optDict
+        (
+            dict.subOrEmptyDict("writeOptions").subOrEmptyDict(writerType)
+        );
+        writerPtr_.reset(surfaceWriter::New(writerType, optDict).ptr());
+
+        // Set the time range
+        const instantList allTimes = readerPtr_->times();
+        startTimeIndex_ = findStartTimeIndex(allTimes, startTime_);
+
+        // Determine the windowing
+        nAvailableTimes = allTimes.size() - startTimeIndex_;
+    }
+
+    Pstream::scatter(pIndex_);
+    Pstream::scatter(startTimeIndex_);
+    Pstream::scatter(nAvailableTimes);
+
+
+    // Note: all processors should call the windowing validate function
+    label nRequiredTimes = windowModelPtr_->validate(nAvailableTimes);
+
+    if (Pstream::master())
+    {
+        // Restrict times
+        const instantList allTimes = readerPtr_->times();
+
+        times_.setSize(nRequiredTimes);
+        forAll(times_, timeI)
+        {
+            times_[timeI] = allTimes[timeI + startTimeIndex_].value();
+        }
+        deltaT_ = checkUniformTimeStep(times_);
+
+        // Read the surface geometry
+        const meshedSurface& surf = readerPtr_->geometry();
+        nFace_ = surf.size();
+    }
+
+    Pstream::scatter(times_);
+    Pstream::scatter(deltaT_);
+    Pstream::scatter(nFace_);
+}
+
+
+void surfaceNoise::readSurfaceData
+(
+    const labelList& procFaceOffset,
+    List<scalarField>& pData
+)
+{
+    // Data is stored as pressure on surface at a given time.  Now we need to
+    // pivot the data so that we have the complete pressure time history per
+    // surface face.  In serial mode, this results in all pressure data being
+    // loaded into memory (!)
+
+    Info << "Reading pressure data" << endl;
+
+    if (Pstream::parRun())
+    {
+        PstreamBuffers pBufs(Pstream::nonBlocking);
+
+        // Procedure:
+        // 1. Master processor reads pressure data for all faces for all times
+        // 2. Master sends each processor a subset of faces
+        // 3. Local processor reconstructs the full time history for the subset
+        //    of faces
+        // Note: reading all data on master to avoid potential NFS problems...
+
+        const label myProcI = Pstream::myProcNo();
+        const label nLocalFace =
+            procFaceOffset[myProcI + 1] - procFaceOffset[myProcI];
+
+        // Complete pressure time history data for subset of faces
+        pData.setSize(nLocalFace);
+        const label nTimes = times_.size();
+        forAll(pData, faceI)
+        {
+            pData[faceI].setSize(nTimes);
+        }
+
+        // Read and send data
+        forAll(times_, i)
+        {
+            pBufs.clear();
+
+            if (Pstream::master())
+            {
+                label timeI = i + startTimeIndex_;
+
+                Info<< "    time: " << times_[i] << endl;
+
+                // Read pressure at all faces for time timeI
+                scalarField p(readerPtr_->field(timeI, pIndex_, scalar(0)));
+
+                // Apply conversions
+                p *= rhoRef_;
+
+                // Send subset of faces to each processor
+                for (label procI = 0; procI < Pstream::nProcs(); procI++)
+                {
+                    label face0 = procFaceOffset[procI];
+                    label nLocalFace =
+                        procFaceOffset[procI + 1] - procFaceOffset[procI];
+
+                    UOPstream toProc(procI, pBufs);
+                    toProc << SubList<scalar>(p, nLocalFace, face0);
+                }
+            }
+
+            pBufs.finishedSends();
+
+            // Receive data from the master
+            UIPstream fromProc(0, pBufs);
+
+            scalarList pSlice(fromProc);
+
+            forAll(pSlice, faceI)
+            {
+                pData[faceI][i] = pSlice[faceI];
+            }
+        }
+    }
+    else
+    {
+        const label nLocalFace = procFaceOffset[0];
+
+        pData.setSize(nLocalFace);
+        forAll(times_, timeI)
+        {
+            forAll(pData, faceI)
+            {
+                pData[faceI].setSize(times_.size());
+            }
+        }
+
+        forAll(times_, i)
+        {
+            label timeI = i + startTimeIndex_;
+
+            Info<< "    time: " << times_[i] << endl;
+            const scalarField p(readerPtr_->field(timeI, pIndex_, scalar(0)));
+
+            forAll(p, faceI)
+            {
+                pData[faceI][i] = p[faceI]*rhoRef_;
+            }
+        }
+    }
+
+    Info<< "Read "
+        << returnReduce(pData.size(), sumOp<label>())
+        << " pressure traces with "
+        << times_.size()
+        << " time values" << nl << endl;
+}
+
+
+Foam::scalar surfaceNoise::writeSurfaceData
+(
+    const word& fName,
+    const word& groupName,
+    const word& title,
+    const scalar freq,
+    const scalarField& data,
+    const labelList& procFaceOffset
+) const
+{
+    Info<< "    processing " << title << " for frequency " << freq << endl;
+
+    fileName outDir
+    (
+        fileName("postProcessing")/"noise"/groupName/Foam::name(freq)
+    );
+
+    if (Pstream::parRun())
+    {
+        // Collect the surface data so that we can output the surfaces
+
+        PstreamBuffers pBufs(Pstream::nonBlocking);
+
+        if (!Pstream::master())
+        {
+            UOPstream toProc(0, pBufs);
+            toProc << data;
+        }
+
+        pBufs.finishedSends();
+
+        scalar areaAverage = 0;
+        if (Pstream::master())
+        {
+            const meshedSurface& surf = readerPtr_->geometry();
+
+            scalarField allData(surf.size());
+
+            forAll(data, faceI)
+            {
+                // Master procFaceOffset is zero...
+                allData[faceI] = data[faceI];
+            }
+
+            for (label procI = 1; procI < Pstream::nProcs(); procI++)
+            {
+                UIPstream fromProc(procI, pBufs);
+                scalarList dataSlice(fromProc);
+                forAll(dataSlice, i)
+                {
+                    label faceI = procFaceOffset[procI] + i;
+                    allData[faceI] = dataSlice[i];
+                }
+            }
+
+            fileName outFileName = writerPtr_->write
+            (
+                outDir,
+                fName,
+                surf.points(),
+                surf.faces(),
+                title,
+                allData,
+                false
+            );
+
+            // TODO: Move faceAreas to demand-driven function in MeshedSurface
+            // scalarField faceAreas(surf.faces().size());
+            // forAll(faceAreas, i)
+            // {
+            //     faceAreas[i] = surf.faces()[i].mag(surf.points());
+            // }
+            //
+            // areaAverage = sum(allData*faceAreas)/sum(faceAreas);
+            areaAverage = sum(allData)/allData.size();
+        }
+        Pstream::scatter(areaAverage);
+
+        return areaAverage;
+    }
+    else
+    {
+        const meshedSurface& surf = readerPtr_->geometry();
+
+        writerPtr_->write
+        (
+            outDir,
+            fName,
+            surf.points(),
+            surf.faces(),
+            title,
+            data,
+            false
+        );
+
+        // TODO: Move faceAreas to demand-driven function in MeshedSurface
+        // scalarField faceAreas(surf.faces().size());
+        // forAll(faceAreas, i)
+        // {
+        //     faceAreas[i] = surf.faces()[i].mag(surf.points());
+        // }
+        //
+        // return sum(data*faceAreas)/sum(faceAreas);
+        return sum(data)/data.size();
+    }
+}
+
+
+Foam::scalar surfaceNoise::surfaceAverage
+(
+    const scalarField& data,
+    const labelList& procFaceOffset
+) const
+{
+    if (Pstream::parRun())
+    {
+        // Collect the surface data so that we can output the surfaces
+
+        PstreamBuffers pBufs(Pstream::nonBlocking);
+
+        if (!Pstream::master())
+        {
+            UOPstream toProc(0, pBufs);
+            toProc << data;
+        }
+
+        pBufs.finishedSends();
+
+        scalar areaAverage = 0;
+        if (Pstream::master())
+        {
+            const meshedSurface& surf = readerPtr_->geometry();
+
+            scalarField allData(surf.size());
+
+            forAll(data, faceI)
+            {
+                // Master procFaceOffset is zero...
+                allData[faceI] = data[faceI];
+            }
+
+            for (label procI = 1; procI < Pstream::nProcs(); procI++)
+            {
+                UIPstream fromProc(procI, pBufs);
+                scalarList dataSlice(fromProc);
+                forAll(dataSlice, i)
+                {
+                    label faceI = procFaceOffset[procI] + i;
+                    allData[faceI] = dataSlice[i];
+                }
+            }
+
+            // TODO: Move faceAreas to demand-driven function in MeshedSurface
+            scalarField faceAreas(surf.faces().size());
+            forAll(faceAreas, i)
+            {
+                faceAreas[i] = surf.faces()[i].mag(surf.points());
+            }
+
+//            areaAverage = sum(allData*faceAreas)/sum(faceAreas);
+            areaAverage = sum(allData)/allData.size();
+        }
+        Pstream::scatter(areaAverage);
+
+        return areaAverage;
+    }
+    else
+    {
+        const meshedSurface& surf = readerPtr_->geometry();
+
+        // TODO: Move faceAreas to demand-driven function in MeshedSurface
+        scalarField faceAreas(surf.faces().size());
+        forAll(faceAreas, i)
+        {
+            faceAreas[i] = surf.faces()[i].mag(surf.points());
+        }
+
+//        return sum(data*faceAreas)/sum(faceAreas);
+        return sum(data)/data.size();
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+surfaceNoise::surfaceNoise(const dictionary& dict)
+:
+    noiseModel(dict),
+    inputFileName_(dict.lookup("inputFile")),
+    pIndex_(0),
+    times_(),
+    deltaT_(0),
+    startTimeIndex_(0),
+    nFace_(0),
+    fftWriteInterval_(dict.lookupOrDefault("fftWriteInterval", 1))
+{
+    initialise(dict);
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+surfaceNoise::~surfaceNoise()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void surfaceNoise::calculate()
+{
+    // Container for pressure time history data per face
+    List<scalarField> pData;
+
+    // Processor procFaceOffsets
+    labelList procFaceOffset;
+    if (Pstream::parRun())
+    {
+        const label nProcs = Pstream::nProcs();
+        const label nFacePerProc = floor(nFace_/nProcs) + 1;
+
+        procFaceOffset.setSize(nProcs + 1, 0);
+        for (label i = 1; i < procFaceOffset.size(); i++)
+        {
+            procFaceOffset[i] = min(i*nFacePerProc, nFace_);
+        }
+    }
+    else
+    {
+        procFaceOffset.setSize(1, nFace_);
+    }
+
+    // Read pressure data from file
+    readSurfaceData(procFaceOffset, pData);
+
+    // Process the pressure data, and store results as surface values per
+    // frequency so that it can be output using the surface writer
+
+    Info<< "Creating noise FFTs" << endl;
+
+    // Storage for FFT data
+    const label nLocalFace = pData.size();
+    const scalarField freq1(noiseFFT::frequencies(nSamples_, deltaT_));
+    const label nFFT = freq1.size()/fftWriteInterval_;
+    List<scalarField> surfPrmsf(nFFT);
+    List<scalarField> surfPSDf(nFFT);
+    forAll(surfPrmsf, freqI)
+    {
+        surfPrmsf[freqI].setSize(nLocalFace);
+        surfPSDf[freqI].setSize(nLocalFace);
+    }
+
+    // Storage for 1/3 octave data
+    labelList octave13BandIDs;
+    scalarField octave13FreqCentre;
+    noiseFFT::octaveBandInfo
+    (
+        freq1,
+        fLower_,
+        fUpper_,
+        3,
+        octave13BandIDs,
+        octave13FreqCentre
+    );
+
+    List<scalarField> surfPSD13f(octave13BandIDs.size() - 1);
+    List<scalarField> surfPrms13f2(octave13BandIDs.size() - 1);
+    forAll(surfPSD13f, freqI)
+    {
+        surfPSD13f[freqI].setSize(nLocalFace);
+        surfPrms13f2[freqI].setSize(nLocalFace);
+    }
+
+    const windowModel& win = windowModelPtr_();
+
+    forAll(pData, faceI)
+    {
+        const scalarField& p = pData[faceI];
+
+        noiseFFT nfft(deltaT_, p);
+        graph Prmsf(nfft.RMSmeanPf(win));
+        graph PSDf(nfft.PSDf(win));
+
+        // Store the frequency results in slot for face of surface
+        forAll(surfPrmsf, i)
+        {
+            label freqI = (i + 1)*fftWriteInterval_ - 1;
+            surfPrmsf[i][faceI] = Prmsf.y()[freqI];
+            surfPSDf[i][faceI] = PSDf.y()[freqI];
+        }
+
+        // PSD [Pa^2/Hz]
+        graph PSD13f(nfft.octaves(PSDf, octave13BandIDs, false));
+
+        // Integrated PSD = P(rms)^2 [Pa^2]
+        graph Prms13f2(nfft.octaves(PSDf, octave13BandIDs, true));
+
+        // Store the 1/3 octave results in slot for face of surface
+        forAll(surfPSD13f, freqI)
+        {
+            surfPSD13f[freqI][faceI] = PSD13f.y()[freqI];
+            surfPrms13f2[freqI][faceI] = Prms13f2.y()[freqI];
+        }
+
+        // Free the storage for p
+//        p.clear();
+    }
+
+    // Output directory for graphs
+    fileName outDir(fileName("postProcessing")/"noise"/typeName);
+
+    const scalar deltaf = 1.0/(deltaT_*win.nSamples());
+    Info<< "Writing fft surface data" << endl;
+    {
+        scalarField PrmsfAve(surfPrmsf.size(), 0);
+        scalarField PSDfAve(surfPrmsf.size(), 0);
+        scalarField fOut(surfPrmsf.size(), 0);
+
+        forAll(surfPrmsf, i)
+        {
+            label freqI = i*fftWriteInterval_;
+            fOut[i] = freq1[freqI];
+            const word& fName = inputFileName_.name(true);
+            const word gName = "fft";
+            PrmsfAve[i] = writeSurfaceData
+            (
+                fName,
+                gName,
+                "Prmsf",
+                freq1[freqI],
+                surfPrmsf[i],
+                procFaceOffset
+            );
+
+            PSDfAve[i] = writeSurfaceData
+            (
+                fName,
+                gName,
+                "PSDf",
+                freq1[freqI],
+                surfPSDf[i],
+                procFaceOffset
+            );
+            writeSurfaceData
+            (
+                fName,
+                gName,
+                "PSD",
+                freq1[freqI],
+                noiseFFT::PSD(surfPSDf[i]),
+                procFaceOffset
+            );
+            writeSurfaceData
+            (
+                fName,
+                gName,
+                "SPL",
+                freq1[freqI],
+                noiseFFT::SPL(surfPSDf[i]*deltaf),
+                procFaceOffset
+            );
+        }
+
+        graph Prmsfg
+        (
+            "Average Prms(f)",
+            "f [Hz]",
+            "P(f) [Pa]",
+            fOut,
+            PrmsfAve
+        );
+        Prmsfg.write(outDir, graph::wordify(Prmsfg.title()), graphFormat_);
+
+        graph PSDfg
+        (
+            "Average PSD_f(f)",
+            "f [Hz]",
+            "PSD(f) [PaPa_Hz]",
+            fOut,
+            PSDfAve
+        );
+        PSDfg.write(outDir, graph::wordify(PSDfg.title()), graphFormat_);
+
+        graph PSDg
+        (
+            "Average PSD_dB_Hz(f)",
+            "f [Hz]",
+            "PSD(f) [dB_Hz]",
+            fOut,
+            noiseFFT::PSD(PSDfAve)
+        );
+        PSDg.write(outDir, graph::wordify(PSDg.title()), graphFormat_);
+
+        graph SPLg
+        (
+            "Average SPL_dB(f)",
+            "f [Hz]",
+            "SPL(f) [dB]",
+            fOut,
+            noiseFFT::SPL(PSDfAve*deltaf)
+        );
+        SPLg.write(outDir, graph::wordify(SPLg.title()), graphFormat_);
+    }
+
+
+    Info<< "Writing one-third octave surface data" << endl;
+    {
+        scalarField PSDfAve(surfPSD13f.size(), 0);
+        scalarField Prms13f2Ave(surfPSD13f.size(), 0);
+
+        forAll(surfPSD13f, i)
+        {
+            const word& fName = inputFileName_.name(true);
+            const word gName = "oneThirdOctave";
+            PSDfAve[i] = writeSurfaceData
+            (
+                fName,
+                gName,
+                "PSD13f",
+                octave13FreqCentre[i],
+                surfPSD13f[i],
+                procFaceOffset
+            );
+            writeSurfaceData
+            (
+                fName,
+                gName,
+                "PSD13",
+                octave13FreqCentre[i],
+                noiseFFT::PSD(surfPSD13f[i]),
+                procFaceOffset
+            );
+            writeSurfaceData
+            (
+                fName,
+                gName,
+                "SPL13",
+                octave13FreqCentre[i],
+                noiseFFT::SPL(surfPrms13f2[i]),
+                procFaceOffset
+            );
+
+            Prms13f2Ave[i] = surfaceAverage(surfPrms13f2[i], procFaceOffset);
+        }
+
+        graph PSD13g
+        (
+            "Average PSD13_dB_Hz(fm)",
+            "fm [Hz]",
+            "PSD(fm) [dB_Hz]",
+            octave13FreqCentre,
+            noiseFFT::PSD(PSDfAve)
+        );
+        PSD13g.write(outDir, graph::wordify(PSD13g.title()), graphFormat_);
+
+        graph SPL13g
+        (
+            "Average SPL13_dB(fm)",
+            "fm [Hz]",
+            "SPL(fm) [dB]",
+            octave13FreqCentre,
+            noiseFFT::SPL(Prms13f2Ave)
+        );
+        SPL13g.write(outDir, graph::wordify(SPL13g.title()), graphFormat_);
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace noiseModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.H b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.H
new file mode 100644
index 0000000000000000000000000000000000000000..1ba1772df4e1c40bf5008a15966bdf0c548bb6e8
--- /dev/null
+++ b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.H
@@ -0,0 +1,208 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::noiseModels::surfaceNoise
+
+Description
+    Perform noise analysis on surface-based pressure data.
+
+    Input data is read from a dictionary, e.g.
+
+    \verbatim
+    // Pressure reference
+    pRef            0;
+
+    // Number of samples in sampling window
+    // Must be a power of 2, default = 2^16 (=65536)
+    N               4096;
+
+    // Lower frequency bounds
+    fl              25;
+
+    // Upper frequency bounds
+    fu              25;
+
+    // Start time
+    startTime       0;
+
+    windowModel     <modelType>
+    <modelType>Coeffs
+    {
+        ...
+    }
+
+    // Input file
+    inputFile   "postProcessing/faceSource1/surface/patch/patch.case";
+
+    // Write interval for FFT data, default = 1
+    fftWriteInterval 100;
+
+    // Surface reader
+    reader      ensight;
+
+    // Surface writer
+    writer      ensight;
+
+    // Collate times for ensight output - ensures geometry is only written once
+    writeOptions
+    {
+        ensight
+        {
+            collateTimes true;
+        }
+    }
+    \endverbatim
+
+SourceFiles
+    surfaceNoise.C
+
+SeeAlso
+    noiseModel.H
+
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef surfaceNoise_H
+#define surfaceNoise_H
+
+#include "noiseModel.H"
+#include "labelList.H"
+#include "scalarField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of classes
+class surfaceReader;
+class surfaceWriter;
+
+namespace noiseModels
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class surfaceNoise Declaration
+\*---------------------------------------------------------------------------*/
+
+class surfaceNoise
+:
+    public noiseModel
+{
+
+protected:
+
+    // Protected Data
+
+        //- Input file name
+        const fileName inputFileName_;
+
+        //- Index of pressure field in reader field list
+        label pIndex_;
+
+        //- Sample times
+        scalarList times_;
+
+        //- Time step (constant)
+        scalar deltaT_;
+
+        //- Start time index
+        label startTimeIndex_;
+
+        //- Number of surface faces
+        label nFace_;
+
+        //- Frequency data output interval, default = 1
+        //  nSamples/2 data points are returned from the FFT, which can
+        //  result in a very large number of output files (1 per frequency)
+        label fftWriteInterval_;
+
+        //- Pointer to the surface reader
+        mutable autoPtr<surfaceReader> readerPtr_;
+
+        //- Pointer to the surface writer
+        autoPtr<surfaceWriter> writerPtr_;
+
+
+    // Protected Member Functions
+
+        //- Initialise
+        void initialise(const dictionary& dict);
+
+        //- Read surface data
+        void readSurfaceData
+        (
+            const labelList& procFaceOffset,
+            List<scalarField>& pData
+        );
+
+        //- Write surface data to file
+        //  Returns the area average value
+        scalar writeSurfaceData
+        (
+            const word& fName,
+            const word& groupName,
+            const word& title,
+            const scalar freq,
+            const scalarField& data,
+            const labelList& procFaceOffset
+        ) const;
+
+        //- Calculate the area average value
+        scalar surfaceAverage
+        (
+            const scalarField& data,
+            const labelList& procFaceOffset
+        ) const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("surfaceNoise");
+
+    //- Constructor
+    surfaceNoise(const dictionary& dict);
+
+    //- Destructor
+    virtual ~surfaceNoise();
+
+
+    // Public Member Functions
+
+        //- Calculate
+        virtual void calculate();
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace noiseModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/windowModels/Hanning/Hanning.C b/src/randomProcesses/windowModels/Hanning/Hanning.C
new file mode 100644
index 0000000000000000000000000000000000000000..8bafcf9bc574b986e8765824eedcaa60f726e6ba
--- /dev/null
+++ b/src/randomProcesses/windowModels/Hanning/Hanning.C
@@ -0,0 +1,122 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "Hanning.H"
+#include "addToRunTimeSelectionTable.H"
+#include "mathematicalConstants.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace windowModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(Hanning, 0);
+addToRunTimeSelectionTable(windowModel, Hanning, dictionary);
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Hanning::Hanning(const dictionary& dict, const label nSamples)
+:
+    windowModel(dict, nSamples),
+    symmetric_(readBool(dict.lookup("symmetric"))),
+    extended_(readBool(dict.lookup("extended"))),
+    alpha_(dict.lookupOrDefault("alpha", 0.5)) // Hamming = 0.54
+{
+    // Extend range if required
+    label offset = extended_ ? 1 : 0;
+    scalar m = nSamples - 1 + 2*offset;
+    
+    scalarField t(nSamples);
+    forAll(t, i)
+    {
+        t[i] = i + offset;
+    }
+
+    scalarField& wf = *this;
+    wf = alpha_ - (1 - alpha_)*cos(constant::mathematical::twoPi*t/m);
+
+    // Reset second half of window if symmetric
+    if (symmetric_)
+    {
+        label midPointI = 0;
+        if (nSamples % 2 == 0)
+        {
+            midPointI = nSamples/2;
+        }
+        else
+        {
+            midPointI = (nSamples + 1)/2;
+        }
+
+        for (label i = 0; i < midPointI; i++)
+        {
+            wf[nSamples - i - 1] = wf[i];
+        }
+    }
+
+    scalar sumSqr = sum(sqr(wf));
+
+    // Normalisation
+    wf *= sqrt(nSamples/sumSqr);
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Hanning::~Hanning()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Hanning::symmetric() const
+{
+    return symmetric_;
+}
+
+
+bool Hanning::extended() const
+{
+    return extended_;
+}
+
+
+Foam::scalar Hanning::alpha() const
+{
+    return alpha_;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace windowModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/windowModels/Hanning/Hanning.H b/src/randomProcesses/windowModels/Hanning/Hanning.H
new file mode 100644
index 0000000000000000000000000000000000000000..5522e6a04d9121827948d9870ff6a54b67755a74
--- /dev/null
+++ b/src/randomProcesses/windowModels/Hanning/Hanning.H
@@ -0,0 +1,125 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::windowModels::Hanning
+
+Description
+    Hanning window
+
+    The window is described by the function
+    \f[
+        wf = (1 - \alpha) - \alpha cos(2 \pi t/m);
+    \f]
+
+    Where:
+    \vartable
+        \alpha  | Coefficient with a default value of 0.5
+        t       | time
+        m       | window width
+    \endvartable
+
+    The window can be further manipulated by the controls:
+    - \c symmetric: force the window to be symmetric
+    - \c extended: extend the window by 1 element at start and end to produce
+      non-zero values at the start and end positions.  Note: window is
+      normalised to preserve energy content
+
+SourceFiles
+    Hanning.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef Hanning_H
+#define Hanning_H
+
+#include "autoPtr.H"
+#include "runTimeSelectionTables.H"
+#include "windowModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace windowModels
+{
+
+/*---------------------------------------------------------------------------*\
+                           Class Hanning Declaration
+\*---------------------------------------------------------------------------*/
+
+class Hanning
+:
+    public windowModel
+{
+
+protected:
+
+    // Protected Member Data
+
+        //- Symmetric switch
+        bool symmetric_;
+
+        //- Extended switch
+        bool extended_;
+
+        //- Window coefficient, default = 0.5
+        scalar alpha_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("Hanning");
+
+
+    //- Construct from dictionary
+    Hanning(const dictionary& dict, const label nSamples);
+
+    //- Destuctor
+    virtual ~Hanning();
+
+
+    // Public Member Functions
+
+        //- Return the symmetric flag
+        bool symmetric() const;
+
+        //- Return the extended flag
+        bool extended() const;
+
+        //- Return the window coefficient
+        scalar alpha() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace windowModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/windowModels/uniform/uniform.C b/src/randomProcesses/windowModels/uniform/uniform.C
new file mode 100644
index 0000000000000000000000000000000000000000..6bc75b31a8f93e79cabe4e4fac62ea8c7219e904
--- /dev/null
+++ b/src/randomProcesses/windowModels/uniform/uniform.C
@@ -0,0 +1,66 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "uniform.H"
+#include "addToRunTimeSelectionTable.H"
+#include "mathematicalConstants.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace windowModels
+{
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(uniform, 0);
+addToRunTimeSelectionTable(windowModel, uniform, dictionary);
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+uniform::uniform(const dictionary& dict, const label nSamples)
+:
+    windowModel(dict, nSamples),
+    value_(readScalar(dict.lookup("value")))
+{
+    scalarField& wf = *this;
+    wf = value_;
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+uniform::~uniform()
+{}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace windowModels
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/fft/fftRenumber.H b/src/randomProcesses/windowModels/uniform/uniform.H
similarity index 62%
rename from src/randomProcesses/fft/fftRenumber.H
rename to src/randomProcesses/windowModels/uniform/uniform.H
index fa2e50c58097f65caf1e3f9f84e029584694e87c..c422df79d35b2f944c324ed918eaeb26370a68d1 100644
--- a/src/randomProcesses/fft/fftRenumber.H
+++ b/src/randomProcesses/windowModels/uniform/uniform.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -21,57 +21,65 @@ License
     You should have received a copy of the GNU General Public License
     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
 
-Global
-    fftRenumber
+Class
+    Foam::windowModels::uniform
 
 Description
-    Multi-dimensional renumbering used in the Numerical Recipes
-    fft routine.
+    A window that applies uniform scaling.
 
 SourceFiles
-    fftRenumber.C
+    uniform.C
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef fftRenumber_H
-#define fftRenumber_H
+#ifndef uniform_H
+#define uniform_H
 
-#include "complex.H"
-#include "List.H"
-#include "labelList.H"
+#include "autoPtr.H"
+#include "runTimeSelectionTables.H"
+#include "windowModel.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 namespace Foam
 {
+namespace windowModels
+{
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+/*---------------------------------------------------------------------------*\
+                           Class uniform Declaration
+\*---------------------------------------------------------------------------*/
+
+class uniform
+:
+    public windowModel
+{
+
+protected:
+
+    // Protected data
+
+        //- Uniform value
+        scalar value_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("uniform");
+
+
+    //- Construct from dictionary
+    uniform(const dictionary& dict, const label nSamples);
 
-// Recursively evaluate the indexing necessary to do the folding of the fft
-// data. We recurse until we have the indexing ncessary for the folding in all
-// directions.
-void fftRenumberRecurse
-(
-    List<complex>& data,
-    List<complex>& renumData,
-    const labelList& nn,
-    label nnprod,
-    label ii,
-    label l1,
-    label l2
-);
-
-
-// Fold the n-d data array to get the fft components in the right places.
-void fftRenumber
-(
-    List<complex>& data,
-    const labelList& nn
-);
+    //- Destuctor
+    virtual ~uniform();
+};
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+} // End namespace windowModels
 } // End namespace Foam
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/randomProcesses/windowModels/windowModel/windowModel.C b/src/randomProcesses/windowModels/windowModel/windowModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..dcaae9afd99318359f57808141545e1592be90b1
--- /dev/null
+++ b/src/randomProcesses/windowModels/windowModel/windowModel.C
@@ -0,0 +1,125 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "windowModel.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(windowModel, 0);
+    defineRunTimeSelectionTable(windowModel, dictionary);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::windowModel::windowModel(const dictionary& dict, const label nSamples)
+:
+    scalarField(nSamples),
+    nOverlapSamples_(0),
+    nWindow_(dict.lookupOrDefault("nWindow", -1))
+{
+    scalar prc = readScalar(dict.lookup("overlapPercent"));
+    nOverlapSamples_ = floor(prc/scalar(100)*nSamples);
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::windowModel::~windowModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+Foam::label Foam::windowModel::nSamples() const
+{
+    return size();
+}
+
+
+Foam::label Foam::windowModel::nWindow() const
+{
+    return nWindow_;
+}
+
+
+Foam::label Foam::windowModel::nWindowsTotal(label nSamplesTotal) const
+{
+    const label nSamples = this->nSamples();
+
+    return floor((nSamplesTotal - nSamples)/(nSamples - nOverlapSamples_)) + 1;
+}
+
+
+Foam::label Foam::windowModel::validate(const label nSamplesTotal)
+{
+    label nSamples = this->nSamples();
+
+    if (nSamplesTotal < nSamples)
+    {
+        FatalErrorInFunction
+            << "Block size N = " << nSamples
+            << " is larger than total number of data points = " << nSamplesTotal
+            << exit(FatalError);
+    }
+
+    label nWindowAvailable = nWindowsTotal(nSamplesTotal);
+
+    if (nWindow_ == -1)
+    {
+        nWindow_ = nWindowAvailable;
+    }
+
+    if (nWindow_ > nWindowAvailable)
+    {
+        FatalErrorInFunction
+            << "Number of data points calculated with " << nWindow_
+            << " windows greater than the total number of data points"
+            << nl
+            << "    Block size, N = " << nSamples << nl
+            << "    Total number of data points = " << nSamplesTotal << nl
+            << "    Maximum number of windows = " << nWindowAvailable << nl
+            << "    Requested number of windows = " << nWindow_
+            << exit(FatalError);
+    }
+
+    label nRequiredSamples =
+        nWindow_*nSamples - (nWindow_ - 1)*nOverlapSamples_;
+
+    Info<< "Windowing:" << nl
+        << "    Total samples              : " << nSamplesTotal << nl
+        << "    Samples per window         : " << nSamples << nl
+        << "    Number of windows          : " << nWindow_ << nl
+        << "    Overlap size               : " << nOverlapSamples_ << nl
+        << "    Required number of samples : " << nRequiredSamples
+        << endl;
+
+    return nRequiredSamples;
+}
+
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/windowModels/windowModel/windowModel.H b/src/randomProcesses/windowModels/windowModel/windowModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..b9e1845fe0bc25e2f1f73f05ef077fdc92fc2425
--- /dev/null
+++ b/src/randomProcesses/windowModels/windowModel/windowModel.H
@@ -0,0 +1,143 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::windowModel
+
+Description
+    Base class for windowing models
+
+SourceFiles
+    noiseFFT.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef windowModel_H
+#define windowModel_H
+
+#include "autoPtr.H"
+#include "runTimeSelectionTables.H"
+#include "scalarField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                         Class windowModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class windowModel
+:
+    public scalarField
+{
+
+protected:
+
+    // Protected Data
+
+        //- Number of overlap samples per window
+        label nOverlapSamples_;
+
+        //- Number of windows
+        label nWindow_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("windowModel");
+
+    // Declare runtime constructor selection table
+    declareRunTimeSelectionTable
+    (
+        autoPtr,
+        windowModel,
+        dictionary,
+        (
+            const dictionary& dict,
+            const label nSamples
+        ),
+        (dict, nSamples)
+    );
+
+
+    //- Construct from dictionary
+    windowModel(const dictionary& dict, const label nSamples);
+
+
+    // Selectors
+
+        //- Return a reference to the selected window model
+        static autoPtr<windowModel> New
+        (
+            const dictionary& dict,
+            const label nSamples
+        );
+
+
+    //- Destuctor
+    virtual ~windowModel();
+
+
+    // Public Member Functions
+
+        //- Return the number of samples in the window
+        label nSamples() const;
+
+        //- Return the number of windows
+        label nWindow() const;
+
+        //- Return the total number of windows for a given number of samples
+        label nWindowsTotal(label nSamplesTotal) const;
+
+        //- Validate that the window is applicable to the data set size, and
+        //  return the number of required data points
+        label validate(label n);
+
+        //- Return the windowed data
+        template<class Type>
+        tmp<Field<Type> > apply
+        (
+            const Field<Type>& fld,
+            const label windowI
+        ) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+    #include "windowModelTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/windowModels/windowModel/windowModelNew.C b/src/randomProcesses/windowModels/windowModel/windowModelNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..68aed5d766ed2c004587f0b737e020cde9cb2e62
--- /dev/null
+++ b/src/randomProcesses/windowModels/windowModel/windowModelNew.C
@@ -0,0 +1,63 @@
+#/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "windowModel.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::autoPtr<Foam::windowModel> Foam::windowModel::New
+(
+    const dictionary& dict,
+    const label nSamples
+)
+{
+    const word modelType(dict.lookup("windowModel"));
+
+    Info<< "Selecting windowModel " << modelType << endl;
+
+    dictionaryConstructorTable::iterator cstrIter =
+        dictionaryConstructorTablePtr_->find(modelType);
+
+    if (cstrIter == dictionaryConstructorTablePtr_->end())
+    {
+        FatalErrorIn
+        (
+            "windowModel::New(const dictionary&, const label)"
+        )   << "Unknown windowModel type "
+            << modelType << nl << nl
+            << "Valid windowModel types are:" << nl
+            << dictionaryConstructorTablePtr_->sortedToc()
+            << exit(FatalError);
+    }
+
+    return autoPtr<windowModel>
+    (
+        cstrIter()(dict.subDict(modelType + "Coeffs"), nSamples)
+    );
+
+}
+
+
+// ************************************************************************* //
diff --git a/src/randomProcesses/windowModels/windowModel/windowModelTemplates.C b/src/randomProcesses/windowModels/windowModel/windowModelTemplates.C
new file mode 100644
index 0000000000000000000000000000000000000000..76f1241a8314f43a05dad315b303039bfd8765be
--- /dev/null
+++ b/src/randomProcesses/windowModels/windowModel/windowModelTemplates.C
@@ -0,0 +1,68 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+Foam::tmp<Foam::Field<Type> > Foam::windowModel::apply
+(
+    const Field<Type>& fld,
+    const label windowI
+) const
+{
+    label nSamples = this->nSamples();
+
+    if (nSamples > fld.size())
+    {
+        FatalErrorInFunction
+            << "Number of samples in sampling window is greater than the "
+            << "size of the input field" << nl
+            << "    input field size       = " << fld.size() << nl
+            << "    window size            = " << nSamples << nl
+            << "    requested window index = " << windowI
+            << exit(FatalError);
+    }
+
+
+    tmp<Field<Type> > tresult(new Field<Type>(nSamples, pTraits<Type>::zero));
+    Field<Type>& result = tresult.ref();
+
+    label nWindow = nWindowsTotal(fld.size());
+    if (windowI >= nWindow)
+    {
+        FatalErrorInFunction
+            << "Requested window " << windowI << " outside of range. "
+            << "Number of available windows is " << nWindow
+            << abort(FatalError);
+    }
+
+    label windowOffset = windowI*(nSamples - nOverlapSamples_);
+
+    const scalarField& wf = *this;
+    result = wf*SubField<Type>(fld, nSamples, windowOffset);
+
+    return tresult;
+}
+
+
+// ************************************************************************* //
diff --git a/src/sampling/Make/files b/src/sampling/Make/files
index 03fab92a74e898b6c1c31c209660212c2b2c29a6..3416dd38d1a1f1222c48219be263940a412a4ef4 100644
--- a/src/sampling/Make/files
+++ b/src/sampling/Make/files
@@ -51,6 +51,12 @@ $(surfWriters)/starcd/starcdSurfaceWriter.C
 $(surfWriters)/vtk/vtkSurfaceWriter.C
 $(surfWriters)/boundaryData/boundaryDataSurfaceWriter.C
 
+surfReaders = sampledSurface/readers
+
+$(surfReaders)/surfaceReader.C
+$(surfReaders)/surfaceReaderNew.C
+$(surfReaders)/ensight/ensightSurfaceReader.C
+
 graphField/writePatchGraph.C
 graphField/writeCellGraph.C
 graphField/makeGraph.C
diff --git a/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C
new file mode 100644
index 0000000000000000000000000000000000000000..3e1b422bdea6e8a909a57829e87018d30b06c603
--- /dev/null
+++ b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.C
@@ -0,0 +1,515 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "ensightSurfaceReader.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(ensightSurfaceReader, 0);
+    addToRunTimeSelectionTable(surfaceReader, ensightSurfaceReader, fileName);
+}
+
+
+void Foam::ensightSurfaceReader::skip(const label n, IFstream& is) const
+{
+    label i = 0;
+    token t;
+    while (is.good() && (i < n))
+    {
+        is >> t;
+        i++;
+
+        if (debug)
+        {
+            Info<< "Skipping token " << t << endl;
+        }
+    }
+
+    if (i != n)
+    {
+        WarningInFunction
+            << "Requested to skip " << n << "tokens, but stream exited after "
+            << i << " tokens. Last token read: " << t
+            << endl;
+    }
+}
+
+
+void Foam::ensightSurfaceReader::readGeometryHeader(ensightReadFile& is) const
+{
+    // Binary flag string if applicable
+    is.readBinaryHeader();
+
+    string buffer;
+
+    // Ensight Geometry File
+    is.read(buffer);
+    if (debug) Info<< "buffer: " << buffer << endl;
+
+    // Description - 1
+    is.read(buffer);
+    if (debug) Info<< "buffer: " << buffer << endl;
+
+    // Node info
+    is.read(buffer);
+    if (debug) Info<< "buffer: " << buffer << endl;
+
+    // Element info
+    is.read(buffer);
+    if (debug) Info<< "buffer: " << buffer << endl;
+
+    // Part
+    is.read(buffer);
+    if (debug) Info<< "buffer: " << buffer << endl;
+
+    // Part number
+    label ibuffer;
+    is.read(ibuffer);
+    if (debug) Info<< "ibuffer: " << ibuffer << endl;
+
+    // Description - 2
+    is.read(buffer);
+    if (debug) Info<< "buffer: " << buffer << endl;
+
+    // Co-ordinates
+    is.read(buffer);
+    if (debug) Info<< "buffer: " << buffer << endl;
+}
+
+
+void Foam::ensightSurfaceReader::debugSection
+(
+    const word& expected,
+    IFstream& is
+) const
+{
+    word actual(is);
+
+    if (expected != actual)
+    {
+        FatalIOErrorInFunction(is)
+            << "Expected section header '" << expected
+            << "' but read the word '" << actual << "'"
+            << exit(FatalIOError);
+    }
+
+    if (debug)
+    {
+        Info<< "Read section header: " << expected << endl;
+    }
+}
+
+
+void Foam::ensightSurfaceReader::readCase(IFstream& is)
+{
+    if (debug)
+    {
+        InfoInFunction<< endl;
+    }
+
+    if (!is.good())
+    {
+        FatalErrorInFunction
+            << "Cannot read file " << is.name()
+            << exit(FatalError);
+    }
+
+    string buffer;
+
+    // Read the file
+    debugSection("FORMAT", is);
+    skip(3, is); // type: ensight gold
+
+    debugSection("GEOMETRY", is);
+    readSkip(is, 2, meshFileName_);
+
+    debugSection("VARIABLE", is);
+
+    DynamicList<word> fieldNames(10);
+    DynamicList<word> fieldFileNames(10);
+    word fieldName;
+    word fieldFileName;
+    while (is.good())
+    {
+        word primitiveType(is); // scalar, vector
+
+        if (primitiveType == "TIME")
+        {
+            break;
+        }
+
+        readSkip(is, 3, fieldName); // p, U etc
+        fieldNames.append(fieldName);
+
+        is >> fieldFileName; // surfaceName.****.fieldName
+        fieldFileNames.append(fieldFileName);
+    }
+    fieldNames_.transfer(fieldNames);
+    fieldFileNames_.transfer(fieldFileNames);
+
+    if (debug)
+    {
+        Info<< "fieldNames: " << fieldNames_ << nl
+            << "fieldFileNames: " << fieldFileNames_ << endl;
+    }
+
+    // Start reading time information
+    skip(3, is); // time set: 1
+    readSkip(is, 3, nTimeSteps_);
+    readSkip(is, 3, timeStartIndex_);
+    readSkip(is, 2, timeIncrement_);
+
+    if (debug)
+    {
+        Info<< "nTimeSteps: " << nTimeSteps_ << nl
+            << "timeStartIndex: " << timeStartIndex_ << nl
+            << "timeIncrement: " << timeIncrement_ << endl;
+    }
+
+    // Read the time values
+    skip(2, is);
+    timeValues_.setSize(nTimeSteps_);
+    for (label i = 0; i < nTimeSteps_; i++)
+    {
+        scalar t(readScalar(is));
+
+        timeValues_[i].value() = t;
+        // TODO: use character representation of t directly instead of
+        // regenerating from scalar value
+        timeValues_[i].name() = Foam::name(t);
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::ensightSurfaceReader::ensightSurfaceReader(const fileName& fName)
+:
+    surfaceReader(fName),
+    streamFormat_(IOstream::ASCII),
+    baseDir_(fName.path()),
+    meshFileName_(),
+    fieldNames_(),
+    fieldFileNames_(),
+    nTimeSteps_(0),
+    timeStartIndex_(0),
+    timeIncrement_(1),
+    timeValues_(),
+    surfPtr_(NULL)
+{
+    IFstream is(fName);
+    readCase(is);
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::ensightSurfaceReader::~ensightSurfaceReader()
+{}
+
+
+// * * * * * * * * * * * * * Public Member Functions   * * * * * * * * * * * //
+
+const Foam::meshedSurface& Foam::ensightSurfaceReader::geometry()
+{
+    if (debug)
+    {
+        InfoInFunction<< endl;
+    }
+
+    if (!surfPtr_.valid())
+    {
+        IFstream isBinary(baseDir_/meshFileName_, IOstream::BINARY);
+
+        if (!isBinary.good())
+        {
+            FatalErrorInFunction
+                << "Cannot read file " << isBinary.name()
+                << exit(FatalError);
+        }
+
+        streamFormat_ = IOstream::BINARY;
+        {
+            istream& is = isBinary.stdStream();
+
+            char buffer[80];
+            is.read(buffer, 80);
+
+            char test[80];
+            label nChar = 0;
+            for (label i = 0; i < 80; ++i)
+            {
+                if (buffer[i] == '\0')
+                {
+                    break;
+                }
+                test[i] = buffer[i];
+                nChar++;
+            }
+
+            string testStr(test, nChar);
+
+            if
+            (
+                (testStr.find("binary", 0) == string::npos)
+             && (testStr.find("Binary", 0) == string::npos)
+            )
+            {
+                streamFormat_ = IOstream::ASCII;
+            }
+        }
+
+        if (debug)
+        {
+            Info<< "stream format: ";
+            if (streamFormat_ == IOstream::ASCII)
+            {
+                Info<< "ascii" << endl;
+            }
+            else
+            {
+                Info<< "binary" << endl;
+            }
+        }
+            
+
+        ensightReadFile is(baseDir_/meshFileName_, streamFormat_);
+
+        if (debug)
+        {
+            Info<< "File: " << is.name() << endl;
+        }
+
+        readGeometryHeader(is);
+        
+        label nPoints;
+        is.read(nPoints);
+
+        if (debug)
+        {
+            Info<< "nPoints: " << nPoints << endl;
+        }
+
+        pointField points(nPoints);
+        {
+            scalarField x(nPoints);
+            for (label dir = 0; dir < 3; dir++)
+            {
+                forAll(points, pointI)
+                {
+                    is.read(x[pointI]);
+                }
+
+                points.replace(dir, x);
+            }
+        }
+
+
+        // Read faces - may be a mix of tris, quads and polys
+        DynamicList<face> faces(ceil(nPoints/3));
+        DynamicList<Tuple2<string, label> > schema(faces.size());
+        string faceType = "";
+        label nFace = 0;
+        while (is.good()) // (is.peek() != EOF)
+        {
+            is.read(faceType);
+
+            if (!is.good())
+            {
+                break;
+            }
+
+            if (debug)
+            {
+                Info<< "faceType: " << faceType << endl;
+            }
+
+            if (faceType == "tria3")
+            {
+                is.read(nFace);
+
+                label np = 3;
+                for (label faceI = 0; faceI < nFace; ++faceI)
+                {
+                    face f(np);
+                    for (label fpI = 0; fpI < np; fpI++)
+                    {
+                        is.read(f[fpI]);
+                    }
+
+                    faces.append(f);
+                }
+            }
+            else if (faceType == "quad4")
+            {
+                is.read(nFace);
+
+                label np = 4;
+                for (label faceI = 0; faceI < nFace; ++faceI)
+                {
+                    face f(np);
+                    for (label fpI = 0; fpI < np; fpI++)
+                    {
+                        is.read(f[fpI]);
+                    }
+
+                    faces.append(f);
+                }
+            }
+            else if (faceType == "nsided")
+            {
+                is.read(nFace);
+
+                labelList np(nFace);
+                for (label faceI = 0; faceI < nFace; ++faceI)
+                {
+                    is.read(np[faceI]);
+                }
+                for (label faceI = 0; faceI < nFace; ++faceI)
+                {
+                    face f(np[faceI]);
+                    for (label fpI = 0; fpI < f.size(); ++fpI)
+                    {
+                        is.read(f[fpI]);
+                    }
+
+                    faces.append(f);
+                }
+            }
+            else
+            {
+                if (debug)
+                {
+                    WarningInFunction
+                        << "Unknown face type: " << faceType
+                        << ".  Aborting read and continuing with current "
+                        << "elements only" << endl;
+                }
+
+                break;
+            }
+            schema.append(Tuple2<string, label>(faceType, nFace));
+        }
+
+        schema_.transfer(schema);
+
+        if (debug)
+        {
+            Info<< "read nFaces: " << faces.size() << nl
+                << "file schema: " << schema_ << endl;
+        }
+
+        // Convert from 1-based Ensight addressing to 0-based OF addressing
+        forAll(faces, faceI)
+        {
+            face& f = faces[faceI];
+
+            forAll(f, fpI)
+            {
+                f[fpI]--;
+            }
+        }
+
+        surfPtr_.reset(new meshedSurface(xferMove(points), faces.xfer()));
+    }
+
+    return surfPtr_();
+}
+
+
+Foam::instantList Foam::ensightSurfaceReader::times() const
+{
+    return timeValues_;
+}
+
+
+Foam::wordList Foam::ensightSurfaceReader::fieldNames
+(
+    const label timeIndex
+) const
+{
+    return fieldNames_;
+}
+
+
+Foam::tmp<Foam::Field<Foam::scalar> > Foam::ensightSurfaceReader::field
+(
+    const label timeIndex,
+    const label fieldIndex,
+    const scalar& refValue
+) const
+{
+    return readField<scalar>(timeIndex, fieldIndex);
+}
+
+
+Foam::tmp<Foam::Field<Foam::vector> > Foam::ensightSurfaceReader::field
+(
+    const label timeIndex,
+    const label fieldIndex,
+    const vector& refValue
+) const
+{
+    return readField<vector>(timeIndex, fieldIndex);
+}
+
+
+Foam::tmp<Foam::Field<Foam::sphericalTensor> >
+Foam::ensightSurfaceReader::field
+(
+    const label timeIndex,
+    const label fieldIndex,
+    const sphericalTensor& refValue
+) const
+{
+    return readField<sphericalTensor>(timeIndex, fieldIndex);
+}
+
+
+Foam::tmp<Foam::Field<Foam::symmTensor> > Foam::ensightSurfaceReader::field
+(
+    const label timeIndex,
+    const label fieldIndex,
+    const symmTensor& refValue
+) const
+{
+    return readField<symmTensor>(timeIndex, fieldIndex);
+}
+
+
+Foam::tmp<Foam::Field<Foam::tensor> > Foam::ensightSurfaceReader::field
+(
+    const label timeIndex,
+    const label fieldIndex,
+    const tensor& refValue
+) const
+{
+    return readField<tensor>(timeIndex, fieldIndex);
+}
+
+
+// ************************************************************************* //
diff --git a/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.H b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.H
new file mode 100644
index 0000000000000000000000000000000000000000..8c99cfd466a313feed30455a2c8e4dd5fb862e35
--- /dev/null
+++ b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReader.H
@@ -0,0 +1,201 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::ensightensightSurfaceReader
+
+Description
+    Ensight format surface reader
+
+SourceFiles
+    ensightSurfaceReader.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef ensightSurfaceReader_H
+#define ensightSurfaceReader_H
+
+#include "surfaceReader.H"
+#include "ensightReadFile.H"
+#include "Tuple2.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                    Class ensightSurfaceReader Declaration
+\*---------------------------------------------------------------------------*/
+
+class ensightSurfaceReader
+:
+    public surfaceReader
+{
+protected:
+
+    // Protected Data
+
+        //- Format flag
+        IOstream::streamFormat streamFormat_;
+
+        //- Base directory
+        fileName baseDir_;
+
+        //- Name of mesh file
+        word meshFileName_;
+
+        //- Field names
+        List<word> fieldNames_;
+
+        //- Field file names
+        List<word> fieldFileNames_;
+
+        //- Number of time steps
+        label nTimeSteps_;
+
+        //- Start time index
+        label timeStartIndex_;
+
+        //- Time increment
+        label timeIncrement_;
+
+        //- Times
+        instantList timeValues_;
+
+        //- Pointer to the surface
+        autoPtr<meshedSurface> surfPtr_;
+
+        List<Tuple2<string, label> > schema_;
+
+
+    // Protected Member Functions
+
+        //- Read and check a section header
+        void debugSection(const word& expected, IFstream& is) const;
+
+        //- Read the case file
+        void readCase(IFstream& is);
+
+        //- Helper function to skip forward n steps in stream
+        void skip(const label n, IFstream& is) const;
+
+        //- Read (and throw away) geometry file header
+        void readGeometryHeader(ensightReadFile& is) const;
+
+        //- Helper function to return Type after skipping n tokens
+        template<class Type>
+        void readSkip(IFstream& is, const label nSkip, Type& value) const;
+
+        //- Helper function to return a field
+        template<class Type>
+        tmp<Field<Type> > readField
+        (
+            const label timeIndex,
+            const label fieldIndex
+        ) const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("ensight");
+
+    // Constructors
+
+        //- Construct from fileName
+        ensightSurfaceReader(const fileName& fName);
+
+
+    //- Destructor
+    virtual ~ensightSurfaceReader();
+
+
+    // Member Functions
+
+        //- Return a reference to the surface geometry
+        virtual const meshedSurface& geometry();
+
+        //- Return a list of the available times
+        virtual instantList times() const;
+
+        //- Return a list of the available fields at a given time
+        virtual wordList fieldNames(const label timeIndex) const;
+
+        //- Return a scalar field at a given time
+        virtual tmp<Field<scalar> > field
+        (
+            const label timeIndex,
+            const label fieldIndex,
+            const scalar& refValue = pTraits<scalar>::zero
+        ) const;
+
+        //- Return a scalar field at a given time
+        virtual tmp<Field<vector> > field
+        (
+            const label timeIndex,
+            const label fieldIndex,
+            const vector& refValue = pTraits<vector>::zero
+        ) const;
+
+        //- Return a sphericalTensor field at a given time
+        virtual tmp<Field<sphericalTensor> > field
+        (
+            const label timeIndex,
+            const label fieldIndex,
+            const sphericalTensor& reValue = pTraits<sphericalTensor>::zero
+        ) const;
+
+        //- Return a symmTensor field at a given time
+        virtual tmp<Field<symmTensor> > field
+        (
+            const label timeIndex,
+            const label fieldIndex,
+            const symmTensor& reValue = pTraits<symmTensor>::zero
+        ) const;
+
+        //- Return a tensor field at a given time
+        virtual tmp<Field<tensor> > field
+        (
+            const label timeIndex,
+            const label fieldIndex,
+            const tensor& reValue = pTraits<tensor>::zero
+        ) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+    #include "ensightSurfaceReaderTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReaderTemplates.C b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReaderTemplates.C
new file mode 100644
index 0000000000000000000000000000000000000000..04a593575aa95afa4bf8c08f552abbcf608e4eb9
--- /dev/null
+++ b/src/sampling/sampledSurface/readers/ensight/ensightSurfaceReaderTemplates.C
@@ -0,0 +1,161 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include <iomanip>
+#include <sstream>
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+template<class Type>
+void Foam::ensightSurfaceReader::readSkip
+(
+    IFstream& is,
+    const label nSkip,
+    Type& value
+) const
+{
+    skip(nSkip, is);
+
+    is  >> value;
+}
+
+
+template<class Type>
+Foam::tmp<Foam::Field<Type> > Foam::ensightSurfaceReader::readField
+(
+    const label timeIndex,
+    const label fieldIndex
+) const
+{
+    if (debug)
+    {
+        InfoInFunction<< endl;
+    }
+
+    const word& fieldName(fieldNames_[fieldIndex]);
+    const label fileIndex = timeStartIndex_ + timeIndex*timeIncrement_;
+
+    fileName fieldFileName(fieldFileNames_[fieldIndex]);
+
+    std::ostringstream oss;
+    oss << std::setfill('0') << std::setw(4) << fileIndex;
+    const word indexStr = oss.str();
+    fieldFileName.replace("****", indexStr);
+
+    
+    ensightReadFile is(baseDir_/fieldFileName, streamFormat_);
+
+    if (!is.good())
+    {
+        FatalErrorInFunction
+            << "Cannot read file " << is.name()
+            << " for field " << fieldName
+            << exit(FatalError);
+    }
+
+    // Check that data type is as expected
+    string primitiveType;
+    is.read(primitiveType);
+    
+
+    if (debug)
+    {
+        Info<< "primitiveType: " << primitiveType << endl;
+    }
+
+    if (primitiveType != pTraits<Type>::typeName)
+    {
+        FatalIOErrorInFunction(is)
+            << "Expected " << pTraits<Type>::typeName << "values "
+            << "but found type " << primitiveType
+            << exit(FatalIOError);
+    }
+
+    scalar value;
+    string strValue;
+    label iValue;
+
+    // Read header info: part index, e.g. part 1
+    is.read(strValue);
+    is.read(iValue);
+
+    // Allocate storage for data as a list per component
+    List<DynamicList<scalar> > values(pTraits<Type>::nComponents);
+    label n = surfPtr_->size();
+    forAll(values, cmptI)
+    {
+        values.setSize(n);
+    }
+
+    // Read data file using schema generated while reading the surface
+    forAll(schema_, i)
+    {
+        if (debug)
+        {
+            const string& faceType = schema_[i].first();
+            Info<< "Reading face type " << faceType << " data" << endl;
+        }
+
+        const label nFace = schema_[i].second();
+
+        if (nFace != 0)
+        {
+            is.read(strValue);
+
+            for
+            (
+                direction cmptI=0;
+                cmptI < pTraits<Type>::nComponents;
+                ++cmptI
+            )
+            {
+                for (label faceI = 0; faceI < nFace; ++faceI)
+                {
+                    is.read(value);
+                    values[cmptI].append(value);
+                }
+            }
+        }
+    }
+
+    tmp<Field<Type> > tField(new Field<Type>(n, pTraits<Type>::zero));
+    Field<Type>& field = tField.ref();
+
+    for
+    (
+        direction cmptI=0;
+        cmptI < pTraits<Type>::nComponents;
+        ++cmptI
+    )
+    {
+        field.replace(cmptI, values[cmptI]);
+        values[cmptI].clear();
+    }
+
+    return tField;
+}
+
+
+// ************************************************************************* //
diff --git a/src/sampling/sampledSurface/readers/surfaceReader.C b/src/sampling/sampledSurface/readers/surfaceReader.C
new file mode 100644
index 0000000000000000000000000000000000000000..fb90c1d80fe2049d87d1406ef8fc8fe35eb63c67
--- /dev/null
+++ b/src/sampling/sampledSurface/readers/surfaceReader.C
@@ -0,0 +1,51 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "surfaceReader.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(surfaceReader, 0);
+    defineRunTimeSelectionTable(surfaceReader, fileName);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::surfaceReader::surfaceReader(const fileName& fName)
+:
+    fileName_(fName)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::surfaceReader::~surfaceReader()
+{}
+
+
+// ************************************************************************* //
diff --git a/src/sampling/sampledSurface/readers/surfaceReader.H b/src/sampling/sampledSurface/readers/surfaceReader.H
new file mode 100644
index 0000000000000000000000000000000000000000..2ccdc470de4b8de5c9f24ccee27a32fd90ba858e
--- /dev/null
+++ b/src/sampling/sampledSurface/readers/surfaceReader.H
@@ -0,0 +1,161 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::surfaceReader
+
+Description
+    Base class for surface readers
+
+SourceFiles
+    surfaceReader.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef surfaceReader_H
+#define surfaceReader_H
+
+#include "typeInfo.H"
+#include "autoPtr.H"
+#include "MeshedSurfaces.H"
+#include "runTimeSelectionTables.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                        Class surfaceReader Declaration
+\*---------------------------------------------------------------------------*/
+
+class surfaceReader
+{
+protected:
+
+    //- File name
+    fileName fileName_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("surfaceReader");
+
+    // Declare run-time constructor selection table
+
+        declareRunTimeSelectionTable
+        (
+            autoPtr,
+            surfaceReader,
+            fileName,
+            (
+                const fileName& fName
+            ),
+            (fName)
+        );
+
+
+    // Selectors
+
+        //- Return a reference to the selected surfaceReader
+        static autoPtr<surfaceReader> New
+        (
+            const word& readType,
+            const fileName& fName
+        );
+
+
+    // Constructors
+
+        //- Construct from fileName
+        surfaceReader(const fileName& fName);
+
+
+    //- Destructor
+    virtual ~surfaceReader();
+
+
+    // Member Functions
+
+        //- Return a reference to the surface geometry
+        virtual const meshedSurface& geometry() = 0;
+
+        //- Return a list of the available times
+        virtual instantList times() const = 0;
+
+        //- Return a list of the available fields at a given time
+        virtual wordList fieldNames(const label timeIndex) const = 0;
+
+        //- Return a scalar field at a given time
+        virtual tmp<Field<scalar> > field
+        (
+            const label timeIndex,
+            const label fieldIndex,
+            const scalar& refValue = pTraits<scalar>::zero
+        ) const = 0;
+
+        //- Return a vector field at a given time
+        virtual tmp<Field<vector> > field
+        (
+            const label timeIndex,
+            const label fieldIndex,
+            const vector& refValue = pTraits<vector>::zero
+        ) const = 0;
+
+        //- Return a sphericalTensor field at a given time
+        virtual tmp<Field<sphericalTensor> > field
+        (
+            const label timeIndex,
+            const label fieldIndex,
+            const sphericalTensor& reValue = pTraits<sphericalTensor>::zero
+        ) const = 0;
+
+        //- Return a symmTensor field at a given time
+        virtual tmp<Field<symmTensor> > field
+        (
+            const label timeIndex,
+            const label fieldIndex,
+            const symmTensor& reValue = pTraits<symmTensor>::zero
+        ) const = 0;
+
+        //- Return a tensor field at a given time
+        virtual tmp<Field<tensor> > field
+        (
+            const label timeIndex,
+            const label fieldIndex,
+            const tensor& reValue = pTraits<tensor>::zero
+        ) const = 0;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/sampling/sampledSurface/readers/surfaceReaderNew.C b/src/sampling/sampledSurface/readers/surfaceReaderNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..415179e2735db4020733ffa34c210ec051c30ecb
--- /dev/null
+++ b/src/sampling/sampledSurface/readers/surfaceReaderNew.C
@@ -0,0 +1,52 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015-2016 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "surfaceReader.H"
+
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
+Foam::autoPtr<Foam::surfaceReader> Foam::surfaceReader::New
+(
+    const word& readerType,
+    const fileName& fName
+)
+{
+    fileNameConstructorTable::iterator cstrIter =
+        fileNameConstructorTablePtr_->find(readerType);
+
+    if (cstrIter == fileNameConstructorTablePtr_->end())
+    {
+        FatalErrorInFunction
+            << "Unknown reader type \"" << readerType << "\"\n\n"
+            << "Valid reader types: "
+            << fileNameConstructorTablePtr_->sortedToc() << nl
+            << exit(FatalError);
+    }
+
+    return autoPtr<surfaceReader>(cstrIter()(fName));
+}
+
+
+// ************************************************************************* //
diff --git a/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriter.C b/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriter.C
index e8c5589d7d4834cacc23d8399a0f49fe66d49c91..ac2457010d9d69cdb5e9a68dcdc5f7bd6b40a746 100644
--- a/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriter.C
+++ b/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriter.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -42,14 +42,15 @@ Foam::ensightSurfaceWriter::ensightSurfaceWriter()
 :
     surfaceWriter(),
     writeFormat_(IOstream::ASCII),
-    collateTimes_(false)
+    collateTimes_(true)
 {}
 
 
 Foam::ensightSurfaceWriter::ensightSurfaceWriter(const dictionary& options)
 :
     surfaceWriter(),
-    writeFormat_(IOstream::ASCII)
+    writeFormat_(IOstream::ASCII),
+    collateTimes_(true)
 {
     // choose ascii or binary format
     if (options.found("format"))
@@ -68,6 +69,17 @@ Foam::ensightSurfaceWriter::~ensightSurfaceWriter()
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
+// Note that ensight does supports geometry in a separate file,
+// but setting this true leaves mesh files in the wrong places
+// (when there are fields).
+//
+// Make this false to let the field writers take back control
+bool Foam::ensightSurfaceWriter::separateGeometry() const
+{
+    return false;
+}
+
+
 Foam::fileName Foam::ensightSurfaceWriter::write
 (
     const fileName& outputDir,
@@ -84,14 +96,13 @@ Foam::fileName Foam::ensightSurfaceWriter::write
         mkDir(outputDir);
     }
 
-    // const scalar timeValue = Foam::name(this->mesh().time().timeValue());
     const scalar timeValue = 0.0;
 
     OFstream osCase(outputDir/surfName + ".case");
     ensightGeoFile osGeom
     (
         outputDir,
-        surfName + ".0000.mesh",
+        surfName + ".00000000.mesh",
         writeFormat_
     );
 
@@ -113,7 +124,7 @@ Foam::fileName Foam::ensightSurfaceWriter::write
         << "filename start number:         0" << nl
         << "filename increment:            1" << nl
         << "time values:" << nl
-        << timeValue << nl
+        << "    " << timeValue << nl
         << nl;
 
     ensightPartFaces ensPart(0, osGeom.name().name(), points, faces, true);
diff --git a/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriter.H b/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriter.H
index 67da74a19390c3dcb55d19d4196c88c8b629c392..9d5ff392b41f92fb7fab3ddc59e9b25a179a3c51 100644
--- a/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriter.H
+++ b/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriter.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2015 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -52,9 +52,10 @@ class ensightSurfaceWriter
 {
     // Private data
 
-        //- Write option (default is IOstream::ASCII
+        //- Write option (default: IOstream::ASCII)
         IOstream::streamFormat writeFormat_;
 
+        //- Collate times (default: ASCII)
         bool collateTimes_;
 
 
@@ -126,10 +127,7 @@ public:
 
         //- True if the surface format supports geometry in a separate file.
         //  False if geometry and field must be in a single file
-        virtual bool separateGeometry() const
-        {
-            return !collateTimes_;
-        }
+        virtual bool separateGeometry() const;
 
 
         //- Write single surface geometry to file.
diff --git a/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriterTemplates.C b/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriterTemplates.C
index b564b5c8e596cda596d07fd293257ca120760d32..41c404deb6e96c53e5ae1f3f3098eb16b0295f41 100644
--- a/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriterTemplates.C
+++ b/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriterTemplates.C
@@ -64,6 +64,7 @@ Foam::fileName Foam::ensightSurfaceWriter::writeUncollated
     // - VAR2/SURF1.0001.VAR2
 
     const fileName baseDir = outputDir/varName;
+    const fileName timeDir = outputDir.name();
 
     if (!isDir(baseDir))
     {
@@ -71,19 +72,19 @@ Foam::fileName Foam::ensightSurfaceWriter::writeUncollated
     }
 
     // const scalar timeValue = Foam::name(this->mesh().time().timeValue());
-    const scalar timeValue = 0.0;
+    const scalar timeValue = readScalar(IStringStream(timeDir)());
 
     OFstream osCase(baseDir/surfName + ".case");
     ensightGeoFile osGeom
     (
         baseDir,
-        surfName + ".0000.mesh",
+        surfName + ".00000000.mesh",
         writeFormat_
     );
     ensightFile osField
     (
         baseDir,
-        surfName + ".0000." + varName,
+        surfName + ".00000000." + varName,
         writeFormat_
     );
 
@@ -97,22 +98,23 @@ Foam::fileName Foam::ensightSurfaceWriter::writeUncollated
         << "type: ensight gold" << nl
         << nl
         << "GEOMETRY" << nl
-        << "model:        1     " << osGeom.name().name() << nl
+        << "model:  1   " << osGeom.name().name() << nl
         << nl
         << "VARIABLE" << nl
         << ensightPTraits<Type>::typeName << " per "
-        << word(isNodeValues ? "node:" : "element:") << setw(10) << 1
-        << "       " << varName
-        << "       " << surfName.c_str() << ".****." << varName << nl
+        << word(isNodeValues ? "node:" : "element:")
+        << setw(3) << 1
+        << setw(15) << varName
+        << "   " << surfName.c_str() << ".********." << varName << nl
         << nl
         << "TIME" << nl
-        << "time set:                      1" << nl
-        << "number of steps:               1" << nl
-        << "filename start number:         0" << nl
-        << "filename increment:            1" << nl
+        << "time set:               1" << nl
+        << "number of steps:        1" << nl
+        << "filename start number:  0" << nl
+        << "filename increment:     1" << nl
         << "time values:" << nl
-        << timeValue << nl
-        << nl;
+        << "    " << timeValue
+        << nl << nl << "# end" << nl;
 
     ensightPartFaces ensPart(0, osGeom.name().name(), points, faces, true);
     osGeom << ensPart;
@@ -145,13 +147,13 @@ Foam::fileName Foam::ensightSurfaceWriter::writeCollated
     // eg, something like this:
     // - SURF1/SURF1.case
     // - SURF1/SURF1.0000.mesh
-    // - SURF1/SURF1.0001.VAR1
-    // - SURF1/SURF1.0001.VAR2
+    // - SURF1/SURF1/data/0000/VAR1
+    // - SURF1/SURF1/data/0000/VAR2
     // and
     // - SURF2/SURF2.case
     // - SURF2/SURF2.0000.mesh
-    // - SURF2/SURF2.0001.VAR1
-    // - SURF2/SURF2.0001.VAR2
+    // - SURF2/SURF2/data/0000/VAR1
+    // - SURF2/SURF2/data/0000/VAR2
 
     const fileName baseDir = outputDir.path()/surfName;
     const fileName timeDir = outputDir.name();
@@ -162,11 +164,10 @@ Foam::fileName Foam::ensightSurfaceWriter::writeCollated
     }
 
     // surfName already validated
-    const fileName meshFile(baseDir/surfName + ".0000.mesh");
+    const fileName meshFile(baseDir/surfName + ".000000.mesh");
     const scalar timeValue = readScalar(IStringStream(timeDir)());
     label timeIndex = 0;
 
-
     // Do case file
     {
         dictionary dict;
@@ -235,9 +236,11 @@ Foam::fileName Foam::ensightSurfaceWriter::writeCollated
             {
                 Info<< "Writing state file to fieldsDict" << endl;
             }
-            OFstream os(baseDir/"fieldsDict");
-            os << dict;
-
+            {
+                OFstream os(baseDir/"fieldsDict");
+                os << "// summary of ensight times/fields" << nl << nl;
+                dict.write(os, false);
+            }
 
             OFstream osCase(baseDir/surfName + ".case");
 
@@ -251,7 +254,7 @@ Foam::fileName Foam::ensightSurfaceWriter::writeCollated
                 << "type: ensight gold" << nl
                 << nl
                 << "GEOMETRY" << nl
-                << "model:        1     " << meshFile.name() << nl
+                << "model:  1   " << meshFile.name() << nl
                 << nl
                 << "VARIABLE" << nl;
 
@@ -269,30 +272,32 @@ Foam::fileName Foam::ensightSurfaceWriter::writeCollated
                 osCase
                     << fieldType << " per "
                     << word(isNodeValues ? "node:" : "element:")
-                    << setw(10) << 1
+                    << setw(3)  << 1
                     << setw(15) << varName
-                    << "       " << surfName.c_str() << ".****." << varName
+                    << "   data/******/" << varName
                     << nl;
             }
             osCase << nl;
 
             osCase
                 << "TIME" << nl
-                << "time set:                      1" << nl
-                << "number of steps:               " << timeIndex+1 << nl
-                << "filename start number:         0" << nl
-                << "filename increment:            1" << nl
+                << "time set:               1" << nl
+                << "number of steps:        " << timeIndex+1 << nl
+                << "filename start number:  0" << nl
+                << "filename increment:     1" << nl
                 << "time values:" << nl;
+
+            label count = 0;
             forAll(times, timeI)
             {
-                osCase << setw(12) << times[timeI] << " ";
+                osCase << ' ' << setw(12) << times[timeI];
 
-                if (timeI != 0 && (timeI % 6) == 0)
+                if (++count % 6 == 0)
                 {
                     osCase << nl;
                 }
             }
-            osCase << nl;
+            osCase << nl << nl << "# end" << nl;
         }
     }
 
@@ -316,15 +321,20 @@ Foam::fileName Foam::ensightSurfaceWriter::writeCollated
     {
         OStringStream os;
         os.stdStream().fill('0');
-        os << setw(4) << timeIndex;
+        os << setw(6) << timeIndex;
         timeString = os.str();
     }
 
+    fileName dataDir = baseDir/"data"/timeString;
+
+    // as per mkdir -p "data/000000"
+    mkDir(dataDir);
+
     // Write field
     ensightFile osField
     (
-        baseDir,
-        surfName + "." + timeString + "." + varName,
+        dataDir,
+        varName,
         writeFormat_
     );
     if (verbose)
@@ -334,6 +344,14 @@ Foam::fileName Foam::ensightSurfaceWriter::writeCollated
     osField.writeKeyword(ensightPTraits<Type>::typeName);
     ensPart.writeField(osField, values, isNodeValues);
 
+    // place a timestamp in the directory for future reference
+    {
+        OFstream timeStamp(dataDir/"time");
+        timeStamp
+            << "#   timestep time" << nl
+            << dataDir.name() << " " << timeValue << nl;
+    }
+
     return baseDir/surfName + ".case";
 }
 
diff --git a/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/0/T b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/0/T
new file mode 100644
index 0000000000000000000000000000000000000000..08d17aa7ad198ac083960a78a4a63d05ae81934b
--- /dev/null
+++ b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/0/T
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    location    "0";
+    object      T;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 0 0 1 0 0 0];
+
+internalField   uniform 300;
+
+boundaryField
+{
+    inlet
+    {
+        type            fixedValue;
+        value           $internalField;
+    }
+
+    outlet
+    {
+        type            inletOutlet;
+        inletValue      $internalField;
+        value           $internalField;
+    }
+
+    frontAndBack
+    {
+        type            empty;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/0/U b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/0/U
new file mode 100644
index 0000000000000000000000000000000000000000..23148ebb93cc3e96529354db4b8208ecad725b2e
--- /dev/null
+++ b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/0/U
@@ -0,0 +1,43 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volVectorField;
+    location    "0";
+    object      U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 -1 0 0 0 0];
+
+internalField   uniform (0 0 0);
+
+boundaryField
+{
+    inlet
+    {
+        type            zeroGradient; // pressureInletVelocity;
+        value           $internalField;
+    }
+
+    outlet
+    {
+        type            pressureInletOutletVelocity;
+        value           $internalField;
+    }
+
+    frontAndBack
+    {
+        type            empty;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/0/V b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/0/V
new file mode 100644
index 0000000000000000000000000000000000000000..c385e23f0894912475288a9d8eacb1107049fd76
--- /dev/null
+++ b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/0/V
@@ -0,0 +1,1045 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    location    "0";
+    object      V;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 3 0 0 0 0 0];
+
+internalField   nonuniform List<scalar> 
+1000
+(
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000008e-06
+1.000000000000038e-06
+9.999999999999489e-07
+1.000000000000008e-06
+1.000000000000068e-06
+9.999999999999489e-07
+9.999999999999786e-07
+1.000000000000008e-06
+1.000000000000038e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999489e-07
+1.000000000000097e-06
+1.000000000000008e-06
+9.999999999999786e-07
+9.999999999999489e-07
+1.000000000000068e-06
+1.000000000000008e-06
+9.999999999999489e-07
+9.999999999999786e-07
+1.000000000000068e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000008e-06
+1.000000000000038e-06
+1.000000000000008e-06
+9.999999999999489e-07
+1.000000000000008e-06
+1.000000000000038e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000097e-06
+9.999999999999489e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000068e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999489e-07
+1.000000000000068e-06
+1.000000000000008e-06
+9.999999999999489e-07
+1.000000000000008e-06
+1.000000000000038e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000068e-06
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000008e-06
+1.000000000000068e-06
+9.999999999999489e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000097e-06
+9.999999999999489e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000068e-06
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000008e-06
+1.000000000000038e-06
+1.000000000000008e-06
+9.999999999999489e-07
+1.000000000000008e-06
+1.000000000000038e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000068e-06
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000008e-06
+1.000000000000038e-06
+1.000000000000008e-06
+9.999999999999489e-07
+9.999999999999786e-07
+1.000000000000097e-06
+9.999999999999489e-07
+1.000000000000008e-06
+9.999999999999489e-07
+1.000000000000068e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000068e-06
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000008e-06
+1.000000000000068e-06
+9.999999999999489e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999489e-07
+1.000000000000023e-06
+1.000000000000008e-06
+1.000000000000023e-06
+9.999999999999934e-07
+9.999999999999934e-07
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999489e-07
+1.000000000000052e-06
+9.999999999999637e-07
+1.000000000000008e-06
+9.999999999999934e-07
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000008e-06
+1.000000000000008e-06
+1.000000000000008e-06
+9.999999999999637e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999489e-07
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999934e-07
+9.999999999999934e-07
+1.000000000000023e-06
+1.000000000000008e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999637e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+9.999999999999637e-07
+1.000000000000038e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999489e-07
+1.000000000000053e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999637e-07
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999489e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999934e-07
+9.999999999999637e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999489e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000053e-06
+9.999999999999489e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000038e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999786e-07
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999637e-07
+1.000000000000053e-06
+9.999999999999637e-07
+1.000000000000038e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999637e-07
+1.000000000000008e-06
+1.000000000000001e-06
+9.999999999999858e-07
+1.000000000000015e-06
+9.999999999999934e-07
+1.000000000000001e-06
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000008e-06
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999858e-07
+9.999999999999858e-07
+1.000000000000008e-06
+1.000000000000001e-06
+9.999999999999932e-07
+1.000000000000008e-06
+9.999999999999932e-07
+1.000000000000008e-06
+9.999999999999858e-07
+1.000000000000008e-06
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999858e-07
+1.000000000000008e-06
+1.000000000000008e-06
+9.999999999999932e-07
+1.000000000000008e-06
+9.999999999999932e-07
+9.999999999999932e-07
+1.000000000000015e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999932e-07
+1.000000000000001e-06
+1.000000000000008e-06
+9.999999999999712e-07
+1.000000000000001e-06
+9.999999999999932e-07
+1.000000000000008e-06
+1.000000000000008e-06
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999858e-07
+1.000000000000008e-06
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000008e-06
+1.000000000000008e-06
+9.999999999999858e-07
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000008e-06
+1.000000000000001e-06
+9.999999999999934e-07
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999858e-07
+1.000000000000008e-06
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000008e-06
+9.999999999999932e-07
+1.000000000000008e-06
+1.000000000000001e-06
+9.999999999999932e-07
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000008e-06
+9.999999999999932e-07
+1.000000000000001e-06
+1.000000000000008e-06
+1.000000000000001e-06
+9.999999999999934e-07
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999932e-07
+1.000000000000001e-06
+1.000000000000008e-06
+1.000000000000001e-06
+9.999999999999934e-07
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000008e-06
+9.999999999999932e-07
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000004e-06
+1.000000000000001e-06
+9.999999999999968e-07
+1.000000000000001e-06
+1.000000000000004e-06
+9.999999999999932e-07
+9.999999999999972e-07
+9.99999999999997e-07
+1.000000000000001e-06
+9.999999999999968e-07
+1.000000000000008e-06
+1.000000000000001e-06
+9.999999999999972e-07
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000004e-06
+1.000000000000001e-06
+9.999999999999972e-07
+9.999999999999896e-07
+9.999999999999972e-07
+1.000000000000008e-06
+1.000000000000001e-06
+9.999999999999968e-07
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000008e-06
+9.999999999999932e-07
+1.000000000000001e-06
+1.000000000000004e-06
+9.99999999999997e-07
+1.000000000000001e-06
+9.999999999999934e-07
+9.99999999999997e-07
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000004e-06
+9.999999999999972e-07
+1.000000000000004e-06
+9.999999999999972e-07
+1.000000000000004e-06
+9.999999999999972e-07
+1.000000000000004e-06
+9.99999999999997e-07
+9.999999999999898e-07
+1.000000000000001e-06
+1.000000000000004e-06
+9.99999999999997e-07
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000002e-06
+9.999999999999989e-07
+9.999999999999989e-07
+9.999999999999968e-07
+9.999999999999989e-07
+1.000000000000004e-06
+9.999999999999989e-07
+1.000000000000002e-06
+9.999999999999989e-07
+9.999999999999934e-07
+1.000000000000004e-06
+9.999999999999989e-07
+1.000000000000004e-06
+9.99999999999997e-07
+1.000000000000001e-06
+9.999999999999968e-07
+9.999999999999989e-07
+1.000000000000002e-06
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999934e-07
+1.000000000000002e-06
+9.999999999999989e-07
+1.000000000000001e-06
+1.000000000000001e-06
+9.99999999999998e-07
+1.000000000000002e-06
+1.000000000000001e-06
+9.999999999999961e-07
+1.000000000000002e-06
+1.000000000000001e-06
+9.999999999999989e-07
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999972e-07
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999997e-07
+9.999999999999983e-07
+1.000000000000001e-06
+1e-06
+9.999999999999989e-07
+1.000000000000001e-06
+9.999999999999993e-07
+1.000000000000001e-06
+9.999999999999997e-07
+9.999999999999997e-07
+9.999999999999997e-07
+9.999999999999997e-07
+9.999999999999997e-07
+9.999999999999997e-07
+9.999999999999997e-07
+9.999999999999997e-07
+1.000000000000001e-06
+9.999999999999991e-07
+1.000000000000001e-06
+9.999999999999989e-07
+9.999999999999997e-07
+1.000000000000001e-06
+9.999999999999983e-07
+9.999999999999997e-07
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999972e-07
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999989e-07
+1.000000000000001e-06
+1.000000000000002e-06
+9.999999999999964e-07
+1.000000000000001e-06
+1.000000000000002e-06
+9.99999999999998e-07
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999989e-07
+1.000000000000002e-06
+9.999999999999934e-07
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000002e-06
+9.999999999999989e-07
+9.999999999999968e-07
+1.000000000000001e-06
+9.999999999999972e-07
+1.000000000000004e-06
+9.999999999999989e-07
+1.000000000000004e-06
+9.999999999999932e-07
+9.999999999999989e-07
+1.000000000000002e-06
+9.999999999999989e-07
+1.000000000000004e-06
+9.999999999999989e-07
+9.999999999999972e-07
+9.999999999999989e-07
+9.999999999999989e-07
+1.000000000000002e-06
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999972e-07
+1.000000000000004e-06
+1.000000000000001e-06
+9.999999999999896e-07
+9.999999999999972e-07
+1.000000000000004e-06
+9.99999999999997e-07
+1.000000000000004e-06
+9.99999999999997e-07
+1.000000000000004e-06
+9.99999999999997e-07
+1.000000000000004e-06
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999968e-07
+9.999999999999934e-07
+1.000000000000001e-06
+9.999999999999972e-07
+1.000000000000004e-06
+1.000000000000001e-06
+9.999999999999934e-07
+1.000000000000008e-06
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999972e-07
+1.000000000000001e-06
+1.000000000000008e-06
+9.99999999999997e-07
+9.999999999999896e-07
+9.99999999999997e-07
+1.000000000000001e-06
+1.000000000000004e-06
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999972e-07
+1.000000000000001e-06
+1.000000000000008e-06
+9.99999999999997e-07
+1.000000000000001e-06
+9.999999999999968e-07
+9.999999999999972e-07
+9.999999999999934e-07
+1.000000000000004e-06
+1.000000000000001e-06
+9.99999999999997e-07
+1.000000000000001e-06
+1.000000000000004e-06
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999934e-07
+1.000000000000008e-06
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999932e-07
+1.000000000000001e-06
+1.000000000000008e-06
+1.000000000000001e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999932e-07
+1.000000000000008e-06
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999932e-07
+1.000000000000001e-06
+1.000000000000008e-06
+1.000000000000001e-06
+9.999999999999934e-07
+1.000000000000008e-06
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999932e-07
+1.000000000000001e-06
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000008e-06
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000008e-06
+9.999999999999858e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999932e-07
+1.000000000000001e-06
+1.000000000000008e-06
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999858e-07
+1.000000000000008e-06
+1.000000000000008e-06
+1.000000000000001e-06
+1.000000000000001e-06
+9.999999999999932e-07
+1.000000000000008e-06
+1.000000000000008e-06
+9.999999999999858e-07
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000008e-06
+1.000000000000008e-06
+9.999999999999932e-07
+1.000000000000001e-06
+9.999999999999712e-07
+1.000000000000008e-06
+1.000000000000001e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999932e-07
+1.000000000000015e-06
+9.999999999999932e-07
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999932e-07
+1.000000000000008e-06
+1.000000000000008e-06
+9.999999999999858e-07
+1.000000000000008e-06
+9.999999999999932e-07
+1.000000000000008e-06
+1.000000000000008e-06
+9.999999999999858e-07
+1.000000000000008e-06
+9.999999999999932e-07
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000001e-06
+1.000000000000008e-06
+9.999999999999858e-07
+9.999999999999858e-07
+1.000000000000001e-06
+1.000000000000001e-06
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000008e-06
+1.000000000000001e-06
+9.999999999999934e-07
+1.000000000000015e-06
+9.999999999999858e-07
+1.000000000000001e-06
+1.000000000000008e-06
+9.999999999999637e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000038e-06
+9.999999999999637e-07
+1.000000000000052e-06
+9.999999999999637e-07
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999934e-07
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000038e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999489e-07
+1.000000000000052e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999489e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999637e-07
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999489e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999934e-07
+9.999999999999637e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000052e-06
+9.999999999999489e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000038e-06
+9.999999999999637e-07
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999637e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000008e-06
+1.000000000000023e-06
+9.999999999999934e-07
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999934e-07
+9.999999999999489e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999637e-07
+1.000000000000008e-06
+1.000000000000008e-06
+1.000000000000008e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+9.999999999999934e-07
+1.000000000000008e-06
+9.999999999999637e-07
+1.000000000000052e-06
+9.999999999999489e-07
+1.000000000000008e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999637e-07
+1.000000000000023e-06
+9.999999999999934e-07
+1.000000000000023e-06
+9.999999999999786e-07
+9.999999999999934e-07
+9.999999999999934e-07
+1.000000000000023e-06
+1.000000000000008e-06
+1.000000000000023e-06
+9.999999999999489e-07
+1.000000000000023e-06
+9.999999999999786e-07
+1.000000000000038e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999489e-07
+1.000000000000068e-06
+1.000000000000008e-06
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000068e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000068e-06
+9.999999999999489e-07
+1.000000000000008e-06
+9.999999999999489e-07
+1.000000000000097e-06
+9.999999999999786e-07
+9.999999999999489e-07
+1.000000000000008e-06
+1.000000000000038e-06
+1.000000000000008e-06
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000068e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000038e-06
+1.000000000000008e-06
+9.999999999999489e-07
+1.000000000000008e-06
+1.000000000000038e-06
+1.000000000000008e-06
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000068e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999489e-07
+1.000000000000097e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999489e-07
+1.000000000000068e-06
+1.000000000000008e-06
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000068e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000038e-06
+1.000000000000008e-06
+9.999999999999489e-07
+1.000000000000008e-06
+1.000000000000068e-06
+9.999999999999489e-07
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000068e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999489e-07
+1.000000000000097e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000038e-06
+1.000000000000008e-06
+9.999999999999489e-07
+1.000000000000008e-06
+1.000000000000038e-06
+1.000000000000008e-06
+9.999999999999786e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000068e-06
+9.999999999999786e-07
+9.999999999999489e-07
+1.000000000000008e-06
+1.000000000000068e-06
+9.999999999999489e-07
+9.999999999999786e-07
+1.000000000000008e-06
+1.000000000000097e-06
+9.999999999999489e-07
+9.999999999999786e-07
+9.999999999999786e-07
+1.000000000000038e-06
+1.000000000000008e-06
+9.999999999999786e-07
+9.999999999999489e-07
+1.000000000000068e-06
+1.000000000000008e-06
+9.999999999999489e-07
+1.000000000000038e-06
+1.000000000000008e-06
+9.999999999999786e-07
+1.000000000000008e-06
+)
+;
+
+boundaryField
+{
+    inlet
+    {
+        type            calculated;
+        value           uniform 0.0004;
+    }
+    outlet
+    {
+        type            calculated;
+        value           uniform 0.0004;
+    }
+    frontAndBack
+    {
+        type            empty;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/0/p b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/0/p
new file mode 100755
index 0000000000000000000000000000000000000000..e9744947ab052cd07005d37963a906643c9b583e
--- /dev/null
+++ b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/0/p
@@ -0,0 +1,54 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    location    "0";
+    object      p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [1 -1 -2 0 0 0 0];
+
+internalField   uniform 101325;
+
+boundaryField
+{
+    inlet
+    {
+        type            uniformFixedValue; // oscillatingFixedValue;
+        uniformValue    sine;
+        uniformValueCoeffs
+        {
+            amplitude       constant 1;
+            frequency       constant 3000;
+            scale           constant 50;
+            level           constant 101325;
+        }
+        value           $internalField;
+    }
+
+    outlet
+    {
+        type            waveTransmissive;
+        gamma           1.4;
+        fieldInf        101325;
+        lInf            2.25;
+        value           $internalField;
+    }
+
+    frontAndBack
+    {
+        type            empty;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/Allclean b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/Allclean
new file mode 100755
index 0000000000000000000000000000000000000000..ad2d4ecb971ab4f2eaecd1f75de566f6b6fd0709
--- /dev/null
+++ b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/Allclean
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # Run from this directory
+
+# Source tutorial clean functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+cleanCase
+
+
+#------------------------------------------------------------------------------
diff --git a/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/Allrun b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/Allrun
new file mode 100755
index 0000000000000000000000000000000000000000..31f6bc34d0fbfcee28a030447f424b33f27ff6e4
--- /dev/null
+++ b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/Allrun
@@ -0,0 +1,8 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # Run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+runApplication blockMesh
+runApplication $(getApplication)
diff --git a/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/constant/thermophysicalProperties b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/constant/thermophysicalProperties
new file mode 100644
index 0000000000000000000000000000000000000000..4651aa353f2fcab2782ab9c0ce4b792fdb41f886
--- /dev/null
+++ b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/constant/thermophysicalProperties
@@ -0,0 +1,49 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  2.3.1                                 |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      thermophysicalProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+thermoType
+{
+    type            hePsiThermo;
+    mixture         pureMixture;
+    transport       sutherland;
+    thermo          hConst;
+    equationOfState perfectGas;
+    specie          specie;
+    energy          sensibleEnthalpy;
+}
+
+mixture
+{
+    specie
+    {
+        nMoles      1;
+        molWeight   28.9;
+    }
+    thermodynamics
+    {
+        Cp          1007;
+        Hf          0;
+    }
+    transport
+    {
+        As          1.4792e-06;
+        Ts          116;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/constant/turbulenceProperties b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/constant/turbulenceProperties
new file mode 100644
index 0000000000000000000000000000000000000000..5eec04267266e7fd15e7701a875d683d5e658cd9
--- /dev/null
+++ b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/constant/turbulenceProperties
@@ -0,0 +1,21 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType  laminar;
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/blockMeshDict b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/blockMeshDict
new file mode 100644
index 0000000000000000000000000000000000000000..55efa8b2c4600904e08464283cd1d34338dfa99c
--- /dev/null
+++ b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/blockMeshDict
@@ -0,0 +1,78 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+    (-1.25 -0.01 -0.01)
+    (1.25 -0.01 -0.01)
+    (1.25 0.01 -0.01)
+    (-1.25 0.01 -0.01)
+    (-1.25 -0.01 0.01)
+    (1.25 -0.01 0.01)
+    (1.25 0.01 0.01)
+    (-1.25 0.01 0.01)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (1000 1 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+    inlet
+    {
+        type patch;
+        faces
+        (
+            (0 4 7 3)
+        );
+    }
+
+
+    outlet
+    {
+        type patch;
+        faces
+        (
+            (1 2 6 5)
+        );
+    }
+
+    frontAndBack
+    {
+        type empty;
+        faces
+        (
+            (0 1 5 4)
+            (3 7 6 2)
+            (0 3 2 1)
+            (5 6 7 4)
+        );
+    }
+);
+
+mergePatchPairs
+(
+);
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/controlDict b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/controlDict
new file mode 100644
index 0000000000000000000000000000000000000000..8c02323f69a3675272ec3cabdcd56bec755956ca
--- /dev/null
+++ b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/controlDict
@@ -0,0 +1,82 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application     rhoPimpleFoam;
+
+startFrom       startTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         0.02;
+
+deltaT          2e-6;
+
+writeControl    runTime;
+
+writeInterval   0.0002;
+
+purgeWrite      0;
+
+writeFormat     ascii; // binary;
+
+writePrecision  16;
+
+writeCompression off;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable true;
+
+adjustTimeStep  no;
+
+maxCo           0.3;
+
+maxDeltaT       1;
+
+
+functions
+{
+    fieldAverage
+    {
+        type            fieldAverage;
+        functionObjectLibs ("libfieldFunctionObjects.so");
+        outputControl   outputTime;
+        fields
+        (
+            U
+            {
+                mean        on;
+                prime2Mean  off;
+                base        time;
+            }
+
+            p
+            {
+                mean        on;
+                prime2Mean  off;
+                base        time;
+            }
+
+        );
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/fvOptions b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/fvOptions
new file mode 100644
index 0000000000000000000000000000000000000000..011a5143c636fdb47c0b7b3e3f99fc68de9876a5
--- /dev/null
+++ b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/fvOptions
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvOptions;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+acousticDampingSource
+{
+    type            acousticDampingSource;
+    active          yes;
+
+    acousticDampingSourceCoeffs
+    {
+        timeStart        0.004;
+        duration         1000.0;
+        selectionMode    all;
+        centre           (-1.25 0 0);
+        radius1          1.2;
+        radius2          1.65;
+        frequency        3000;
+        URef             UMean;
+    }
+}
+
+
+//************************************************************************* //
diff --git a/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/fvSchemes b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/fvSchemes
new file mode 100644
index 0000000000000000000000000000000000000000..b25a89c80ba8a414c18f0f5aa3f21a1d88e2f4f1
--- /dev/null
+++ b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/fvSchemes
@@ -0,0 +1,58 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         backward;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+}
+
+divSchemes
+{
+    default         none;
+    div(phi,U)      Gauss linearUpwind grad(U);
+    div(phi,K)      Gauss linear;
+    div(phi,h)      Gauss limitedLinear 1;
+    div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear orthogonal;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         no;
+}
+
+wallDist
+{
+    method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/fvSolution b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/fvSolution
new file mode 100644
index 0000000000000000000000000000000000000000..6240c2447886aea9c7eaa3225bf7ce5e0a28d197
--- /dev/null
+++ b/tutorials/compressible/rhoPimpleFoam/laminar/sineWaveDamping/system/fvSolution
@@ -0,0 +1,71 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    p
+    {
+        solver          PCG;
+        preconditioner  DIC;
+        tolerance       1e-08;
+        relTol          0.01;
+    }
+
+    pFinal
+    {
+        $p;
+        relTol          0;
+    }
+
+    "rho.*"
+    {
+        $p;
+        tolerance       1e-05;
+        relTol          0;
+    }
+
+    "(U|h)"
+    {
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-08;
+        relTol          0.01;
+    }
+
+    "(U|h)Final"
+    {
+        $U;
+        relTol          0;
+    }
+}
+
+PIMPLE
+{
+    momentumPredictor yes;
+    nOuterCorrectors  7;
+    nCorrectors       1;
+    rhoMax            1.5;
+}
+
+
+
+
+
+
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/0/U b/tutorials/incompressible/icoFoam/cavityMappingTest/0/U
new file mode 100644
index 0000000000000000000000000000000000000000..d7c2b91165036e340fb792eee998e00d2277a39e
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/0/U
@@ -0,0 +1,41 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volVectorField;
+    object      U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 -1 0 0 0 0];
+
+internalField   uniform (0 0 0);
+
+boundaryField
+{
+    movingWall
+    {
+        type            fixedValue;
+        value           uniform (1 0 0);
+    }
+
+    fixedWalls
+    {
+        type            fixedValue;
+        value           uniform (0 0 0);
+    }
+
+    frontAndBack
+    {
+        type            empty;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/0/p b/tutorials/incompressible/icoFoam/cavityMappingTest/0/p
new file mode 100644
index 0000000000000000000000000000000000000000..0976329cedb48dfa5dff2d203e19418e7e757993
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/0/p
@@ -0,0 +1,39 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 2 -2 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    movingWall
+    {
+        type            zeroGradient;
+    }
+
+    fixedWalls
+    {
+        type            zeroGradient;
+    }
+
+    frontAndBack
+    {
+        type            empty;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/Allclean b/tutorials/incompressible/icoFoam/cavityMappingTest/Allclean
new file mode 100755
index 0000000000000000000000000000000000000000..0280fc46544361e40d3891c2fcf9afbf231c2fcb
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/Allclean
@@ -0,0 +1,11 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+cleanCase
+
+rm -rf constant/coarseMesh
+
+
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/Allrun-parallel b/tutorials/incompressible/icoFoam/cavityMappingTest/Allrun-parallel
new file mode 100755
index 0000000000000000000000000000000000000000..bd03d75d47d7c35b15bb7aa63dd63783322a4784
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/Allrun-parallel
@@ -0,0 +1,22 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+runApplication -s coarseMesh blockMesh -dict system/blockMeshDict.coarse
+
+mkdir constant/coarseMesh
+mv constant/polyMesh constant/coarseMesh
+
+runApplication -s fine blockMesh -dict system/blockMeshDict.fine
+
+runApplication -s fine decomposePar
+
+runApplication -s coarseMesh decomposePar -region coarseMesh
+
+runParallel $(getApplication)
+
+#runApplication -s fine reconstructPar
+#
+#runApplication -s coarseMesh reconstructPar -region coarseMesh
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/Allrun-serial b/tutorials/incompressible/icoFoam/cavityMappingTest/Allrun-serial
new file mode 100755
index 0000000000000000000000000000000000000000..166a1200d591c5dfdc4a1d24c2b55bf4ab0b33e0
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/Allrun-serial
@@ -0,0 +1,15 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+runApplication -s coarseMesh blockMesh -dict system/blockMeshDict.coarse
+
+mkdir constant/coarseMesh
+mv constant/polyMesh constant/coarseMesh
+
+runApplication -s fine blockMesh -dict system/blockMeshDict.fine
+
+runApplication $(getApplication)
+
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/constant/transportProperties b/tutorials/incompressible/icoFoam/cavityMappingTest/constant/transportProperties
new file mode 100644
index 0000000000000000000000000000000000000000..2509c1167036ff6be8aae5ab268ac01b2f71f90a
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/constant/transportProperties
@@ -0,0 +1,21 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+nu              [0 2 -1 0 0 0 0] 0.01;
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/system/blockMeshDict.coarse b/tutorials/incompressible/icoFoam/cavityMappingTest/system/blockMeshDict.coarse
new file mode 100644
index 0000000000000000000000000000000000000000..3118c894d875f5cf3287d1714402b6bd2cd2f48f
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/system/blockMeshDict.coarse
@@ -0,0 +1,75 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 0.1;
+
+vertices
+(
+    (0 0 0)
+    (1 0 0)
+    (1 1 0)
+    (0 1 0)
+    (0 0 0.1)
+    (1 0 0.1)
+    (1 1 0.1)
+    (0 1 0.1)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (10 10 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+    movingWall
+    {
+        type wall;
+        faces
+        (
+            (3 7 6 2)
+        );
+    }
+    fixedWalls
+    {
+        type wall;
+        faces
+        (
+            (0 4 7 3)
+            (2 6 5 1)
+            (1 5 4 0)
+        );
+    }
+    frontAndBack
+    {
+        type empty;
+        faces
+        (
+            (0 3 2 1)
+            (4 5 6 7)
+        );
+    }
+);
+
+mergePatchPairs
+(
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/system/blockMeshDict.fine b/tutorials/incompressible/icoFoam/cavityMappingTest/system/blockMeshDict.fine
new file mode 100644
index 0000000000000000000000000000000000000000..ff18fe91723135de7fa3e1ba09eba593d88f9d53
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/system/blockMeshDict.fine
@@ -0,0 +1,75 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 0.1;
+
+vertices
+(
+    (0 0 0)
+    (1 0 0)
+    (1 1 0)
+    (0 1 0)
+    (0 0 0.1)
+    (1 0 0.1)
+    (1 1 0.1)
+    (0 1 0.1)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (40 40 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+    movingWall
+    {
+        type wall;
+        faces
+        (
+            (3 7 6 2)
+        );
+    }
+    fixedWalls
+    {
+        type wall;
+        faces
+        (
+            (0 4 7 3)
+            (2 6 5 1)
+            (1 5 4 0)
+        );
+    }
+    frontAndBack
+    {
+        type empty;
+        faces
+        (
+            (0 3 2 1)
+            (4 5 6 7)
+        );
+    }
+);
+
+mergePatchPairs
+(
+);
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/system/coarseMesh/decomposeParDict b/tutorials/incompressible/icoFoam/cavityMappingTest/system/coarseMesh/decomposeParDict
new file mode 100644
index 0000000000000000000000000000000000000000..cf5823a268b17fd8933f76576d5cef47162faec6
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/system/coarseMesh/decomposeParDict
@@ -0,0 +1,23 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    note        "mesh decomposition control dictionary";
+    object      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains  4;
+
+method          scotch;
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/system/coarseMesh/fvSchemes b/tutorials/incompressible/icoFoam/cavityMappingTest/system/coarseMesh/fvSchemes
new file mode 100644
index 0000000000000000000000000000000000000000..ed9c4fbcc411499caa627ed412a47671ed3425c6
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/system/coarseMesh/fvSchemes
@@ -0,0 +1,43 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+}
+
+gradSchemes
+{
+}
+
+divSchemes
+{
+}
+
+laplacianSchemes
+{
+}
+
+interpolationSchemes
+{
+}
+
+snGradSchemes
+{
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/system/coarseMesh/fvSolution b/tutorials/incompressible/icoFoam/cavityMappingTest/system/coarseMesh/fvSolution
new file mode 100644
index 0000000000000000000000000000000000000000..cb6c43877e550400f031a94d663b2cfc0deb94e8
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/system/coarseMesh/fvSolution
@@ -0,0 +1,19 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/system/controlDict b/tutorials/incompressible/icoFoam/cavityMappingTest/system/controlDict
new file mode 100644
index 0000000000000000000000000000000000000000..ba55911fb4f33869e27e2a81f4f97b566721a90b
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/system/controlDict
@@ -0,0 +1,66 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application     icoFoam;
+
+startFrom       startTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         0.5;
+
+deltaT          0.005;
+
+writeControl    timeStep;
+
+writeInterval   20;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  6;
+
+writeCompression off;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable true;
+
+functions
+{
+    meshInterp1
+    {
+        type            mapFieldsFO;
+        functionObjectLibs ("libutilityFunctionObjects.so");
+        outputControl   timeStep;
+        outputInterval  1;
+
+        mapRegion       coarseMesh;
+        mapMethod       cellVolumeWeight;
+        consistent      yes;
+
+        fields          (U); // ("U.*" "p.*");
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/system/decomposeParDict b/tutorials/incompressible/icoFoam/cavityMappingTest/system/decomposeParDict
new file mode 100644
index 0000000000000000000000000000000000000000..cf5823a268b17fd8933f76576d5cef47162faec6
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/system/decomposeParDict
@@ -0,0 +1,23 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    note        "mesh decomposition control dictionary";
+    object      decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains  4;
+
+method          scotch;
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/system/fvSchemes b/tutorials/incompressible/icoFoam/cavityMappingTest/system/fvSchemes
new file mode 100644
index 0000000000000000000000000000000000000000..b43ea748acac4a463d3b4345302831e83227cce6
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/system/fvSchemes
@@ -0,0 +1,51 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         Euler;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+    grad(p)         Gauss linear;
+}
+
+divSchemes
+{
+    default         none;
+    div(phi,U)      Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear orthogonal;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         orthogonal;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/incompressible/icoFoam/cavityMappingTest/system/fvSolution b/tutorials/incompressible/icoFoam/cavityMappingTest/system/fvSolution
new file mode 100644
index 0000000000000000000000000000000000000000..fb6e8e4622bd61357b957200d65625fc51c67b5f
--- /dev/null
+++ b/tutorials/incompressible/icoFoam/cavityMappingTest/system/fvSolution
@@ -0,0 +1,52 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    p
+    {
+        solver          PCG;
+        preconditioner  DIC;
+        tolerance       1e-06;
+        relTol          0.05;
+    }
+
+    pFinal
+    {
+        $p;
+        relTol          0;
+    }
+
+    U
+    {
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-05;
+        relTol          0;
+    }
+}
+
+PISO
+{
+    nCorrectors     2;
+    nNonOrthogonalCorrectors 0;
+    pRefCell        0;
+    pRefValue       0;
+}
+
+
+// ************************************************************************* //
diff --git a/wmake/wmakePrintBuild b/wmake/wmakePrintBuild
index c23e63d33e4b578f6650ef33b24539bf803076a1..81195a6bac21ee32d28c6c7cbaab9abc1094b443 100755
--- a/wmake/wmakePrintBuild
+++ b/wmake/wmakePrintBuild
@@ -3,8 +3,8 @@
 # =========                 |
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
-#   \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
-#    \\/     M anipulation  |
+#   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
+#    \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 #-------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM.
@@ -72,7 +72,6 @@ do
         ;;
     -c | -check)
         checkOnly=true
-        shift
         ;;
     -major)
         echo ${WM_PROJECT_VERSION:-unknown}
@@ -80,27 +79,26 @@ do
         ;;
     -u | -update)
         update=true
-        shift
         ;;
     -pkg | -package)
         [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
         # Mark empty as 'none', disallow '!' in string
         package=$(echo "${2:-none}" | sed -e 's/!//g')
-        shift 2
+        shift
         ;;
     -short)
         shortOpt=true
-        shift
         ;;
     -v | -version)
         [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
         version="$2"
-        shift 2
+        shift
         ;;
     *)
-        usage "unknown option/argument: '$*'"
+        usage "unknown option/argument: '$1'"
         ;;
     esac
+    shift
 done
 
 #------------------------------------------------------------------------------
@@ -146,12 +144,12 @@ then
     # Specified a version - no error possible
     rc=0
 else
-    # Get the head SHA1 when building under git
-    # if there are multiple values (eg, HEAD, origin/HEAD, ...)
+    # Get the head SHA1 (first 12 chars) when building under git.
+    # If there are multiple values (eg, HEAD, origin/HEAD, ...)
     # only take the first one, which is 'HEAD'
     version=$(
-        cd $WM_PROJECT_DIR 2>/dev/null && \
-        git show-ref --hash=12 --head HEAD 2>/dev/null | head -1
+        git --git-dir=$WM_PROJECT_DIR/.git show-ref --head HEAD 2>/dev/null |\
+        sed -ne '1s@^\(.\{12\}\).*$@\1@p'
     )
 
     if [ -n "$version" ]
@@ -205,10 +203,11 @@ then
         else
             echo "version changed from previous build" 1>&2
         fi
+        exit $rc
     else
         echo "no git description found" 1>&2
+        exit 0
     fi
-    exit $rc
 fi