diff --git a/src/turbulenceModels/LES/incompressible/Make/files b/src/turbulenceModels/LES/incompressible/Make/files
index 796bbee6a0070d16a9464befb7a318d71a676899..b6c245c866bb81e3c6767c2f6fbde1823bd0c430 100644
--- a/src/turbulenceModels/LES/incompressible/Make/files
+++ b/src/turbulenceModels/LES/incompressible/Make/files
@@ -8,6 +8,9 @@ GenSGSStress/GenSGSStress.C
 
 laminar/laminar.C
 SpalartAllmaras/SpalartAllmaras.C
+SpalartAllmarasDDES/SpalartAllmarasDDES.C
+SpalartAllmarasIDDES/SpalartAllmarasIDDES.C
+SpalartAllmarasIDDES/IDDESDelta/IDDESDelta.C
 
 oneEqEddy/oneEqEddy.C
 dynOneEqEddy/dynOneEqEddy.C
diff --git a/src/turbulenceModels/LES/incompressible/SpalartAllmaras/SpalartAllmaras.C b/src/turbulenceModels/LES/incompressible/SpalartAllmaras/SpalartAllmaras.C
index 6dd450c312948e6a496a5c2c998dfbf13c672a3a..9d5ad49bdd2dda666fe7ad4d9e3f3b4d372fc8ab 100644
--- a/src/turbulenceModels/LES/incompressible/SpalartAllmaras/SpalartAllmaras.C
+++ b/src/turbulenceModels/LES/incompressible/SpalartAllmaras/SpalartAllmaras.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 1991-2008 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 1991-2007 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -42,8 +42,7 @@ namespace LESModels
 defineTypeNameAndDebug(SpalartAllmaras, 0);
 addToRunTimeSelectionTable(LESModel, SpalartAllmaras, dictionary);
 
-
-// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
 
 tmp<volScalarField> SpalartAllmaras::fv1() const
 {
@@ -55,7 +54,6 @@ tmp<volScalarField> SpalartAllmaras::fv1() const
 tmp<volScalarField> SpalartAllmaras::fv2() const
 {
     volScalarField chi = nuTilda_/nu();
-    //return scalar(1) - chi/(scalar(1) + chi*fv1());
     return 1.0/pow3(scalar(1) + chi/Cv2_);
 }
 
@@ -73,18 +71,57 @@ tmp<volScalarField> SpalartAllmaras::fv3() const
 }
 
 
-tmp<volScalarField> SpalartAllmaras::fw(const volScalarField& Stilda) const
+tmp<volScalarField> SpalartAllmaras::calcS(const volTensorField& gradU)
+{
+    return ::sqrt(2.0)*mag(skew(gradU));
+}
+
+
+tmp<volScalarField> SpalartAllmaras::calcSTilda(const volTensorField& gradU)
+{
+    return fv3()*calcS(gradU) + fv2()*nuTilda_/sqr(kappa_*dTilda_);
+}
+
+
+tmp<volScalarField> SpalartAllmaras::r
+(
+    const volScalarField& visc,
+    const volScalarField& S
+) const
 {
-    volScalarField r = min
+    tmp<volScalarField> tr
     (
-        nuTilda_
-       /(
-           max(Stilda, dimensionedScalar("SMALL", Stilda.dimensions(), SMALL))
-          *sqr(kappa_*dTilda_)
-        ),
-        scalar(10.0)
+        new volScalarField
+        (
+            min
+            (
+                visc
+               /(
+                    max
+                    (
+                        S,
+                        dimensionedScalar("SMALL", S.dimensions(), SMALL)
+                    )
+                   *sqr(kappa_*dTilda_)
+                  + dimensionedScalar
+                    (
+                        "ROOTVSMALL",
+                        dimensionSet(0, 2 , -1, 0, 0),
+                        ROOTVSMALL
+                    )
+                ),
+                scalar(10.0)
+            )
+        )
     );
-    r.boundaryField() == 0.0;
+
+    return tr;
+}
+
+
+tmp<volScalarField> SpalartAllmaras::fw(const volScalarField& S) const
+{
+    volScalarField r = this->r(nuTilda_, S);
 
     volScalarField g = r + Cw2_*(pow6(r) - r);
 
@@ -92,17 +129,26 @@ tmp<volScalarField> SpalartAllmaras::fw(const volScalarField& Stilda) const
 }
 
 
