diff --git a/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.C b/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.C
index a3da083706b977d0484157222897971989c43325..e9b07da6b1ceca51580d4bf8085ad948dbc683f3 100644
--- a/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.C
+++ b/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2009-2009 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2009-2010 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -93,7 +93,8 @@ Foam::ODEChemistryModel<CompType, ThermoType>::~ODEChemistryModel()
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CompType, class ThermoType>
-Foam::scalarField Foam::ODEChemistryModel<CompType, ThermoType>::omega
+Foam::tmp<Foam::scalarField>
+Foam::ODEChemistryModel<CompType, ThermoType>::omega
 (
     const scalarField& c,
     const scalar T,
@@ -103,7 +104,8 @@ Foam::scalarField Foam::ODEChemistryModel<CompType, ThermoType>::omega
     scalar pf, cf, pr, cr;
     label lRef, rRef;
 
-    scalarField om(nEqns(), 0.0);
+    tmp<scalarField> tom(new scalarField(nEqns(), 0.0));
+    scalarField& om = tom();
 
     forAll(reactions_, i)
     {
@@ -116,20 +118,20 @@ Foam::scalarField Foam::ODEChemistryModel<CompType, ThermoType>::omega
 
         forAll(R.lhs(), s)
         {
-            label si = R.lhs()[s].index;
-            scalar sl = R.lhs()[s].stoichCoeff;
+            const label si = R.lhs()[s].index;
+            const scalar sl = R.lhs()[s].stoichCoeff;
             om[si] -= sl*omegai;
         }
 
         forAll(R.rhs(), s)
         {
-            label si = R.rhs()[s].index;
-            scalar sr = R.rhs()[s].stoichCoeff;
+            const label si = R.rhs()[s].index;
+            const scalar sr = R.rhs()[s].stoichCoeff;
             om[si] += sr*omegai;
         }
     }
 
-    return om;
+    return tom;
 }
 
 
@@ -154,8 +156,8 @@ Foam::scalar Foam::ODEChemistryModel<CompType, ThermoType>::omega
         c2[i] = max(0.0, c[i]);
     }
 
-    scalar kf = R.kf(T, p, c2);
-    scalar kr = R.kr(kf, T, p, c2);
+    const scalar kf = R.kf(T, p, c2);
+    const scalar kr = R.kr(kf, T, p, c2);
 
     pf = 1.0;
     pr = 1.0;
