diff --git a/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.C b/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.C
index 4ebc3929ebc736551174c3f1f4bc50ae60531715..008f5ad42c9b2db60d070a50c6c40b96f8252810 100644
--- a/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.C
+++ b/src/thermophysicalModels/chemistryModel/chemistryModel/ODEChemistryModel/ODEChemistryModel.C
@@ -848,11 +848,13 @@ Foam::scalar Foam::ODEChemistryModel<CompType, ThermoType>::solve
     notImplemented
     (
         "ODEChemistryModel::solve"
-        "scalarField&, "
-        "const scalar, "
-        "const scalar, "
-        "const scalar, "
-        "const scalar"
+        "("
+            "scalarField&, "
+            "const scalar, "
+            "const scalar, "
+            "const scalar, "
+            "const scalar"
+        ")"
     );
 
     return (0);
diff --git a/src/thermophysicalModels/chemistryModel/chemistryModel/makeChemistryModel.H b/src/thermophysicalModels/chemistryModel/chemistryModel/makeChemistryModel.H
index faf2608a2b5e8865fabcdc6dbd496449118a6648..18970e5d101ba15dfb64f6cf199f64356d01d1e3 100644
--- a/src/thermophysicalModels/chemistryModel/chemistryModel/makeChemistryModel.H
+++ b/src/thermophysicalModels/chemistryModel/chemistryModel/makeChemistryModel.H
@@ -48,13 +48,6 @@ namespace Foam
         SS##Comp##Thermo,                                                     \
         #SS"<"#Comp","#Thermo">",                                             \
         0                                                                     \
-    );                                                                        \
-                                                                              \
-    addToRunTimeSelectionTable                                                \
-    (                                                                         \
-        Comp,                                                                 \
-        SS##Comp##Thermo,                                                     \
-        fvMesh                                                                \
     );
 
 
@@ -67,13 +60,6 @@ namespace Foam
         SS##Comp##SThermo##GThermo,                                           \
         #SS"<"#Comp","#SThermo","#GThermo">",                                 \
         0                                                                     \
-    );                                                                        \
-                                                                              \
-    addToRunTimeSelectionTable                                                \
-    (                                                                         \
-        Comp,                                                                 \
-        SS##Comp##SThermo##GThermo,                                           \
-        fvMesh                                                                \
     );
 
 
diff --git a/src/thermophysicalModels/chemistryModel/chemistryModel/psiChemistryModel/psiChemistryModelNew.C b/src/thermophysicalModels/chemistryModel/chemistryModel/psiChemistryModel/psiChemistryModelNew.C
index 7c1d6b596a1dbc04365f0a389ac4aa1653dbe5a9..8b22ae7ce55e70f54aab9f248dc3800265d41384 100644
--- a/src/thermophysicalModels/chemistryModel/chemistryModel/psiChemistryModel/psiChemistryModelNew.C
+++ b/src/thermophysicalModels/chemistryModel/chemistryModel/psiChemistryModel/psiChemistryModelNew.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2009-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2009-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -32,24 +32,40 @@ Foam::autoPtr<Foam::psiChemistryModel> Foam::psiChemistryModel::New
     const fvMesh& mesh
 )
 {
-    // get model name, but do not register the dictionary
-    // otherwise it is registered in the database twice
-    const word userModel
+    IOdictionary chemistryPropertiesDict
     (
-        IOdictionary
+        IOobject
         (
-            IOobject
-            (
-                "chemistryProperties",
-                mesh.time().constant(),
-                mesh,
-                IOobject::MUST_READ_IF_MODIFIED,
-                IOobject::NO_WRITE,
-                false
-            )
-        ).lookup("psiChemistryModel")
+            "chemistryProperties",
+            mesh.time().constant(),
+            mesh,
+            IOobject::MUST_READ,
+            IOobject::NO_WRITE,
+            false
+        )
     );
 
+    const word solver(chemistryPropertiesDict.lookup("chemistrySolver"));
+
+    wordList models = fvMeshConstructorTablePtr_->sortedToc();
+    wordHashSet validModels;
+    forAll(models, i)
+    {
+        label delim = models[i].find('<');
+        validModels.insert(models[i](0, delim));
+    }
+
+    wordHashSet::iterator solverIter = validModels.find(solver);
+    if (solverIter == validModels.end())
+    {
+        FatalErrorIn("psiChemistryModel::New(const fvMesh&)")
+            << "Valid chemistrySolver types are:" << validModels
+            << exit(FatalError);
+    }
+
+
+    const word userModel(chemistryPropertiesDict.lookup("psiChemistryModel"));
+
     // construct chemistry model type name by inserting first template argument
     const label tempOpen = userModel.find('<');
     const label tempClose = userModel.find('>');
@@ -59,7 +75,7 @@ Foam::autoPtr<Foam::psiChemistryModel> Foam::psiChemistryModel::New
         userModel(tempOpen + 1, tempClose - tempOpen - 1);
 
     const word modelType =