+void SpalartAllmaras::dTildaUpdate(const volScalarField&)
+{
+    if (mesh_.changing())
+    {
+        dTilda_ = min(CDES_*delta(), wallDist(mesh_).y());
+    }
+}
+
+
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 SpalartAllmaras::SpalartAllmaras
 (
     const volVectorField& U,
     const surfaceScalarField& phi,
-    transportModel& transport
+    transportModel& transport,
+    const word& modelName
 )
 :
-    LESModel(typeName, U, phi, transport),
-
+    LESModel(modelName, U, phi, transport),
 
     alphaNut_
     (
@@ -113,6 +159,15 @@ SpalartAllmaras::SpalartAllmaras
             1.5
         )
     ),
+    kappa_
+    (
+        dimensioned<scalar>::lookupOrAddToDict
+        (
+            "kappa",
+            *this,
+            0.4187
+        )
+    ),
     Cb1_
     (
         dimensioned<scalar>::lookupOrAddToDict
@@ -167,15 +222,6 @@ SpalartAllmaras::SpalartAllmaras
             0.07
         )
     ),
-    kappa_
-    (
-        dimensioned<scalar>::lookupOrAddToDict
-        (
-            "kappa",
-            *this,
-            0.4187
-        )
-    ),
     Cw1_(Cb1_/sqr(kappa_) + alphaNut_*(1.0 + Cb2_)),
     Cw2_
     (
@@ -223,10 +269,7 @@ SpalartAllmaras::SpalartAllmaras
         ),
         mesh_
     )
-{
-    printCoeffs();
-}
-
+{}
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
@@ -234,13 +277,11 @@ void SpalartAllmaras::correct(const tmp<volTensorField>& gradU)
 {
     LESModel::correct(gradU);
 
-    if (mesh_.changing())
-    {
-        dTilda_ = min(CDES_*delta(), wallDist(mesh_).y());
-    }
+    const volScalarField STilda = calcSTilda(gradU);
 
-    volScalarField Stilda =
-        fv3()*::sqrt(2.0)*mag(skew(gradU)) + fv2()*nuTilda_/sqr(kappa_*dTilda_);
+    const volScalarField S = calcS(gradU);
+
+    dTildaUpdate(S);
 
     solve
     (
@@ -254,8 +295,8 @@ void SpalartAllmaras::correct(const tmp<volTensorField>& gradU)
         )
       - alphaNut_*Cb2_*magSqr(fvc::grad(nuTilda_))
      ==
-        Cb1_*Stilda*nuTilda_
-      - fvm::Sp(Cw1_*fw(Stilda)*nuTilda_/sqr(dTilda_), nuTilda_)
+        Cb1_*STilda*nuTilda_
+      - fvm::Sp(Cw1_*fw(STilda)*nuTilda_/sqr(dTilda_), nuTilda_)
     );
 
     bound(nuTilda_, dimensionedScalar("zero", nuTilda_.dimensions(), 0.0));
@@ -268,7 +309,7 @@ void SpalartAllmaras::correct(const tmp<volTensorField>& gradU)
 
 tmp<volScalarField> SpalartAllmaras::epsilon() const
 {
-    return 2*nuEff()*magSqr(symm(fvc::grad(U())));
+    return 2.0*nuEff()*magSqr(symm(fvc::grad(U())));
 }
 
 
@@ -298,16 +339,16 @@ bool SpalartAllmaras::read()
     if (LESModel::read())
     {
         alphaNut_.readIfPresent(coeffDict());
+        kappa_.readIfPresent(*this);
         Cb1_.readIfPresent(coeffDict());
         Cb2_.readIfPresent(coeffDict());
-        Cw1_ = Cb1_/sqr(kappa_) + alphaNut_*(1.0 + Cb2_);
-        Cw2_.readIfPresent(coeffDict());
-        Cw3_.readIfPresent(coeffDict());
         Cv1_.readIfPresent(coeffDict());
         Cv2_.readIfPresent(coeffDict());
         CDES_.readIfPresent(coeffDict());
         ck_.readIfPresent(coeffDict());
-        kappa_.readIfPresent(*this);
+        Cw1_ = Cb1_/sqr(kappa_) + alphaNut_*(1.0 + Cb2_);
+        Cw2_.readIfPresent(coeffDict());
+        Cw3_.readIfPresent(coeffDict());
 
         return true;
     }