@@ -169,26 +171,26 @@ Foam::scalar Foam::ODEChemistryModel<CompType, ThermoType>::omega
     pf = kf;
     for (label s=1; s<Nl; s++)
     {
-        label si = R.lhs()[s].index;
+        const label si = R.lhs()[s].index;
 
         if (c[si] < c[lRef])
         {
-            scalar exp = R.lhs()[slRef].exponent;
+            const scalar exp = R.lhs()[slRef].exponent;
             pf *= pow(max(0.0, c[lRef]), exp);
             lRef = si;
             slRef = s;
         }
         else
         {
-            scalar exp = R.lhs()[s].exponent;
+            const scalar exp = R.lhs()[s].exponent;
             pf *= pow(max(0.0, c[si]), exp);
         }
     }
     cf = max(0.0, c[lRef]);
 
     {
-        scalar exp = R.lhs()[slRef].exponent;
-        if (exp<1.0)
+        const scalar exp = R.lhs()[slRef].exponent;
+        if (exp < 1.0)
         {
             if (cf > SMALL)
             {
@@ -212,25 +214,25 @@ Foam::scalar Foam::ODEChemistryModel<CompType, ThermoType>::omega
     pr = kr;
     for (label s=1; s<Nr; s++)
     {
-        label si = R.rhs()[s].index;
+        const label si = R.rhs()[s].index;
         if (c[si] < c[rRef])
         {
-            scalar exp = R.rhs()[srRef].exponent;
+            const scalar exp = R.rhs()[srRef].exponent;
             pr *= pow(max(0.0, c[rRef]), exp);
             rRef = si;
             srRef = s;
         }
         else
         {
-            scalar exp = R.rhs()[s].exponent;
+            const scalar exp = R.rhs()[s].exponent;
             pr *= pow(max(0.0, c[si]), exp);
         }
     }
     cr = max(0.0, c[rRef]);
 
     {
-        scalar exp = R.rhs()[srRef].exponent;
-        if (exp<1.0)
+        const scalar exp = R.rhs()[srRef].exponent;
+        if (exp < 1.0)
         {
             if (cr>SMALL)
             {
@@ -259,8 +261,8 @@ void Foam::ODEChemistryModel<CompType, ThermoType>::derivatives
     scalarField& dcdt
 ) const
 {
-    scalar T = c[nSpecie_];
-    scalar p = c[nSpecie_ + 1];
+    const scalar T = c[nSpecie_];
+    const scalar p = c[nSpecie_ + 1];
 
     dcdt = omega(c, T, p);
 
@@ -270,16 +272,16 @@ void Foam::ODEChemistryModel<CompType, ThermoType>::derivatives
     scalar cSum = 0.0;
     for (label i=0; i<nSpecie_; i++)
     {
-        scalar W = specieThermo_[i].W();
+        const scalar W = specieThermo_[i].W();
         cSum += c[i];
         rho += W*c[i];
     }
-    scalar mw = rho/cSum;
+    const scalar mw = rho/cSum;
     scalar cp = 0.0;
     for (label i=0; i<nSpecie_; i++)
     {
-        scalar cpi = specieThermo_[i].cp(T);
-        scalar Xi = c[i]/rho;
+        const scalar cpi = specieThermo_[i].cp(T);
+        const scalar Xi = c[i]/rho;
         cp += Xi*cpi;
     }
     cp /= mw;
@@ -287,18 +289,18 @@ void Foam::ODEChemistryModel<CompType, ThermoType>::derivatives
     scalar dT = 0.0;
     for (label i=0; i<nSpecie_; i++)
     {
-        scalar hi = specieThermo_[i].h(T);
+        const scalar hi = specieThermo_[i].h(T);
         dT += hi*dcdt[i];
     }
     dT /= rho*cp;
 
     // limit the time-derivative, this is more stable for the ODE
     // solver when calculating the allowed time step
-    scalar dtMag = min(500.0, mag(dT));
-    dcdt[nSpecie_] = -dT*dtMag/(mag(dT) + 1.0e-10);
+    const scalar dTLimited = min(500.0, mag(dT));
+    dcdt[nSpecie_] = -dT*dTLimited/(mag(dT) + 1.0e-10);
 
     // dp/dt = ...
-    dcdt[nSpecie_+1] = 0.0;
+    dcdt[nSpecie_ + 1] = 0.0;
 }
 
 
@@ -311,11 +313,11 @@ void Foam::ODEChemistryModel<CompType, ThermoType>::jacobian
     scalarSquareMatrix& dfdc
 ) const
 {
-    scalar T = c[nSpecie_];
-    scalar p = c[nSpecie_ + 1];
+    const scalar T = c[nSpecie_];
+    const scalar p = c[nSpecie_ + 1];
 
     scalarField c2(nSpecie_, 0.0);
-    for (label i=0; i<nSpecie_; i++)
+    forAll(c2, i)
     {
         c2[i] = max(c[i], 0.0);
     }
@@ -335,22 +337,22 @@ void Foam::ODEChemistryModel<CompType, ThermoType>::jacobian
     {
         const Reaction<ThermoType>& R = reactions_[ri];
 
-        scalar kf0 = R.kf(T, p, c2);
-        scalar kr0 = R.kr(T, p, c2);
+        const scalar kf0 = R.kf(T, p, c2);
+        const scalar kr0 = R.kr(T, p, c2);
 
         forAll(R.lhs(), j)
         {
-            label sj = R.lhs()[j].index;
+            const label sj = R.lhs()[j].index;
             scalar kf = kf0;
             forAll(R.lhs(), i)
             {
-                label si = R.lhs()[i].index;
-                scalar el = R.lhs()[i].exponent;
+                const label si = R.lhs()[i].index;
+                const scalar el = R.lhs()[i].exponent;
                 if (i == j)
                 {
                     if (el < 1.0)
                     {
-                        if (c2[si]>SMALL)
+                        if (c2[si] > SMALL)
                         {
                             kf *= el*pow(c2[si] + VSMALL, el - 1.0);
                         }
@@ -372,31 +374,31 @@ void Foam::ODEChemistryModel<CompType, ThermoType>::jacobian
 
             forAll(R.lhs(), i)
             {
-                label si = R.lhs()[i].index;
-                scalar sl = R.lhs()[i].stoichCoeff;
+                const label si = R.lhs()[i].index;
+                const scalar sl = R.lhs()[i].stoichCoeff;
                 dfdc[si][sj] -= sl*kf;
             }
             forAll(R.rhs(), i)
             {
-                label si = R.rhs()[i].index;
-                scalar sr = R.rhs()[i].stoichCoeff;
+                const label si = R.rhs()[i].index;
+                const scalar sr = R.rhs()[i].stoichCoeff;
                 dfdc[si][sj] += sr*kf;
             }
         }
 
         forAll(R.rhs(), j)
         {
-            label sj = R.rhs()[j].index;
+            const label sj = R.rhs()[j].index;
             scalar kr = kr0;
             forAll(R.rhs(), i)
             {
-                label si = R.rhs()[i].index;
-                scalar er = R.rhs()[i].exponent;
-                if (i==j)
+                const label si = R.rhs()[i].index;
+                const scalar er = R.rhs()[i].exponent;
+                if (i == j)
                 {
-                    if (er<1.0)
+                    if (er < 1.0)
                     {
-                        if (c2[si]>SMALL)
+                        if (c2[si] > SMALL)
                         {
                             kr *= er*pow(c2[si] + VSMALL, er - 1.0);
                         }
@@ -418,25 +420,25 @@ void Foam::ODEChemistryModel<CompType, ThermoType>::jacobian
 
             forAll(R.lhs(), i)
             {
-                label si = R.lhs()[i].index;
-                scalar sl = R.lhs()[i].stoichCoeff;
+                const label si = R.lhs()[i].index;
+                const scalar sl = R.lhs()[i].stoichCoeff;
                 dfdc[si][sj] += sl*kr;
             }
             forAll(R.rhs(), i)
             {
-                label si = R.rhs()[i].index;
-                scalar sr = R.rhs()[i].stoichCoeff;
+                const label si = R.rhs()[i].index;
+                const scalar sr = R.rhs()[i].stoichCoeff;
                 dfdc[si][sj] -= sr*kr;
             }
         }
     }
 
     // calculate the dcdT elements numerically
-    scalar delta = 1.0e-8;
-    scalarField dcdT0 = omega(c2, T - delta, p);
-    scalarField dcdT1 = omega(c2, T + delta, p);
+    const scalar delta = 1.0e-8;
+    const scalarField dcdT0 = omega(c2, T - delta, p);
+    const scalarField dcdT1 = omega(c2, T + delta, p);
 
-    for (label i=0; i<nEqns(); i++)
+    for (label i = 0; i < nEqns(); i++)
     {
         dfdc[i][nSpecie()] = 0.5*(dcdT1[i] - dcdT0[i])/delta;
     }
@@ -485,7 +487,7 @@ Foam::ODEChemistryModel<CompType, ThermoType>::tc() const
 
     scalarField& tc = ttc();
 
-    label nReaction = reactions_.size();
+    const label nReaction = reactions_.size();
 
     if (this->chemistry_)
     {
@@ -626,34 +628,31 @@ void Foam::ODEChemistryModel<CompType, ThermoType>::calculate()
         this->thermo().rho()
     );
 
-    for (label i=0; i<nSpecie_; i++)
+    if (this->mesh().changing())
     {
-        RR_[i].setSize(rho.size());
+        for (label i=0; i<nSpecie_; i++)
+        {
+            RR_[i].setSize(rho.size());
+            RR_[i] = 0.0;
+        }
     }
 
     if (this->chemistry_)
     {
         forAll(rho, celli)
         {
-            for (label i=0; i<nSpecie_; i++)
-            {
-                RR_[i][celli] = 0.0;
-            }
-
-            scalar rhoi = rho[celli];
-            scalar Ti = this->thermo().T()[celli];
-            scalar pi = this->thermo().p()[celli];
-
-            scalarField c(nSpecie_);
-            scalarField dcdt(nEqns(), 0.0);
+            const scalar rhoi = rho[celli];
+            const scalar Ti = this->thermo().T()[celli];
+            const scalar pi = this->thermo().p()[celli];
 
+            scalarField c(nSpecie_, 0.0);
             for (label i=0; i<nSpecie_; i++)
             {
-                scalar Yi = Y_[i][celli];
+                const scalar Yi = Y_[i][celli];
                 c[i] = rhoi*Yi/specieThermo_[i].W();
             }
 
-            dcdt = omega(c, Ti, pi);
+            const scalarField dcdt = omega(c, Ti, pi);
 
             for (label i=0; i<nSpecie_; i++)
             {
@@ -671,6 +670,8 @@ Foam::scalar Foam::ODEChemistryModel<CompType, ThermoType>::solve
     const scalar deltaT
 )
 {
+    scalar deltaTMin = GREAT;
+
     const volScalarField rho
     (
         IOobject
@@ -685,35 +686,33 @@ Foam::scalar Foam::ODEChemistryModel<CompType, ThermoType>::solve
         this->thermo().rho()
     );
 
-    for (label i=0; i<nSpecie_; i++)
+    if (this->mesh().changing())
     {
-        RR_[i].setSize(rho.size());
+        for (label i = 0; i < nSpecie_; i++)
+        {
+            RR_[i].setSize(this->mesh().nCells());
+            RR_[i] = 0.0;
+        }
     }
 
     if (!this->chemistry_)
     {
-        return GREAT;
+        return deltaTMin;
     }
 
-    scalar deltaTMin = GREAT;
 
     tmp<volScalarField> thc = this->thermo().hc();
     const scalarField& hc = thc();
 
     forAll(rho, celli)
     {
-        for (label i=0; i<nSpecie_; i++)
-        {
-            RR_[i][celli] = 0.0;
-        }
-
-        scalar rhoi = rho[celli];
+        const scalar rhoi = rho[celli];
+        const scalar hi = this->thermo().hs()[celli] + hc[celli];
+        const scalar pi = this->thermo().p()[celli];
         scalar Ti = this->thermo().T()[celli];
-        scalar hi = this->thermo().hs()[celli] + hc[celli];
-        scalar pi = this->thermo().p()[celli];
 
-        scalarField c(nSpecie_);
-        scalarField c0(nSpecie_);
+        scalarField c(nSpecie_, 0.0);
+        scalarField c0(nSpecie_, 0.0);
         scalarField dc(nSpecie_, 0.0);
 
         for (label i=0; i<nSpecie_; i++)
@@ -722,21 +721,20 @@ Foam::scalar Foam::ODEChemistryModel<CompType, ThermoType>::solve
         }
         c0 = c;
 
+        // initialise timing parameters
         scalar t = t0;
         scalar tauC = this->deltaTChem_[celli];
         scalar dt = min(deltaT, tauC);
         scalar timeLeft = deltaT;
 
         // calculate the chemical source terms
-        scalar cTot = 0.0;
-
         while (timeLeft > SMALL)
         {
             tauC = solver().solve(c, Ti, pi, t, dt);
             t += dt;
 
             // update the temperature
-            cTot = sum(c);
+            scalar cTot = sum(c);
             ThermoType mixture(0.0*specieThermo_[0]);
             for (label i=0; i<nSpecie_; i++)
             {
@@ -746,19 +744,11 @@ Foam::scalar Foam::ODEChemistryModel<CompType, ThermoType>::solve
 
             timeLeft -= dt;
             this->deltaTChem_[celli] = tauC;
-            dt = min(timeLeft, tauC);
-            dt = max(dt, SMALL);
+            dt = max(SMALL, min(timeLeft, tauC));
         }
         deltaTMin = min(tauC, deltaTMin);
 
         dc = c - c0;
-        scalar WTot = 0.0;
-        for (label i=0; i<nSpecie_; i++)
-        {
-            WTot += c[i]*specieThermo_[i].W();
-        }
-        WTot /= cTot;
-
         for (label i=0; i<nSpecie_; i++)
         {
             RR_[i][celli] = dc[i]*specieThermo_[i].W()/deltaT;
diff --git a/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.H b/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.H
index 777daf1127b75bce165a5c969184b6f3c48ac341..875c66298c5c0417b79b2c73ad8876654f8ad820 100644
--- a/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.H
+++ b/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.H
@@ -141,7 +141,7 @@ public:
         inline const chemistrySolver<CompType, ThermoType>& solver() const;
 
         //- dc/dt = omega, rate of change in concentration, for each species
-        virtual scalarField omega
+        virtual tmp<scalarField> omega
         (
             const scalarField& c,
             const scalar T,