-        className + '<' + typeName + ',' + thermoTypeName + '>';
+        solver + '<' + className + '<' + typeName + ',' + thermoTypeName + ">>";
 
     if (debug)
     {
@@ -77,7 +93,7 @@ Foam::autoPtr<Foam::psiChemistryModel> Foam::psiChemistryModel::New
     {
         if (debug)
         {
-            FatalErrorIn("psiChemistryModelBase::New(const mesh&)")
+            FatalErrorIn("psiChemistryModel::New(const mesh&)")
                 << "Unknown psiChemistryModel type "
                 << modelType << nl << nl
                 << "Valid psiChemistryModel types are:" << nl
@@ -86,16 +102,22 @@ Foam::autoPtr<Foam::psiChemistryModel> Foam::psiChemistryModel::New
         }
         else
         {
-            wordList models = fvMeshConstructorTablePtr_->sortedToc();
-            forAll(models, i)
+            wordList allModels(fvMeshConstructorTablePtr_->sortedToc());
+            wordHashSet models;
+            forAll(allModels, i)
             {
-                models[i] = models[i].replace(typeName + ',', "");
+                const label tempOpen = allModels[i].find('<');
+                const label tempClose = allModels[i].rfind('>');
+                word modelName =
+                    allModels[i](tempOpen + 1, tempClose - tempOpen - 1);
+                modelName = modelName.replace(typeName + ',', "");
+                models.insert(modelName);
             }
 
-            FatalErrorIn("psiChemistryModelBase::New(const mesh&)")
+            FatalErrorIn("psiChemistryModel::New(const mesh&)")
                 << "Unknown psiChemistryModel type " << userModel
-                << nl << nl << "Valid psiChemistryModel types are:" << nl
-                << models << nl << exit(FatalError);
+                << nl << nl << "Valid psiChemistryModel types are:"
+                << models << exit(FatalError);
         }
     }
 
diff --git a/src/thermophysicalModels/chemistryModel/chemistryModel/rhoChemistryModel/rhoChemistryModelNew.C b/src/thermophysicalModels/chemistryModel/chemistryModel/rhoChemistryModel/rhoChemistryModelNew.C
index f4dbc3a671502a6c36a3f32d2072bf81c7eecd6f..ec9b968c50c69b058f91c37bcc95706c75334c25 100644
--- a/src/thermophysicalModels/chemistryModel/chemistryModel/rhoChemistryModel/rhoChemistryModelNew.C
+++ b/src/thermophysicalModels/chemistryModel/chemistryModel/rhoChemistryModel/rhoChemistryModelNew.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2009-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2009-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -32,24 +32,40 @@ Foam::autoPtr<Foam::rhoChemistryModel> Foam::rhoChemistryModel::New
     const fvMesh& mesh
 )
 {
-    // get model name, but do not register the dictionary
-    // otherwise it is registered in the database twice
-    const word userModel
+    IOdictionary chemistryPropertiesDict
     (
-        IOdictionary
+        IOobject
         (
-            IOobject
-            (
-                "chemistryProperties",
-                mesh.time().constant(),
-                mesh,
-                IOobject::MUST_READ_IF_MODIFIED,
-                IOobject::NO_WRITE,
-                false
-            )
-        ).lookup("rhoChemistryModel")
+            "chemistryProperties",
+            mesh.time().constant(),
+            mesh,
+            IOobject::MUST_READ,
+            IOobject::NO_WRITE,
+            false
+        )
     );
 
+    const word solver(chemistryPropertiesDict.lookup("chemistrySolver"));
+
+    wordList models = fvMeshConstructorTablePtr_->sortedToc();
+    wordHashSet validModels;
+    forAll(models, i)
+    {
+        label delim = models[i].find('<');
+        validModels.insert(models[i](0, delim));
+    }
+
+    wordHashSet::iterator solverIter = validModels.find(solver);
+    if (solverIter == validModels.end())
+    {
+        FatalErrorIn("rhoChemistryModel::New(const fvMesh&)")
+            << "Valid chemistrySolver types are:" << validModels
+            << exit(FatalError);
+    }
+
+
+    const word userModel(chemistryPropertiesDict.lookup("rhoChemistryModel"));
+
     // construct chemistry model type name by inserting first template argument
     const label tempOpen = userModel.find('<');
     const label tempClose = userModel.find('>');
@@ -59,7 +75,7 @@ Foam::autoPtr<Foam::rhoChemistryModel> Foam::rhoChemistryModel::New
         userModel(tempOpen + 1, tempClose - tempOpen - 1);
 
     const word modelType =
