diff --git a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C
new file mode 100644
index 0000000000..c32c4ec21d
--- /dev/null
+++ b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C
@@ -0,0 +1,150 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 .
+
+\*---------------------------------------------------------------------------*/
+
+#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),
+ pRef_(dict.lookupOrDefault("pRef", 0)),
+ nSamples_(dict.lookupOrDefault("N", 65536)),
+ fLower_(dict.lookupOrDefault("fl", 25)),
+ fUpper_(dict.lookupOrDefault("fu", 10000)),
+ startTime_(dict.lookupOrDefault("startTime", 0)),
+ windowModelPtr_(windowModel::New(dict, nSamples_))
+{
+ // 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 0000000000..f7e739b7d0
--- /dev/null
+++ b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H
@@ -0,0 +1,175 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 .
+
+Class
+ Foam::noiseModel
+
+Description
+ Base class for noise models.
+
+ Data is read from a dictionary, e.g.
+
+ \verbatim
+ pRef 0;
+ N 4096;
+ fl 25;
+ fu 25;
+ startTime 0;
+ \endverbatim
+
+ where
+ \table
+ Property | Description | Required | Default value
+ pRef | Reference pressure | no | 0
+ N | Number of samples in sampling window | no | 65536 (2^16)
+ fl | Lower frequency bounds | no | 25
+ fu | Upper frequency bounds | no | 10000
+ \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 pressure
+ scalar pRef_;
+
+ //- 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 windowModelPtr_;
+
+
+
+ // 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 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 0000000000..3f5fa4f25f
--- /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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "noiseModel.H"
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::autoPtr 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(cstrIter()(dict.subDict(modelType + "Coeffs")));
+}
+
+
+// ************************************************************************* //