diff --git a/src/turbulenceModels/LES/incompressible/SpalartAllmaras/SpalartAllmaras.H b/src/turbulenceModels/LES/incompressible/SpalartAllmaras/SpalartAllmaras.H
index 523da4611c665213e53fb11d44d8781f07919055..1bcecd018ff52a25ad4a5f87f4becbe072c8ef11 100644
--- a/src/turbulenceModels/LES/incompressible/SpalartAllmaras/SpalartAllmaras.H
+++ b/src/turbulenceModels/LES/incompressible/SpalartAllmaras/SpalartAllmaras.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 1991-2008 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 1991-2007 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -23,10 +23,10 @@ License
     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 
 Class
-    Foam::incompressible::LESModels::SpalartAllmaras
+    Foam::LESmodels::SpalartAllmaras
 
 Description
-    SpalartAllmaras for incompressible flows
+    SpalartAllmaras DES (SA + LES) turbulence model for incompressible flows
 
 SourceFiles
     SpalartAllmaras.C
@@ -49,43 +49,67 @@ namespace LESModels
 {
 
 /*---------------------------------------------------------------------------*\
-                           Class SpalartAllmaras Declaration
+                        Class SpalartAllmaras Declaration
 \*---------------------------------------------------------------------------*/
 
 class SpalartAllmaras
 :
     public LESModel
 {
-    // Private data
+    // Private member functions
 
-        dimensionedScalar alphaNut_;
+        // Disallow default bitwise copy construct and assignment
+        SpalartAllmaras(const SpalartAllmaras&);
+        SpalartAllmaras& operator=(const SpalartAllmaras&);
 
-        dimensionedScalar Cb1_;
-        dimensionedScalar Cb2_;
-        dimensionedScalar Cv1_;
-        dimensionedScalar Cv2_;
-        dimensionedScalar CDES_;
-        dimensionedScalar ck_;
+
+protected:
+
+    // Protected data
+
+        dimensionedScalar alphaNut_;
         dimensionedScalar kappa_;
-        dimensionedScalar Cw1_;
-        dimensionedScalar Cw2_;
-        dimensionedScalar Cw3_;
 
 
-    // Private member functions
+        // Model constants
 
-        tmp<volScalarField> fv1() const;
-        tmp<volScalarField> fv2() const;
-        tmp<volScalarField> fv3() const;
-        tmp<volScalarField> fw(const volScalarField& Stilda) const;
+            dimensionedScalar Cb1_;
+            dimensionedScalar Cb2_;
+            dimensionedScalar Cv1_;
+            dimensionedScalar Cv2_;
+            dimensionedScalar CDES_;
+            dimensionedScalar ck_;
+            dimensionedScalar Cw1_;
+            dimensionedScalar Cw2_;
+            dimensionedScalar Cw3_;
 
-        // Disallow default bitwise copy construct and assignment
-        SpalartAllmaras(const SpalartAllmaras&);
-        SpalartAllmaras& operator=(const SpalartAllmaras&);
 
-        volScalarField nuTilda_;
-        volScalarField dTilda_;
-        volScalarField nuSgs_;
+        // Fields
+
+            volScalarField nuTilda_;
+            volScalarField dTilda_;
+            volScalarField nuSgs_;
+
+
+    // Protected member functions
+
+        // Helper functions
+
+            virtual tmp<volScalarField> fv1() const;
+            virtual tmp<volScalarField> fv2() const;
+            virtual tmp<volScalarField> fv3() const;
+            //-
+            virtual tmp<volScalarField> calcS(const volTensorField& gradU);
+            virtual tmp<volScalarField> calcSTilda(const volTensorField& gradU);
+            virtual tmp<volScalarField> r
+            (
+                const volScalarField& visc,
+                const volScalarField& S
+            ) const;
+            virtual tmp<volScalarField> fw(const volScalarField& S) const;
+
+        //- Length scale calculation
+        virtual void dTildaUpdate(const volScalarField& S);
 
 
 public:
@@ -101,13 +125,14 @@ public:
         (
             const volVectorField& U,
             const surfaceScalarField& phi,
-            transportModel& transport
+            transportModel& transport,
+            const word& modelName = typeName
         );
 
 
     // Destructor
 
-        ~SpalartAllmaras()
+        virtual ~SpalartAllmaras()
         {}
 
 
@@ -145,10 +170,10 @@ public:
         tmp<fvVectorMatrix> divDevBeff(volVectorField& U) const;
 
         //- Correct nuTilda and related properties
-        void correct(const tmp<volTensorField>& gradU);
+        virtual void correct(const tmp<volTensorField>& gradU);
 
         //- Read turbulenceProperties dictionary
-        bool read();
+        virtual bool read();
 };