-        className + '<' + typeName + ',' + thermoTypeName + '>';
+        solver + '<' + className + '<' + typeName + ',' + thermoTypeName + ">>";
 
     if (debug)
     {
@@ -77,7 +93,7 @@ Foam::autoPtr<Foam::rhoChemistryModel> Foam::rhoChemistryModel::New
     {
         if (debug)
         {
-            FatalErrorIn("rhoChemistryModelBase::New(const mesh&)")
+            FatalErrorIn("rhoChemistryModel::New(const mesh&)")
                 << "Unknown rhoChemistryModel type "
                 << modelType << nl << nl
                 << "Valid rhoChemistryModel types are:" << nl
@@ -86,18 +102,22 @@ Foam::autoPtr<Foam::rhoChemistryModel> Foam::rhoChemistryModel::New
         }
         else
         {
-            wordList models = fvMeshConstructorTablePtr_->sortedToc();
-            forAll(models, i)
+            wordList allModels(fvMeshConstructorTablePtr_->sortedToc());
+            wordHashSet models;
+            forAll(allModels, i)
             {
-                models[i] = models[i].replace(typeName + ',', "");
+                const label tempOpen = allModels[i].find('<');
+                const label tempClose = allModels[i].rfind('>');
+                word modelName =
+                    allModels[i](tempOpen + 1, tempClose - tempOpen - 1);
+                modelName = modelName.replace(typeName + ',', "");
+                models.insert(modelName);
             }
 
-            FatalErrorIn("rhoChemistryModelBase::New(const mesh&)")
-                << "Unknown rhoChemistryModel type "
-                << userModel << nl << nl
-                << "Valid rhoChemistryModel types are:" << nl
-                << models << nl
-                << exit(FatalError);
+            FatalErrorIn("rhoChemistryModel::New(const mesh&)")
+                << "Unknown rhoChemistryModel type " << userModel
+                << nl << nl << "Valid rhoChemistryModel types are:"
+                << models << exit(FatalError);
         }
     }
 
diff --git a/src/thermophysicalModels/chemistryModel/chemistrySolver/EulerImplicit/EulerImplicit.C b/src/thermophysicalModels/chemistryModel/chemistrySolver/EulerImplicit/EulerImplicit.C
index a2fbbe497a164082f0e2b2deda6a11b0a5610342..861347e94bd16b5cc09ddbc399ea1c0d12a06525 100644
--- a/src/thermophysicalModels/chemistryModel/chemistrySolver/EulerImplicit/EulerImplicit.C
+++ b/src/thermophysicalModels/chemistryModel/chemistrySolver/EulerImplicit/EulerImplicit.C
@@ -38,7 +38,7 @@ Foam::EulerImplicit<ODEChemistryType>::EulerImplicit
 )
 :
     chemistrySolver<ODEChemistryType>(mesh, ODEModelName, thermoType),
-    coeffsDict_(this->subDict(ODEModelName + "Coeffs")),
+    coeffsDict_(this->subDict("EulerImplicitCoeffs")),
     cTauChem_(readScalar(coeffsDict_.lookup("cTauChem"))),
     eqRateLimiter_(coeffsDict_.lookup("equilibriumRateLimiter"))
 {}
diff --git a/src/thermophysicalModels/chemistryModel/chemistrySolver/ode/ode.C b/src/thermophysicalModels/chemistryModel/chemistrySolver/ode/ode.C
index 29e7d6c8e7d6d0de12f8d30d11b3a1809bce41fb..d14299e235d27886b9c8752df222419add5d1b73 100644
--- a/src/thermophysicalModels/chemistryModel/chemistrySolver/ode/ode.C
+++ b/src/thermophysicalModels/chemistryModel/chemistrySolver/ode/ode.C
@@ -37,8 +37,8 @@ Foam::ode<ODEChemistryType>::ode
 )
 :
     chemistrySolver<ODEChemistryType>(mesh, ODEModelName, thermoType),
-    coeffsDict_(this->subDict(ODEModelName + "Coeffs")),
-    solverName_(coeffsDict_.lookup("ODESolver")),
+    coeffsDict_(this->subDict("odeCoeffs")),
+    solverName_(coeffsDict_.lookup("solver")),
     odeSolver_(ODESolver::New(solverName_, *this)),
     eps_(readScalar(coeffsDict_.lookup("eps")))
 {}
diff --git a/src/thermophysicalModels/chemistryModel/chemistrySolver/sequential/sequential.C b/src/thermophysicalModels/chemistryModel/chemistrySolver/sequential/sequential.C
index 28a80563cc979ada7e052bf6b402d4c4227c35d8..c0005f642039bd31bf6c68c6d153854bb64e4b05 100644
--- a/src/thermophysicalModels/chemistryModel/chemistrySolver/sequential/sequential.C
+++ b/src/thermophysicalModels/chemistryModel/chemistrySolver/sequential/sequential.C
@@ -37,7 +37,7 @@ Foam::sequential<ODEChemistryType>::sequential
 )
 :
     chemistrySolver<ODEChemistryType>(mesh, ODEModelName, thermoType),
-    coeffsDict_(this->subDict(ODEModelName + "Coeffs")),
+    coeffsDict_(this->subDict("sequentialCoeffs")),
     cTauChem_(readScalar(coeffsDict_.lookup("cTauChem"))),
     eqRateLimiter_(coeffsDict_.lookup("equilibriumRateLimiter"))
 {}