diff --git a/applications/utilities/preProcessing/changeDictionary/changeDictionary.C b/applications/utilities/preProcessing/changeDictionary/changeDictionary.C
index ac3b733b038228f347dbe2c8651e19a75a3a50fe..ad178b765cbe55713463e268b1f9463747318826 100644
--- a/applications/utilities/preProcessing/changeDictionary/changeDictionary.C
+++ b/applications/utilities/preProcessing/changeDictionary/changeDictionary.C
@@ -58,11 +58,15 @@ Usage
     - changeDictionary [OPTION]
 
     \param -literalRE \n
-    Do not interpret regular expressions; treat them as any other keyword.
+    Do not interpret regular expressions or patchGroups;
+    treat them as any other keyword.
 
     \param -enableFunctionEntries \n
     By default all dictionary preprocessing of fields is disabled
 
+    \param -disablePatchGroups \n
+    By default all keys are also checked for being patchGroups
+
 \*---------------------------------------------------------------------------*/
 
 #include "argList.H"
@@ -84,7 +88,47 @@ namespace Foam
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-bool merge(dictionary&, const dictionary&, const bool);
+// Extract groupPatch (= shortcut) info from boundary file info
+HashTable<wordList, word> extractPatchGroups(const dictionary& boundaryDict)
+{
+    HashTable<wordList, word> groupToPatch;
+
+    forAllConstIter(dictionary, boundaryDict, iter)
+    {
+        const word& patchName = iter().keyword();
+        const dictionary& patchDict = iter().dict();
+
+        wordList groups;
+        if (patchDict.readIfPresent("inGroups", groups))
+        {
+            forAll(groups, i)
+            {
+                HashTable<wordList, word>::iterator fndGroup = groupToPatch.find
+                (
+                    groups[i]
+                );
+                if (fndGroup == groupToPatch.end())
+                {
+                    groupToPatch.insert(groups[i], wordList(1, patchName));
+                }
+                else
+                {
+                    fndGroup().append(patchName);
+                }
+            }
+        }
+    }
+    return groupToPatch;
+}
+
+
+bool merge
+(
+    dictionary&,
+    const dictionary&,
+    const bool,
+    const HashTable<wordList, word>&
+);
 
 
 // Add thisEntry to dictionary thisDict.
@@ -93,7 +137,8 @@ bool addEntry
     dictionary& thisDict,
     entry& thisEntry,
     const entry& mergeEntry,
-    const bool literalRE
+    const bool literalRE,
+    const HashTable<wordList, word>& shortcuts
 )
 {
     bool changed = false;
@@ -108,7 +153,8 @@ bool addEntry
             (
                 const_cast<dictionary&>(thisEntry.dict()),
                 mergeEntry.dict(),
-                literalRE
+                literalRE,
+                shortcuts
             )
         )
         {
@@ -135,7 +181,8 @@ bool merge
 (
     dictionary& thisDict,
     const dictionary& mergeDict,
-    const bool literalRE
+    const bool literalRE,
+    const HashTable<wordList, word>& shortcuts
 )
 {
     bool changed = false;
@@ -156,7 +203,7 @@ bool merge
     {
         const keyType& key = mergeIter().keyword();
 
-        if (literalRE || !key.isPattern())
+        if (literalRE || !(key.isPattern() || shortcuts.found(key)))
         {
             entry* entryPtr = thisDict.lookupEntryPtr
             (
@@ -179,7 +226,8 @@ bool merge
                         thisDict,
                        *entryPtr,
                         mergeIter(),
-                        literalRE
+                        literalRE,
+                        shortcuts
                     )
                 )
                 {
@@ -196,44 +244,70 @@ bool merge
     }
 
 
-    // Pass 2. Wildcard matches (if any) on any non-match keys.
+    // Pass 2. Wildcard or shortcut matches (if any) on any non-match keys.
 
     if (!literalRE && thisKeysSet.size() > 0)
     {
+        // Pick up remaining dictionary entries
         wordList thisKeys(thisKeysSet.toc());
 
         forAllConstIter(IDLList<entry>, mergeDict, mergeIter)
         {
             const keyType& key = mergeIter().keyword();
 
+            // List of indices into thisKeys
+            labelList matches;
+
             if (key.isPattern())
             {
-                // Find all matching entries in the original thisDict
-
-                labelList matches = findStrings(key, thisKeys);
+                // Wildcard match
+                matches = findStrings(key, thisKeys);
 
-                forAll(matches, i)
+            }
+            else if (shortcuts.size())
+            {
+                // See if patchGroups expand to valid thisKeys
+                const wordList shortcutNames = shortcuts.toc();
+                labelList indices = findStrings(key, shortcutNames);
+                forAll(indices, i)
                 {
-                    label matchI = matches[i];
+                    const word& name = shortcutNames[indices[i]];
+                    const wordList& keys = shortcuts[name];
+                    forAll(keys, j)
+                    {
+                        label index = findIndex(thisKeys, keys[j]);
+                        if (index != -1)
+                        {
+                            matches.append(index);
+                        }
+                    }
+                }
+            }
 
-                    entry& thisEntry = const_cast<entry&>
-                    (
-                        thisDict.lookupEntry(thisKeys[matchI], false, false)
-                    );
+            // Add all matches
+            forAll(matches, i)
+            {
+                const word& thisKey = thisKeys[matches[i]];
+
+                entry& thisEntry = const_cast<entry&>
+                (
+                    thisDict.lookupEntry(thisKey, false, false)
+                );
 
-                    if
+                if
+                (
+                    addEntry
                     (
-                        addEntry
-                        (
-                            thisDict,
-                            thisEntry,
-                            mergeIter(),
-                            literalRE
-                        )
+                        thisDict,
+                        thisEntry,
+                        mergeIter(),
+                        literalRE,
+                        HashTable<wordList, word>(0)    // no shortcuts
+                                                        // at deeper levels
                     )
-                    {
-                        changed = true;
-                    }
+                )
+                {
+                    changed = true;
                 }
             }
         }
@@ -273,6 +347,12 @@ int main(int argc, char *argv[])
         "enableFunctionEntries",
         "enable expansion of dictionary directives - #include, #codeStream etc"
     );
+    argList::addBoolOption
+    (
+        "disablePatchGroups",
+        "disable matching keys to patch groups"
+    );
+
     #include "addRegionOption.H"
 
     #include "setRootCase.H"
@@ -304,7 +384,6 @@ int main(int argc, char *argv[])
     }
 
     const bool literalRE = args.optionFound("literalRE");
-
     if (literalRE)
     {
         Info<< "Not interpreting any regular expressions (RE)"
@@ -328,6 +407,15 @@ int main(int argc, char *argv[])
     }
 
 
+    const bool disablePatchGroups = args.optionFound("disablePatchGroups");
+    if (disablePatchGroups)
+    {
+        Info<< "Not interpreting any keys in the changeDictionary"
+            << " as patchGroups"
+            << endl;
+    }
+
+
     fileName regionPrefix = "";
     if (regionName != fvMesh::defaultRegion)
     {
@@ -369,6 +457,70 @@ int main(int argc, char *argv[])
         << replaceDicts.toc() << endl;
 
 
+
+    // Always read boundary to get patch groups
+    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Info<< "Reading polyMesh/boundary file to extract patch names"
+        << endl;
+
+    // Read PtrList of dictionary as dictionary.
+    const word oldTypeName = IOPtrList<entry>::typeName;
+    const_cast<word&>(IOPtrList<entry>::typeName) = word::null;
+    IOPtrList<entry> dictList
+    (
+        IOobject
+        (
+            "boundary",
+            runTime.findInstance
+            (
+                regionPrefix/polyMesh::meshSubDir,
+                "boundary",
+                IOobject::READ_IF_PRESENT
+            ),
+            polyMesh::meshSubDir,
+            mesh,
+            IOobject::READ_IF_PRESENT,
+            IOobject::NO_WRITE,
+            false
+        )
+    );
+    const_cast<word&>(IOPtrList<entry>::typeName) = oldTypeName;
+    // Fake type back to what was in field
+    const_cast<word&>(dictList.type()) = dictList.headerClassName();
+
+    // Temporary convert to dictionary
+    dictionary fieldDict;
+    forAll(dictList, i)
+    {
+        fieldDict.add(dictList[i].keyword(), dictList[i].dict());
+    }
+
+    if (dictList.size())
+    {
+        Info<< "Loaded dictionary " << dictList.name()
+            << " with entries " << fieldDict.toc() << endl;
+    }
+
+    // Extract any patchGroups information (= shortcut for set of
+    // patches)
+    HashTable<wordList, word> patchGroups;
+    if (!disablePatchGroups)
+    {
+        patchGroups = extractPatchGroups(fieldDict);
+        if (patchGroups.size())
+        {
+            Info<< "Extracted patch groups:" << endl;
+            wordList groups(patchGroups.sortedToc());
+            forAll(groups, i)
+            {
+                Info<< "    group " << groups[i] << " with patches "
+                    << patchGroups[groups[i]] << endl;
+            }
+        }
+    }
+
+
     // Every replacement is a dictionary name and a keyword in this
 
     forAllConstIter(dictionary, replaceDicts, fieldIter)
@@ -384,46 +536,12 @@ int main(int argc, char *argv[])
             Info<< "Special handling of " << fieldName
                 << " as polyMesh/boundary file." << endl;
 
-            // Read PtrList of dictionary as dictionary.
-            const word oldTypeName = IOPtrList<entry>::typeName;
-            const_cast<word&>(IOPtrList<entry>::typeName) = word::null;
-            IOPtrList<entry> dictList
-            (
-                IOobject
-                (
-                    fieldName,
-                    runTime.findInstance
-                    (
-                        regionPrefix/polyMesh::meshSubDir,
-                        fieldName
-                    ),
-                    polyMesh::meshSubDir,
-                    mesh,
-                    IOobject::MUST_READ,
-                    IOobject::NO_WRITE,
-                    false
-                )
-            );
-            const_cast<word&>(IOPtrList<entry>::typeName) = oldTypeName;
-            // Fake type back to what was in field
-            const_cast<word&>(dictList.type()) = dictList.headerClassName();
-
-            // Temporary convert to dictionary
-            dictionary fieldDict;
-            forAll(dictList, i)
-            {
-                fieldDict.add(dictList[i].keyword(), dictList[i].dict());
-            }
-
-            Info<< "Loaded dictionary " << fieldName
-                << " with entries " << fieldDict.toc() << endl;
-
             // Get the replacement dictionary for the field
             const dictionary& replaceDict = fieldIter().dict();
             Info<< "Merging entries from " << replaceDict.toc() << endl;
 
             // Merge the replacements in
-            merge(fieldDict, replaceDict, literalRE);
+            merge(fieldDict, replaceDict, literalRE, patchGroups);
 
             Info<< "fieldDict:" << fieldDict << endl;
 
@@ -492,7 +610,7 @@ int main(int argc, char *argv[])
             Info<< "Merging entries from " << replaceDict.toc() << endl;
 
             // Merge the replacements in
-            merge(fieldDict, replaceDict, literalRE);
+            merge(fieldDict, replaceDict, literalRE, patchGroups);
 
             Info<< "Writing modified fieldDict " << fieldName << endl;
             fieldDict.regIOobject::write();
diff --git a/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.C b/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.C
index 60478f9609df96806e1307d386b08c6404160345..eb8fd092806efafce9227f6cfd88d7a02fa72f53 100644
--- a/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.C
+++ b/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -74,13 +74,15 @@ Foam::fileName Foam::functionEntries::includeEntry::includeFileName
     fileName fName(is);
     fName.expand();
 
-    // relative name
-    if (!fName.isAbsolute())
+    if (fName.empty() || fName.isAbsolute())
     {
-        fName = fileName(is.name()).path()/fName;
+        return fName;
+    }
+    else
+    {
+        // relative name
+        return fileName(is.name()).path()/fName;
     }
-
-    return fName;
 }
 
 
diff --git a/src/OpenFOAM/db/objectRegistry/objectRegistry.H b/src/OpenFOAM/db/objectRegistry/objectRegistry.H
index 48cabcc1cfa79c63242306fb2654e3099cecaf59..14306e41fbc8e570921706fd0b2f8682249ca5ed 100644
--- a/src/OpenFOAM/db/objectRegistry/objectRegistry.H
+++ b/src/OpenFOAM/db/objectRegistry/objectRegistry.H
@@ -157,7 +157,7 @@ public:
 
             //- Lookup and return all objects of the given Type
             template<class Type>
-            HashTable<const Type*> lookupClass() const;
+            HashTable<const Type*> lookupClass(const bool strict = false) const;
 
             //- Is the named Type found?
             template<class Type>
diff --git a/src/OpenFOAM/db/objectRegistry/objectRegistryTemplates.C b/src/OpenFOAM/db/objectRegistry/objectRegistryTemplates.C
index eb7b8fab63469b1624bf693cf824b0ae5d4e97a2..8c1ca52cf84265a939e663b751d2f925e0a19bcf 100644
--- a/src/OpenFOAM/db/objectRegistry/objectRegistryTemplates.C
+++ b/src/OpenFOAM/db/objectRegistry/objectRegistryTemplates.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -29,8 +29,7 @@ License
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class Type>
-Foam::wordList
-Foam::objectRegistry::names() const
+Foam::wordList Foam::objectRegistry::names() const
 {
     wordList objectNames(size());
 
@@ -50,14 +49,16 @@ Foam::objectRegistry::names() const
 
 
 template<class Type>
-Foam::HashTable<const Type*>
-Foam::objectRegistry::lookupClass() const
+Foam::HashTable<const Type*> Foam::objectRegistry::lookupClass
+(
+    const bool strict
+) const
 {
     HashTable<const Type*> objectsOfClass(size());
 
     for (const_iterator iter = begin(); iter != end(); ++iter)
     {
-        if (isA<Type>(*iter()))
+        if ((strict && isType<Type>(*iter())) || isA<Type>(*iter()))
         {
             objectsOfClass.insert
             (
diff --git a/src/OpenFOAM/fields/DimensionedFields/DimensionedField/MapDimensionedFields.H b/src/OpenFOAM/fields/DimensionedFields/DimensionedField/MapDimensionedFields.H
new file mode 100644
index 0000000000000000000000000000000000000000..b96c6ca666c0a783bf5d7997342b9501def880bc
--- /dev/null
+++ b/src/OpenFOAM/fields/DimensionedFields/DimensionedField/MapDimensionedFields.H
@@ -0,0 +1,96 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2012 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
+    Generic internal field mapper for dimensioned fields.  For "real" mapping,
+    add template specialisations for mapping of internal fields depending on
+    mesh type.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef MapDimensionedFields_H
+#define MapDimensionedFields_H
+
+#include "polyMesh.H"
+#include "MapFvVolField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+template<class Type, class MeshMapper, class GeoMesh>
+void MapDimensionedFields(const MeshMapper& mapper)
+{
+    typedef DimensionedField<Type, GeoMesh> FieldType;
+    typedef HashTable<const FieldType*> TableType;
+
+    TableType fields(mapper.thisDb().size());
+
+    forAllConstIter(objectRegistry, mapper.thisDb(), iter)
+    {
+        if (isType<FieldType>(*iter()))
+        {
+            fields.insert
+            (
+                iter()->name(),
+                dynamic_cast<const FieldType*>(iter())
+            );
+        }
+    }
+
+    forAllConstIter(typename TableType, fields, fieldIter)
+    {
+        FieldType& field = const_cast<FieldType&>(*fieldIter());
+
+        if (&field.mesh() == &mapper.mesh())
+        {
+            if (polyMesh::debug)
+            {
+                Info<< "Mapping " << field.typeName << ' ' << field.name()
+                    << endl;
+            }
+
+            MapInternalField<Type, MeshMapper, GeoMesh>()(field, mapper);
+
+            field.instance() = field.time().timeName();
+        }
+        else if (polyMesh::debug)
+        {
+            Info<< "Not mapping " << field.typeName << ' ' << field.name()
+                << " since originating mesh differs from that of mapper."
+                << endl;
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.H b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.H
index 1f9c51ac9f6a8398f913193faa6cd53e61c961d8..895daa91ab044b53ce4241d7f730a1b69220f43d 100644
--- a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.H
+++ b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.H
@@ -25,50 +25,53 @@ Class
     Foam::globalMeshData
 
 Description
-    Various mesh related information for a parallel run. Upon construction
-    constructs all info by using parallel communication.
+    Various mesh related information for a parallel run. Upon construction,
+    constructs all info using parallel communication.
 
     Requires:
     - all processor patches to have correct ordering.
     - all processorPatches to have their transforms set.
 
-    The shared point and edge addressing is quite interesting.
-    It calculates addressing for points and edges on coupled patches. In
-    the 'old' way a distincation was made between points/edges that are
-    only on two processors and those that are on multiple processors. The
-    problem is that those on multiple processors do not allow any
-    transformations and require a global reduction on the master processor.
+    The shared point and edge addressing calculates addressing for points
+    and edges on coupled patches.  In the 'old' way a distinction was made
+    between points/edges that are only on two processors and those that are
+    on multiple processors.  The problem is that those on multiple processors
+    do not allow any transformations and require a global reduction on the
+    master processor.
 
     The alternative is to have an exchange schedule (through a 'mapDistribute')
     which sends all point/edge data (no distinction is made between
     those on two and those on more than two coupled patches) to the local
-    'master'. This master then does any calculation and sends
-    the result back to the 'slave' points/edges. This only needs to be done
-    on points on coupled faces. Any transformation is done using a predetermined
-    set of transformations - since transformations have to be space filling
-    only a certain number of transformation is supported.
+    'master'.  This master then does any calculation and sends
+    the result back to the 'slave' points/edges.  This only needs to be done
+    on points on coupled faces.  Any transformation is done using a
+    predetermined set of transformations - since transformations have to be
+    space filling only a certain number of transformation is supported.
 
     The exchange needs
     - a field of data
     - a mapDistribute which does all parallel exchange and transformations
-      This appens remote data to the end of the field.
+      This appens remote data to the end of the field
     - a set of indices which indicate where to get untransformed data in the
       field
     - a set of indices which indicate where to get transformed data in the
       field
 
-    See also mapDistribute, globalIndexAndTransform
-
-    Notes:
+Note
     - compared to 17x nTotalFaces, nTotalPoints do not compensate for
-    shared points since this would trigger full connectivity analysis
+      shared points since this would trigger full connectivity analysis
     - most calculation is demand driven and uses parallel communication
-    so make sure to invoke on all processors at the same time.
+      so make sure to invoke on all processors at the same time
     - old sharedEdge calculation: currently an edge is considered shared
-    if it uses two shared points and is used more than once. This is not
-    correct on processor patches but it only slightly overestimates the number
-    of shared edges. Doing full analysis of how many patches use the edge
-    would be too complicated.
+      if it uses two shared points and is used more than once.  This is not
+      correct on processor patches but it only slightly overestimates the number
+      of shared edges.  Doing full analysis of how many patches use the edge
+      would be too complicated
+
+SeeAlso
+    mapDistribute
+    globalIndexAndTransform
+
 
 SourceFiles
     globalMeshData.C
@@ -98,7 +101,7 @@ class globalIndexAndTransform;
 class PackedBoolList;
 
 /*---------------------------------------------------------------------------*\
-                           Class globalMeshData Declaration
+                      Class globalMeshData Declaration
 \*---------------------------------------------------------------------------*/
 
 class globalMeshData
diff --git a/src/OpenFOAM/meshes/polyMesh/polyMeshUpdate.C b/src/OpenFOAM/meshes/polyMesh/polyMeshUpdate.C
index bba7367e8b9ba29efb752dbcdd9667fa7c659946..96dc726b44a1c2a2bb53667a99b9036dcefa712f 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyMeshUpdate.C
+++ b/src/OpenFOAM/meshes/polyMesh/polyMeshUpdate.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -31,6 +31,8 @@ Description
 #include "Time.H"
 #include "globalMeshData.H"
 #include "pointMesh.H"
+#include "indexedOctree.H"
+#include "treeDataCell.H"
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
@@ -44,6 +46,11 @@ void Foam::polyMesh::updateMesh(const mapPolyMesh& mpm)
     faceZones_.clearAddressing();
     cellZones_.clearAddressing();
 
+    // Remove the stored tet base points
+    tetBasePtIsPtr_.clear();
+    // Remove the cell tree
+    cellTreePtr_.clear();
+
     // Update parallel data
     if (globalMeshDataPtr_.valid())
     {
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H
index ba32afbd6346643e1e9f5bcdd80e395cd91e2e90..9723a2116af3549b3526d569ce13ac1fb0ae69d3 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H
@@ -110,7 +110,7 @@ class codedFixedValueFvPatchField
     // Private data
 
         //- Dictionary contents for the boundary condition
-        mutable dictionary dict_;
+        const dictionary dict_;
 
         const word redirectType_;
 
diff --git a/src/finiteVolume/fvMesh/fvMesh.C b/src/finiteVolume/fvMesh/fvMesh.C
index 0889270894b03b7d3e63a27558fcbbd3b396f0be..95ff899be987577da368654539431426878642c0 100644
--- a/src/finiteVolume/fvMesh/fvMesh.C
+++ b/src/finiteVolume/fvMesh/fvMesh.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2012 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -494,6 +494,13 @@ void Foam::fvMesh::mapFields(const mapPolyMesh& meshMap)
     MapGeometricFields<tensor, fvsPatchField, fvMeshMapper, surfaceMesh>
     (mapper);
 
+    // Map all the dimensionedFields in the objectRegistry
+    MapDimensionedFields<scalar, fvMeshMapper, volMesh>(mapper);
+    MapDimensionedFields<vector, fvMeshMapper, volMesh>(mapper);
+    MapDimensionedFields<sphericalTensor, fvMeshMapper, volMesh>(mapper);
+    MapDimensionedFields<symmTensor, fvMeshMapper, volMesh>(mapper);
+    MapDimensionedFields<tensor, fvMeshMapper, volMesh>(mapper);
+
     // Map all the clouds in the objectRegistry
     mapClouds(*this, meshMap);
 
diff --git a/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvFields.H b/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvFields.H
index 3f719f18bf82208df536de22e850ae854b3233df..8ae0910b1ab6e92371653d139cf218cf6b100ebb 100644
--- a/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvFields.H
+++ b/src/finiteVolume/interpolation/mapping/fvFieldMappers/MapFvFields.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -31,6 +31,7 @@ Description
 #include "MapGeometricFields.H"
 #include "MapFvSurfaceField.H"
 #include "MapFvVolField.H"
+#include "MapDimensionedFields.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/lagrangian/basic/Cloud/Cloud.C b/src/lagrangian/basic/Cloud/Cloud.C
index 460b9650704eb369c554153fd2e78dceb823f806..d85ef08dcaf6304a0c140b58ddb6a3fc3aa07053 100644
--- a/src/lagrangian/basic/Cloud/Cloud.C
+++ b/src/lagrangian/basic/Cloud/Cloud.C
@@ -423,6 +423,10 @@ void Foam::Cloud<ParticleType>::autoMap
                 trackStartCell = 0;
                 p.cell() = 0;
             }
+            else
+            {
+                p.cell() = trackStartCell;
+            }
 
             vector pos = p.position();
 
diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
index 3ca019fa4e15286e02c46ebfcf2c6e1a4fc67633..ef332fa673eaa57400ce61541a8515824b867cac 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
@@ -346,7 +346,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
         (
             IOobject
             (
-                this->name() + "UTrans",
+                this->name() + "::UTrans",
                 this->db().time().timeName(),
                 this->db(),
                 IOobject::READ_IF_PRESENT,
@@ -362,7 +362,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
         (
             IOobject
             (
-                this->name() + "UCoeff",
+                this->name() + "::UCoeff",
                 this->db().time().timeName(),
                 this->db(),
                 IOobject::READ_IF_PRESENT,
@@ -426,7 +426,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
         (
             IOobject
             (
-                this->name() + "UTrans",
+                this->name() + "::UTrans",
                 this->db().time().timeName(),
                 this->db(),
                 IOobject::NO_READ,
@@ -442,7 +442,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
         (
             IOobject
             (
-                name + "UCoeff",
+                name + "::UCoeff",
                 this->db().time().timeName(),
                 this->db(),
                 IOobject::NO_READ,
diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H
index 106ff158a750008bcd70160bc6edc2d41e5a7866..a6bdf47cc46e750f79091d14201fad830c9e4a2a 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H
@@ -539,7 +539,7 @@ Foam::KinematicCloud<CloudType>::theta() const
         (
             IOobject
             (
-                this->name() + "Theta",
+                this->name() + "::theta",
                 this->db().time().timeName(),
                 this->db(),
                 IOobject::NO_READ,
@@ -578,7 +578,7 @@ Foam::KinematicCloud<CloudType>::alpha() const
         (
             IOobject
             (
-                this->name() + "Alpha",
+                this->name() + "::alpha",
                 this->db().time().timeName(),
                 this->db(),
                 IOobject::NO_READ,
@@ -615,7 +615,7 @@ Foam::KinematicCloud<CloudType>::rhoEff() const
         (
             IOobject
             (
-                this->name() + "RhoEff",
+                this->name() + "::rhoEff",
                 this->db().time().timeName(),
                 this->db(),
                 IOobject::NO_READ,
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C
index 0f98e8b935ac00be354dda8050369c66d827faac..1bc817a4c132fa33ceea7d3bfce8eec7c678a859 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C
@@ -132,7 +132,7 @@ Foam::ReactingCloud<CloudType>::ReactingCloud
             (
                 IOobject
                 (
-                    this->name() + "rhoTrans_" + specieName,
+                    this->name() + "::rhoTrans_" + specieName,
                     this->db().time().timeName(),
                     this->db(),
                     IOobject::READ_IF_PRESENT,
@@ -176,7 +176,7 @@ Foam::ReactingCloud<CloudType>::ReactingCloud
             (
                 IOobject
                 (
-                    this->name() + "rhoTrans_" + specieName,
+                    this->name() + "::rhoTrans_" + specieName,
                     this->db().time().timeName(),
                     this->db(),
                     IOobject::NO_READ,
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H
index 2a9bbb2423444349e2b272de6c7085237f28acba..66cb73b85f741fbc89ad11286e8cd77ccba7bb55 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -107,7 +107,7 @@ inline Foam::tmp<Foam::fvScalarMatrix> Foam::ReactingCloud<CloudType>::SYi
                 (
                     IOobject
                     (
-                        this->name() + "rhoTrans",
+                        this->name() + "::rhoTrans",
                         this->db().time().timeName(),
                         this->db(),
                         IOobject::NO_READ,
@@ -155,7 +155,7 @@ Foam::ReactingCloud<CloudType>::Srho(const label i) const
         (
             IOobject
             (
-                this->name() + "rhoTrans",
+                this->name() + "::rhoTrans",
                 this->db().time().timeName(),
                 this->db(),
                 IOobject::NO_READ,
@@ -192,7 +192,7 @@ Foam::ReactingCloud<CloudType>::Srho() const
         (
             IOobject
             (
-                this->name() + "rhoTrans",
+                this->name() + "::rhoTrans",
                 this->db().time().timeName(),
                 this->db(),
                 IOobject::NO_READ,
@@ -236,7 +236,7 @@ Foam::ReactingCloud<CloudType>::Srho(volScalarField& rho) const
             (
                 IOobject
                 (
-                    this->name() + "rhoTrans",
+                    this->name() + "::rhoTrans",
                     this->db().time().timeName(),
                     this->db(),
                     IOobject::NO_READ,
diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H
index 764595fece7cc5be685010174f74ac0217bfe5f5..a75f1f64d861a65ec9db19a1fe9bb01399291ea8 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H
@@ -278,7 +278,7 @@ inline Foam::tmp<Foam::volScalarField> Foam::ThermoCloud<CloudType>::Ep() const
         (
             IOobject
             (
-                this->name() + "radiation::Ep",
+                this->name() + "::radiation::Ep",
                 this->db().time().timeName(),
                 this->db(),
                 IOobject::NO_READ,
@@ -314,7 +314,7 @@ inline Foam::tmp<Foam::volScalarField> Foam::ThermoCloud<CloudType>::ap() const
         (
             IOobject
             (
-                this->name() + "radiation::ap",
+                this->name() + "::radiation::ap",
                 this->db().time().timeName(),
                 this->db(),
                 IOobject::NO_READ,
@@ -351,7 +351,7 @@ Foam::ThermoCloud<CloudType>::sigmap() const
         (
             IOobject
             (
-                this->name() + "radiation::sigmap",
+                this->name() + "::radiation::sigmap",
                 this->db().time().timeName(),
                 this->db(),
                 IOobject::NO_READ,
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C
index a16de448b3a2a06a85930faa06e45c30c5b7a703..ff2f3a6e8413631f1ab77f893d9e2935a09dd4a7 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.C
@@ -294,7 +294,8 @@ Foam::InjectionModel<CloudType>::InjectionModel(CloudType& owner)
     parcelBasis_(pbNumber),
     nParticleFixed_(0.0),
     time0_(0.0),
-    timeStep0_(this->template getModelProperty<scalar>("timeStep0"))
+    timeStep0_(this->template getModelProperty<scalar>("timeStep0")),
+    delayedVolume_(0.0)
 {}
 
 
@@ -321,7 +322,8 @@ Foam::InjectionModel<CloudType>::InjectionModel
     parcelBasis_(pbNumber),
     nParticleFixed_(0.0),
     time0_(owner.db().time().value()),
-    timeStep0_(this->template getModelProperty<scalar>("timeStep0"))
+    timeStep0_(this->template getModelProperty<scalar>("timeStep0")),
+    delayedVolume_(0.0)
 {
     // Provide some info
     // - also serves to initialise mesh dimensions - needed for parallel runs
@@ -394,7 +396,8 @@ Foam::InjectionModel<CloudType>::InjectionModel
     parcelBasis_(im.parcelBasis_),
     nParticleFixed_(im.nParticleFixed_),
     time0_(im.time0_),
-    timeStep0_(im.timeStep0_)
+    timeStep0_(im.timeStep0_),
+    delayedVolume_(im.delayedVolume_)
 {}
 
 
@@ -502,6 +505,9 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
 
     if (prepareForNextTimeStep(time, newParcels, newVolume))
     {
+        newVolume += delayedVolume_;
+        scalar delayedVolume = 0;
+
         const scalar trackTime = this->owner().solution().trackTime();
         const polyMesh& mesh = this->owner().mesh();
         typename TrackData::cloudType& cloud = td.cloud();
@@ -579,7 +585,7 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
                             pPtr->rho()
                         );
 
-                    if (pPtr->move(td, dt))
+                    if ((pPtr->nParticle() >= 1.0) && (pPtr->move(td, dt)))
                     {
                         td.cloud().addParticle(pPtr);
                         massAdded += pPtr->nParticle()*pPtr->mass();
@@ -587,11 +593,14 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
                     }
                     else
                     {
+                        delayedVolume += pPtr->nParticle()*pPtr->volume();
                         delete pPtr;
                     }
                 }
             }
         }
+
+        delayedVolume_ = delayedVolume;
     }
 
     postInjectCheck(parcelsAdded, massAdded);
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H
index 37e590924558d2f5e1bca629ebee9606ab4e6cf1..64e085edcc766551e98d08dee0bcf9d8837d03a7 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/InjectionModel/InjectionModel.H
@@ -134,6 +134,10 @@ protected:
             //- Time at start of injection time step [s]
             scalar timeStep0_;
 
+            //- Volume that should have been injected, but would lead to
+            //  less than 1 particle per parcel
+            scalar delayedVolume_;
+
 
     // Protected Member Functions
 
diff --git a/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.C b/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.C
index 65143f5d27db6a8d30eafa25fbfdab3d2749d3ed..d20552f36832c9703baa333fbd5bb4f092dddced 100644
--- a/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.C
+++ b/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.C
@@ -110,6 +110,7 @@ void reactingOneDim::updateQr()
     const volScalarField kappaRad_(kappaRad());
 
     // Propagate Qr through 1-D regions
+    label totalFaceId = 0;
     forAll(intCoupledPatchIDs_, i)
     {
         const label patchI = intCoupledPatchIDs_[i];
@@ -121,7 +122,7 @@ void reactingOneDim::updateQr()
         {
             const scalar Qr0 = Qrp[faceI];
             point Cf0 = Cf[faceI];
-            const labelList& cells = boundaryFaceCells_[faceI];
+            const labelList& cells = boundaryFaceCells_[totalFaceId];
             scalar kappaInt = 0.0;
             forAll(cells, k)
             {
@@ -132,6 +133,7 @@ void reactingOneDim::updateQr()
                 Qr_[cellI] = Qr0*exp(-kappaInt);
                 Cf0 = Cf1;
             }
+            totalFaceId ++;
         }
     }
 
@@ -156,6 +158,7 @@ void reactingOneDim::updatePhiGas()
         const volScalarField& HsiGas = tHsiGas();
         const volScalarField& RRiGas = tRRiGas();
 
+        label totalFaceId = 0;
         forAll(intCoupledPatchIDs_, i)
         {
             const label patchI = intCoupledPatchIDs_[i];
@@ -164,7 +167,7 @@ void reactingOneDim::updatePhiGas()
 
             forAll(phiGasp, faceI)
             {
-                const labelList& cells = boundaryFaceCells_[faceI];
+                const labelList& cells = boundaryFaceCells_[totalFaceId];
                 scalar massInt = 0.0;
                 forAllReverse(cells, k)
                 {
@@ -184,6 +187,7 @@ void reactingOneDim::updatePhiGas()
                         << " is : " << massInt
                         << " [kg/s] " << endl;
                 }
+                totalFaceId ++;
             }
         }
         tHsiGas().clear();
@@ -232,12 +236,22 @@ void reactingOneDim::solveContinuity()
         Info<< "reactingOneDim::solveContinuity()" << endl;
     }
 
-    solve
-    (
-        fvm::ddt(rho_)
-     ==
-      - solidChemistry_->RRg()
-    );
+    if (moveMesh_)
+    {
+        const scalarField mass0 = rho_*regionMesh().V();
+
+        fvScalarMatrix rhoEqn
+        (
+            fvm::ddt(rho_)
+         ==
+          - solidChemistry_->RRg()
+        );
+
+        rhoEqn.solve();
+
+        updateMesh(mass0);
+
+    }
 }
 
 
@@ -261,14 +275,15 @@ void reactingOneDim::solveSpeciesMass()
             solidChemistry_->RRs(i)
         );
 
-        if (moveMesh_)
+        if (regionMesh().moving())
         {
-            surfaceScalarField phiRhoMesh
+            surfaceScalarField phiYiRhoMesh
             (
                 fvc::interpolate(Yi*rho_)*regionMesh().phi()
             );
 
-            YiEqn -= fvc::div(phiRhoMesh);
+            YiEqn += fvc::div(phiYiRhoMesh);
+
         }
 
         YiEqn.solve(regionMesh().solver("Yi"));
@@ -303,14 +318,14 @@ void reactingOneDim::solveEnergy()
       + fvc::div(phiGas)
     );
 
-    if (moveMesh_)
+    if (regionMesh().moving())
     {
-        surfaceScalarField phiMesh
+        surfaceScalarField phihMesh
         (
             fvc::interpolate(rho_*h_)*regionMesh().phi()
         );
 
-        hEqn -= fvc::div(phiMesh);
+        hEqn += fvc::div(phihMesh);
     }
 
     hEqn.relax();
@@ -349,7 +364,18 @@ reactingOneDim::reactingOneDim(const word& modelType, const fvMesh& mesh)
     pyrolysisModel(modelType, mesh),
     solidChemistry_(solidChemistryModel::New(regionMesh())),
     solidThermo_(solidChemistry_->solid()),
-    rho_(solidThermo_.rho()),
+    rho_
+    (
+        IOobject
+        (
+            "rho",
+            regionMesh().time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::AUTO_WRITE
+        ),
+        solidThermo_.rho()
+    ),
     Ys_(solidThermo_.composition().Y()),
     h_(solidThermo_.he()),
     primaryRadFluxName_(coeffs().lookupOrDefault<word>("radFluxName", "Qr")),
@@ -449,7 +475,18 @@ reactingOneDim::reactingOneDim
     pyrolysisModel(modelType, mesh, dict),
     solidChemistry_(solidChemistryModel::New(regionMesh())),
     solidThermo_(solidChemistry_->solid()),
-    rho_(solidThermo_.rho()),
+    rho_
+    (
+        IOobject
+        (
+            "rho",
+            regionMesh().time().timeName(),
+            regionMesh(),
+            IOobject::NO_READ,
+            IOobject::AUTO_WRITE
+        ),
+        solidThermo_.rho()
+    ),
     Ys_(solidThermo_.composition().Y()),
     h_(solidThermo_.he()),
     primaryRadFluxName_(dict.lookupOrDefault<word>("radFluxName", "Qr")),
@@ -681,17 +718,15 @@ void reactingOneDim::evolveRegion()
 {
     Info<< "\nEvolving pyrolysis in region: " << regionMesh().name() << endl;
 
-    const scalarField mass0 = rho_*regionMesh().V();
-
     solidChemistry_->solve
     (
         time().value() - time().deltaTValue(),
         time().deltaTValue()
     );
 
-    solveContinuity();
+    calculateMassTransfer();
 
-    updateMesh(mass0);
+    solveContinuity();
 
     chemistrySh_ = solidChemistry_->Sh()();
 
@@ -704,9 +739,9 @@ void reactingOneDim::evolveRegion()
         solveEnergy();
     }
 
-    calculateMassTransfer();
-
     solidThermo_.correct();
+
+    rho_ = solidThermo_.rho();
 }
 
 
diff --git a/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.H b/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.H
index aa3d7baa9b6c8c9760cf32315e876fbb7829ec82..619c9c0e9aba245e105afd17199c3530db037762 100644
--- a/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.H
+++ b/src/regionModels/pyrolysisModels/reactingOneDim/reactingOneDim.H
@@ -84,14 +84,8 @@ protected:
 
         // Reference to solid thermo properties
 
-//             //- Absorption coefficient [1/m]
-//             const volScalarField& kappaRad_;
-//
-//             //- Thermal conductivity [W/m/K]
-//             const volScalarField& kappa_;
-
             //- Density [kg/m3]
-            volScalarField& rho_;
+            volScalarField rho_;
 
             //- List of solid components
             PtrList<volScalarField>& Ys_;
@@ -221,8 +215,8 @@ public:
 
             //- Fields
 
-                //- Return density [kg/m3]
-                virtual const volScalarField& rho() const;
+                //- Return const density [Kg/m3]
+                const volScalarField& rho() const;
 
                 //- Return const temperature [K]
                 virtual const volScalarField& T() const;
diff --git a/src/regionModels/regionModel/regionModel1D/regionModel1D.C b/src/regionModels/regionModel/regionModel1D/regionModel1D.C
index 372e19a3f35c3859ec70faef5b519aa96e5b202f..60243b55cdc032d6bea6d459f42d71d10ecca6cb 100644
--- a/src/regionModels/regionModel/regionModel1D/regionModel1D.C
+++ b/src/regionModels/regionModel/regionModel1D/regionModel1D.C
@@ -117,6 +117,8 @@ void Foam::regionModels::regionModel1D::initialise()
     }
 
     boundaryFaceOppositeFace_.setSize(localPyrolysisFaceI);
+    boundaryFaceFaces_.setSize(localPyrolysisFaceI);
+    boundaryFaceCells_.setSize(localPyrolysisFaceI);
 
     surfaceScalarField& nMagSf = nMagSfPtr_();
 
@@ -192,6 +194,7 @@ Foam::tmp<Foam::labelField> Foam::regionModels::regionModel1D::moveMesh
 
     const polyBoundaryMesh& bm = regionMesh().boundaryMesh();
 
+    label totalFaceId = 0;
     forAll(intCoupledPatchIDs_, localPatchI)
     {
         label patchI = intCoupledPatchIDs_[localPatchI];
@@ -200,8 +203,9 @@ Foam::tmp<Foam::labelField> Foam::regionModels::regionModel1D::moveMesh
 
         forAll(pp, patchFaceI)
         {
-            const labelList& faces = boundaryFaceFaces_[patchFaceI];
-            const labelList& cells = boundaryFaceCells_[patchFaceI];
+            const labelList& faces = boundaryFaceFaces_[totalFaceId];
+            const labelList& cells = boundaryFaceCells_[totalFaceId];
+
             const vector n = pp.faceNormals()[patchFaceI];
             const vector sf = pp.faceAreas()[patchFaceI];
 
@@ -231,7 +235,7 @@ Foam::tmp<Foam::labelField> Foam::regionModels::regionModel1D::moveMesh
 
                     if
                     (
-                        ((nbrCf - (oldPoints[pointI] + newDelta)) & n)
+                        mag((nbrCf - (oldPoints[pointI] + newDelta)) & n)
                       > minDelta
                     )
                     {
@@ -242,19 +246,17 @@ Foam::tmp<Foam::labelField> Foam::regionModels::regionModel1D::moveMesh
                 }
                 nbrCf = oldCf[i + 1] + localDelta;
             }
-
             // Modify boundary
-            const label bFaceI = boundaryFaceOppositeFace_[patchFaceI];
+            const label bFaceI = boundaryFaceOppositeFace_[totalFaceId];
             const face f = regionMesh().faces()[bFaceI];
             const label cellI = cells[cells.size() - 1];
             newDelta += (deltaV[cellI]/mag(sf))*n;
             forAll(f, pti)
             {
                 const label pointI = f[pti];
-
                 if
                 (
-                    ((nbrCf - (oldPoints[pointI] + newDelta)) & n)
+                    mag((nbrCf - (oldPoints[pointI] + newDelta)) & n)
                   > minDelta
                 )
                 {
@@ -262,9 +264,9 @@ Foam::tmp<Foam::labelField> Foam::regionModels::regionModel1D::moveMesh
                     cellMoveMap[cellI] = 1;
                 }
             }
+            totalFaceId ++;
         }
     }
-
     // Move points
     regionMesh().movePoints(newPoints);
 
diff --git a/src/sampling/sampledSurface/sampledPatch/sampledPatch.C b/src/sampling/sampledSurface/sampledPatch/sampledPatch.C
index 1f8eaf9e1b699e2e2a4b925169ec87f8578b95be..da2d90c9faebd7acee8f6d0f6e4a2c975c809706 100644
--- a/src/sampling/sampledSurface/sampledPatch/sampledPatch.C
+++ b/src/sampling/sampledSurface/sampledPatch/sampledPatch.C
@@ -28,6 +28,7 @@ License
 #include "polyMesh.H"
 #include "polyPatch.H"
 #include "volFields.H"
+#include "surfaceFields.H"
 
 #include "addToRunTimeSelectionTable.H"
 
@@ -274,6 +275,49 @@ Foam::tmp<Foam::tensorField> Foam::sampledPatch::sample
 }
 
 
+Foam::tmp<Foam::scalarField> Foam::sampledPatch::sample
+(
+    const surfaceScalarField& sField
+) const
+{
+    return sampleField(sField);
+}
+
+
+Foam::tmp<Foam::vectorField> Foam::sampledPatch::sample
+(
+    const surfaceVectorField& sField
+) const
+{
+    return sampleField(sField);
+}
+
+Foam::tmp<Foam::sphericalTensorField> Foam::sampledPatch::sample
+(
+    const surfaceSphericalTensorField& sField
+) const
+{
+    return sampleField(sField);
+}
+
+
+Foam::tmp<Foam::symmTensorField> Foam::sampledPatch::sample
+(
+    const surfaceSymmTensorField& sField
+) const
+{
+    return sampleField(sField);
+}
+
+
+Foam::tmp<Foam::tensorField> Foam::sampledPatch::sample
+(
+    const surfaceTensorField& sField
+) const
+{
+    return sampleField(sField);
+}
+
 Foam::tmp<Foam::scalarField> Foam::sampledPatch::interpolate
 (
     const interpolation<scalar>& interpolator
diff --git a/src/sampling/sampledSurface/sampledPatch/sampledPatch.H b/src/sampling/sampledSurface/sampledPatch/sampledPatch.H
index 36590a747a74e0ec6aca912fcbed2414e6c5fef7..0ec8dbd89fbc77a206ff22c0833d01fc6f382f23 100644
--- a/src/sampling/sampledSurface/sampledPatch/sampledPatch.H
+++ b/src/sampling/sampledSurface/sampledPatch/sampledPatch.H
@@ -87,6 +87,13 @@ class sampledPatch
             const GeometricField<Type, fvPatchField, volMesh>& vField
         ) const;
 
+        //- sample surface field on faces
+        template <class Type>
+        tmp<Field<Type> > sampleField
+        (
+            const GeometricField<Type, fvsPatchField, surfaceMesh>& sField
+        ) const;
+
         template <class Type>
         tmp<Field<Type> >
         interpolateField(const interpolation<Type>&) const;
@@ -203,6 +210,35 @@ public:
             const volTensorField&
         ) const;
 
+        //- Surface sample field on surface
+        virtual tmp<scalarField> sample
+        (
+            const surfaceScalarField&
+        ) const;
+
+        //- Surface Sample field on surface
+        virtual tmp<vectorField> sample
+        (
+            const surfaceVectorField&
+        ) const;
+
+        //- Surface sample field on surface
+        virtual tmp<sphericalTensorField> sample
+        (
+            const surfaceSphericalTensorField&
+        ) const;
+
+        //- Surface sample field on surface
+        virtual tmp<symmTensorField> sample
+        (
+            const surfaceSymmTensorField&
+        ) const;
+
+        //- Surface sample field on surface
+        virtual tmp<tensorField> sample
+        (
+            const surfaceTensorField&
+        ) const;
 
         //- interpolate field on surface
         virtual tmp<scalarField> interpolate
diff --git a/src/sampling/sampledSurface/sampledPatch/sampledPatchTemplates.C b/src/sampling/sampledSurface/sampledPatch/sampledPatchTemplates.C
index 47b31e97c2012367f51d189cd8cd9848b9ada957..8725f412bea741fd2dbc4252736f50560b1acfff 100644
--- a/src/sampling/sampledSurface/sampledPatch/sampledPatchTemplates.C
+++ b/src/sampling/sampledSurface/sampledPatch/sampledPatchTemplates.C
@@ -48,6 +48,27 @@ Foam::sampledPatch::sampleField
 }
 
 
+template <class Type>
+Foam::tmp<Foam::Field<Type> >
+Foam::sampledPatch::sampleField
+(
+    const GeometricField<Type, fvsPatchField, surfaceMesh>& sField
+) const
+{
+    // One value per face
+    tmp<Field<Type> > tvalues(new Field<Type>(patchFaceLabels_.size()));
+    Field<Type>& values = tvalues();
+
+    forAll(patchFaceLabels_, i)
+    {
+        label patchI = patchIDs_[patchIndex_[i]];
+        values[i] = sField.boundaryField()[patchI][patchFaceLabels_[i]];
+    }
+
+    return tvalues;
+}
+
+
 template <class Type>
 Foam::tmp<Foam::Field<Type> >
 Foam::sampledPatch::interpolateField
diff --git a/src/sampling/sampledSurface/sampledSurface/sampledSurface.C b/src/sampling/sampledSurface/sampledSurface/sampledSurface.C
index 5c7c5abb90c50b43d7c66f60adff1d1f7acd323a..aaca4f087c8b4c2690b5d98af62aea43568a9703 100644
--- a/src/sampling/sampledSurface/sampledSurface/sampledSurface.C
+++ b/src/sampling/sampledSurface/sampledSurface/sampledSurface.C
@@ -240,6 +240,55 @@ Foam::scalar Foam::sampledSurface::area() const
 }
 
 
+Foam::tmp<Foam::scalarField> Foam::sampledSurface::sample
+(
+    const surfaceScalarField& sField
+) const
+{
+    notImplemented("tmp<Foam::scalarField> sampledSurface::sample");
+    return tmp<scalarField>(NULL);
+}
+
+
+Foam::tmp<Foam::vectorField> Foam::sampledSurface::sample
+(
+    const surfaceVectorField& sField
+) const
+{
+    notImplemented("tmp<Foam::vectorField> sampledSurface::sample");
+    return tmp<vectorField>(NULL);
+}
+
+Foam::tmp<Foam::sphericalTensorField> Foam::sampledSurface::sample
+(
+    const surfaceSphericalTensorField& sField
+) const
+{
+    notImplemented("tmp<Foam::sphericalTensorField> sampledSurface::sample");
+    return tmp<sphericalTensorField>(NULL);
+}
+
+
+Foam::tmp<Foam::symmTensorField> Foam::sampledSurface::sample
+(
+    const surfaceSymmTensorField& sField
+) const
+{
+    notImplemented("tmp<Foam::symmTensorField> sampledSurface::sample");
+    return tmp<symmTensorField>(NULL);
+}
+
+
+Foam::tmp<Foam::tensorField> Foam::sampledSurface::sample
+(
+    const surfaceTensorField& sField
+) const
+{
+    notImplemented("tmp<Foam::tensorField> sampledSurface::sample");
+    return tmp<tensorField>(NULL);
+}
+
+
 Foam::tmp<Foam::Field<Foam::scalar> >
 Foam::sampledSurface::project(const Field<scalar>& field) const
 {
diff --git a/src/sampling/sampledSurface/sampledSurface/sampledSurface.H b/src/sampling/sampledSurface/sampledSurface/sampledSurface.H
index 8a2bfa9fed3a825a1cca460591871d45aa2cca10..2659af8f51799584f0ae2e7b758cc0660744f265 100644
--- a/src/sampling/sampledSurface/sampledSurface/sampledSurface.H
+++ b/src/sampling/sampledSurface/sampledSurface/sampledSurface.H
@@ -60,6 +60,8 @@ SourceFiles
 #include "runTimeSelectionTables.H"
 #include "autoPtr.H"
 #include "volFieldsFwd.H"
+#include "surfaceFieldsFwd.H"
+#include "surfaceMesh.H"
 #include "polyMesh.H"
 #include "coordinateSystems.H"
 #include "interpolation.H"
@@ -355,6 +357,35 @@ public:
             const volTensorField&
         ) const = 0;
 
+        //- Surface sample field on surface
+        virtual tmp<scalarField> sample
+        (
+            const surfaceScalarField&
+        ) const;
+
+        //- Surface Sample field on surface
+        virtual tmp<vectorField> sample
+        (
+            const surfaceVectorField&
+        ) const;
+
+        //- Surface sample field on surface
+        virtual tmp<sphericalTensorField> sample
+        (
+            const surfaceSphericalTensorField&
+        ) const;
+
+        //- Surface sample field on surface
+        virtual tmp<symmTensorField> sample
+        (
+            const surfaceSymmTensorField&
+        ) const;
+
+        //- Surface sample field on surface
+        virtual tmp<tensorField> sample
+        (
+            const surfaceTensorField&
+        ) const;
 
         //- Interpolate field on surface
         virtual tmp<scalarField> interpolate
diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C
index a8dfaebdfcf67f3fe59e09c44d98c9733b5ca657..778d33871ce6b38438605d4a7fb3aa6faff4ca7d 100644
--- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C
+++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.C
@@ -95,12 +95,7 @@ Foam::sampledSurfaces::sampledSurfaces
     fieldSelection_(),
     interpolationScheme_(word::null),
     mergeList_(),
-    formatter_(NULL),
-    scalarFields_(),
-    vectorFields_(),
-    sphericalTensorFields_(),
-    symmTensorFields_(),
-    tensorFields_()
+    formatter_(NULL)
 {
     if (Pstream::parRun())
     {
@@ -154,13 +149,6 @@ void Foam::sampledSurfaces::write()
         {
             if (debug)
             {
-                Pout<< "timeName = " << mesh_.time().timeName() << nl
-                    << "scalarFields    " << scalarFields_ << nl
-                    << "vectorFields    " << vectorFields_ << nl
-                    << "sphTensorFields " << sphericalTensorFields_ << nl
-                    << "symTensorFields " << symmTensorFields_ <<nl
-                    << "tensorFields    " << tensorFields_ <<nl;
-
                 Pout<< "Creating directory "
                     << outputPath_/mesh_.time().timeName() << nl << endl;
 
@@ -176,11 +164,19 @@ void Foam::sampledSurfaces::write()
             writeGeometry();
         }
 
-        sampleAndWrite(scalarFields_);
-        sampleAndWrite(vectorFields_);
-        sampleAndWrite(sphericalTensorFields_);
-        sampleAndWrite(symmTensorFields_);
-        sampleAndWrite(tensorFields_);
+        const IOobjectList objects(mesh_, mesh_.time().timeName());
+
+        sampleAndWrite<volScalarField>(objects);
+        sampleAndWrite<volVectorField>(objects);
+        sampleAndWrite<volSphericalTensorField>(objects);
+        sampleAndWrite<volSymmTensorField>(objects);
+        sampleAndWrite<volTensorField>(objects);
+
+        sampleAndWrite<surfaceScalarField>(objects);
+        sampleAndWrite<surfaceVectorField>(objects);
+        sampleAndWrite<surfaceSphericalTensorField>(objects);
+        sampleAndWrite<surfaceSymmTensorField>(objects);
+        sampleAndWrite<surfaceTensorField>(objects);
     }
 }
 
@@ -192,7 +188,6 @@ void Foam::sampledSurfaces::read(const dictionary& dict)
     if (surfacesFound)
     {
         dict.lookup("fields") >> fieldSelection_;
-        clearFieldGroups();
 
         dict.lookup("interpolationScheme") >> interpolationScheme_;
         const word writeType(dict.lookup("surfaceFormat"));
diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H
index 0904c92ef0d835bce30ead29c2a9beeff08abd6d..ebff3bd94d8249db3fc4063dc4dc789953aea7e3 100644
--- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H
+++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfaces.H
@@ -40,7 +40,9 @@ SourceFiles
 #include "sampledSurface.H"
 #include "surfaceWriter.H"
 #include "volFieldsFwd.H"
+#include "surfaceFieldsFwd.H"
 #include "wordReList.H"
+#include "IOobjectList.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -60,21 +62,6 @@ class sampledSurfaces
 {
     // Private classes
 
-        //- Class used for grouping field types
-        template<class Type>
-        class fieldGroup
-        :
-            public DynamicList<word>
-        {
-        public:
-
-            //- Construct null
-            fieldGroup()
-            :
-                DynamicList<word>(0)
-            {}
-        };
-
 
         //- Class used for surface merging information
         class mergeInfo
@@ -137,35 +124,43 @@ class sampledSurfaces
             //- Surface formatter
             autoPtr<surfaceWriter> formatter_;
 
-            //- Categorized scalar/vector/tensor fields
-            fieldGroup<scalar> scalarFields_;
-            fieldGroup<vector> vectorFields_;
-            fieldGroup<sphericalTensor> sphericalTensorFields_;
-            fieldGroup<symmTensor> symmTensorFields_;
-            fieldGroup<tensor> tensorFields_;
-
 
     // Private Member Functions
 
-        //- Clear old field groups
-        void clearFieldGroups();
 
-        //- Append fieldName to the appropriate group
-        label appendFieldGroup(const word& fieldName, const word& fieldType);
-
-        //- Classify field types, returns the number of fields
+        //- Return number of fields
         label classifyFields();
 
         //- Write geometry only
         void writeGeometry() const;
 
+        //- Write sampled fieldName on surface and on outputDir path
+        template<class Type>
+        void writeSurface
+        (
+            const Field<Type>& values,
+            const label surfI,
+            const word& fieldName,
+            const fileName& outputDir
+        );
+
         //- Sample and write a particular volume field
         template<class Type>
-        void sampleAndWrite(const GeometricField<Type, fvPatchField, volMesh>&);
+        void sampleAndWrite
+        (
+            const GeometricField<Type, fvPatchField, volMesh>&
+        );
+
+        //- Sample and write a particular surface field
+        template<class Type>
+        void sampleAndWrite
+        (
+            const GeometricField<Type, fvsPatchField, surfaceMesh>&
+        );
 
         //- Sample and write all the fields of the given type
         template<class Type>
-        void sampleAndWrite(fieldGroup<Type>&);
+        void sampleAndWrite(const IOobjectList& allObjects);
 
         //- Disallow default bitwise copy construct and assignment
         sampledSurfaces(const sampledSurfaces&);
diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesGrouping.C b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesGrouping.C
index 0dda16b18011c93f400f8e7aabc2e3ee4113448e..6e67008de342e6cdd3cfaa3556e0b965e15095e5 100644
--- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesGrouping.C
+++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesGrouping.C
@@ -30,94 +30,22 @@ License
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-void Foam::sampledSurfaces::clearFieldGroups()
-{
-    scalarFields_.clear();
-    vectorFields_.clear();
-    sphericalTensorFields_.clear();
-    symmTensorFields_.clear();
-    tensorFields_.clear();
-}
-
-
-Foam::label Foam::sampledSurfaces::appendFieldGroup
-(
-    const word& fieldName,
-    const word& fieldType
-)
-{
-    if (fieldType == volScalarField::typeName)
-    {
-        scalarFields_.append(fieldName);
-        return 1;
-    }
-    else if (fieldType == volVectorField::typeName)
-    {
-        vectorFields_.append(fieldName);
-        return 1;
-    }
-    else if (fieldType == volSphericalTensorField::typeName)
-    {
-        sphericalTensorFields_.append(fieldName);
-        return 1;
-    }
-    else if (fieldType == volSymmTensorField::typeName)
-    {
-        symmTensorFields_.append(fieldName);
-        return 1;
-    }
-    else if (fieldType == volTensorField::typeName)
-    {
-        tensorFields_.append(fieldName);
-        return 1;
-    }
-
-    return 0;
-}
-
-
 Foam::label Foam::sampledSurfaces::classifyFields()
 {
-    label nFields = 0;
-    clearFieldGroups();
-
-    // check files for a particular time
+     // check files for a particular time
     if (loadFromFiles_)
     {
         IOobjectList objects(mesh_, mesh_.time().timeName());
         wordList allFields = objects.sortedNames();
-
         labelList indices = findStrings(fieldSelection_, allFields);
-
-        forAll(indices, fieldI)
-        {
-            const word& fieldName = allFields[indices[fieldI]];
-
-            nFields += appendFieldGroup
-            (
-                fieldName,
-                objects.find(fieldName)()->headerClassName()
-            );
-        }
+        return indices.size();
     }
     else
     {
         wordList allFields = mesh_.sortedNames();
         labelList indices = findStrings(fieldSelection_, allFields);
-
-        forAll(indices, fieldI)
-        {
-            const word& fieldName = allFields[indices[fieldI]];
-
-            nFields += appendFieldGroup
-            (
-                fieldName,
-                mesh_.find(fieldName)()->type()
-            );
-        }
+        return indices.size();
     }
-
-    return nFields;
 }
 
 
diff --git a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesTemplates.C b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesTemplates.C
index 78d7808d7af2cd09c5d80ddae203420eaa4a55e6..a56fcadf79df5a5065ef9484892f0e265ba18755 100644
--- a/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesTemplates.C
+++ b/src/sampling/sampledSurface/sampledSurfaces/sampledSurfacesTemplates.C
@@ -25,10 +25,86 @@ License
 
 #include "sampledSurfaces.H"
 #include "volFields.H"
+#include "surfaceFields.H"
 #include "ListListOps.H"
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
+template<class Type>
+void Foam::sampledSurfaces::writeSurface
+(
+    const Field<Type>& values,
+    const label surfI,
+    const word& fieldName,
+    const fileName& outputDir
+)
+{
+    const sampledSurface& s = operator[](surfI);
+
+    if (Pstream::parRun())
+    {
+        // Collect values from all processors
+        List<Field<Type> > gatheredValues(Pstream::nProcs());
+        gatheredValues[Pstream::myProcNo()] = values;
+        Pstream::gatherList(gatheredValues);
+
+        if (Pstream::master())
+        {
+            // Combine values into single field
+            Field<Type> allValues
+            (
+                ListListOps::combine<Field<Type> >
+                (
+                    gatheredValues,
+                    accessOp<Field<Type> >()
+                )
+            );
+
+            // Renumber (point data) to correspond to merged points
+            if (mergeList_[surfI].pointsMap.size() == allValues.size())
+            {
+                inplaceReorder(mergeList_[surfI].pointsMap, allValues);
+                allValues.setSize(mergeList_[surfI].points.size());
+            }
+
+            // Write to time directory under outputPath_
+            // skip surface without faces (eg, a failed cut-plane)
+            if (mergeList_[surfI].faces.size())
+            {
+                formatter_->write
+                (
+                    outputDir,
+                    s.name(),
+                    mergeList_[surfI].points,
+                    mergeList_[surfI].faces,
+                    fieldName,
+                    allValues,
+                    s.interpolate()
+                );
+            }
+        }
+    }
+    else
+    {
+        // Write to time directory under outputPath_
+        // skip surface without faces (eg, a failed cut-plane)
+        if (s.faces().size())
+        {
+            formatter_->write
+            (
+                outputDir,
+                s.name(),
+                s.points(),
+                s.faces(),
+                fieldName,
+                values,
+                s.interpolate()
+            );
+        }
+    }
+}
+
+
 template<class Type>
 void Foam::sampledSurfaces::sampleAndWrite
 (
@@ -65,125 +141,64 @@ void Foam::sampledSurfaces::sampleAndWrite
             values = s.sample(vField);
         }
 
-        if (Pstream::parRun())
-        {
-            // Collect values from all processors
-            List<Field<Type> > gatheredValues(Pstream::nProcs());
-            gatheredValues[Pstream::myProcNo()] = values;
-            Pstream::gatherList(gatheredValues);
-
-            if (Pstream::master())
-            {
-                // Combine values into single field
-                Field<Type> allValues
-                (
-                    ListListOps::combine<Field<Type> >
-                    (
-                        gatheredValues,
-                        accessOp<Field<Type> >()
-                    )
-                );
-
-                // Renumber (point data) to correspond to merged points
-                if (mergeList_[surfI].pointsMap.size() == allValues.size())
-                {
-                    inplaceReorder(mergeList_[surfI].pointsMap, allValues);
-                    allValues.setSize(mergeList_[surfI].points.size());
-                }
-
-                // Write to time directory under outputPath_
-                // skip surface without faces (eg, a failed cut-plane)
-                if (mergeList_[surfI].faces.size())
-                {
-                    formatter_->write
-                    (
-                        outputDir,
-                        s.name(),
-                        mergeList_[surfI].points,
-                        mergeList_[surfI].faces,
-                        fieldName,
-                        allValues,
-                        s.interpolate()
-                    );
-                }
-            }
-        }
-        else
-        {
-            // Write to time directory under outputPath_
-            // skip surface without faces (eg, a failed cut-plane)
-            if (s.faces().size())
-            {
-                formatter_->write
-                (
-                    outputDir,
-                    s.name(),
-                    s.points(),
-                    s.faces(),
-                    fieldName,
-                    values,
-                    s.interpolate()
-                );
-            }
-        }
+        writeSurface<Type>(values, surfI, fieldName, outputDir);
     }
 }
 
 
+
 template<class Type>
 void Foam::sampledSurfaces::sampleAndWrite
 (
-    fieldGroup<Type>& fields
+    const GeometricField<Type, fvsPatchField, surfaceMesh>& sField
 )
 {
-    if (fields.size())
+    const word& fieldName   = sField.name();
+    const fileName outputDir = outputPath_/sField.time().timeName();
+
+    forAll(*this, surfI)
     {
-        forAll(fields, fieldI)
+        const sampledSurface& s = operator[](surfI);
+        Field<Type> values = s.sample(sField);
+        writeSurface<Type>(values, surfI, fieldName, outputDir);
+    }
+}
+
+
+template<class GeoField>
+void Foam::sampledSurfaces::sampleAndWrite(const IOobjectList& allObjects)
+{
+    IOobjectList fields = allObjects.lookupClass(GeoField::typeName);
+    forAllConstIter(IOobjectList, fields, fieldIter)
+    {
+        forAll (fieldSelection_, fieldI)
         {
-            if (Pstream::master() && verbose_)
+            const wordRe field = fieldSelection_[fieldI];
+            if (field.match(fieldIter()->name()))
             {
-                Pout<< "sampleAndWrite: " << fields[fieldI] << endl;
-            }
+                if (Pstream::master() && verbose_)
+                {
+                    Pout<< "sampleAndWrite: " << field << endl;
+                }
 
-            if (loadFromFiles_)
-            {
-                sampleAndWrite
-                (
-                    GeometricField<Type, fvPatchField, volMesh>
+                if (loadFromFiles_)
+                {
+                    fieldIter()->readOpt() = IOobject::MUST_READ;
+                    sampleAndWrite
                     (
-                        IOobject
+                        GeoField
                         (
-                            fields[fieldI],
-                            mesh_.time().timeName(),
-                            mesh_,
-                            IOobject::MUST_READ,
-                            IOobject::NO_WRITE,
-                            false
-                        ),
-                        mesh_
-                    )
-                );
-            }
-            else
-            {
-                objectRegistry::const_iterator iter =
-                    mesh_.find(fields[fieldI]);
-
-                if
-                (
-                    iter != objectRegistry::end()
-                 && iter()->type()
-                 == GeometricField<Type, fvPatchField, volMesh>::typeName
-                )
+                            *fieldIter(),
+                            mesh_
+                        )
+                    );
+                }
+                else
                 {
-                   sampleAndWrite
-                   (
-                       mesh_.lookupObject
-                       <GeometricField<Type, fvPatchField, volMesh> >
-                       (
-                           fields[fieldI]
-                       )
-                   );
+                    sampleAndWrite
+                    (
+                        mesh_.lookupObject<GeoField>(fieldIter()->name())
+                    );
                 }
             }
         }
diff --git a/src/thermophysicalModels/reactionThermo/mixtures/singleStepReactingMixture/singleStepReactingMixture.C b/src/thermophysicalModels/reactionThermo/mixtures/singleStepReactingMixture/singleStepReactingMixture.C
index 69e87fe518f7547767c7ca5c0ca591154a8215c4..e8cc1da8bc7d8fa76970f376688fccd8a4424464 100644
--- a/src/thermophysicalModels/reactionThermo/mixtures/singleStepReactingMixture/singleStepReactingMixture.C
+++ b/src/thermophysicalModels/reactionThermo/mixtures/singleStepReactingMixture/singleStepReactingMixture.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties
index 355d1e1b36de89705c6e4bbbc83442721970e108..30c31c7471bffc10fc8a57c75bc336190538f89d 100644
--- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties
+++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/combustionProperties
@@ -22,6 +22,7 @@ active true;
 infinitelyFastChemistryCoeffs
 {
     C       10;
+    semiImplicit    false;
 }
 
 // ************************************************************************* //
diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/pyrolysisZones b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/pyrolysisZones
index 6253de17410b3746318fb080b1d0c4421230796d..1895f851df5b662b8e39e0b663c4b2d2e358cba1 100644
--- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/pyrolysisZones
+++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/pyrolysisZones
@@ -31,9 +31,9 @@ FoamFile
 
             radFluxName     Qr;
 
-            minimumDelta    1e-8;
+            minimumDelta    1e-12;
 
-            reactionDeltaMin 1e-8;
+            reactionDeltaMin 1e-12;
 
             moveMesh        false;
         }
diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/radiationProperties b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/radiationProperties
index ca98125036afe50f9646de87cbc321e80a75deea..df24e86f8dbf7d4d87a52a5ff8acc82de4f364c7 100644
--- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/radiationProperties
+++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/radiationProperties
@@ -33,7 +33,7 @@ fvDOMCoeffs
     nPhi    3;          // azimuthal angles in PI/2 on X-Y.(from Y to X)
     nTheta  6;          // polar angles in PI (from Z to X-Y plane)
     convergence 1e-4;   // convergence criteria for radiation iteration
-    maxIter 4;         // maximum number of iterations
+    maxIter 2;         // maximum number of iterations
 }
 
 // Number of flow iterations per radiation iteration
diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/controlDict b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/controlDict
index 53c9826a9b9a59f5db2a3767088a8fb4ab919271..fb425995789bf14d15d5f89335a0ef39ec0064b9 100644
--- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/controlDict
+++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/controlDict
@@ -16,25 +16,25 @@ FoamFile
 
 application     fireFoam;
 
-startFrom       startTime;
+startFrom       latestTime;
 
 startTime       0;
 
 stopAt          endTime;
 
-endTime         15.0;
+endTime         15;
 
 deltaT          0.03;
 
 writeControl    adjustableRunTime;
 
-writeInterval   0.5;
+writeInterval   1
 
 purgeWrite      0;
 
 writeFormat     ascii;
 
-writePrecision  6;
+writePrecision  12;
 
 writeCompression off;
 
diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/fvSchemes b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/fvSchemes
index 9911bbedb397a9e40e00dbbe8fa96884a514623c..e683569e7a4ff14a8dce39837c09a946d0f1cecb 100644
--- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/fvSchemes
+++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/fvSchemes
@@ -70,6 +70,7 @@ fluxRequired
 {
     default         no;
     p_rgh;
+    phiMesh;
 }
 
 
diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/panelRegion/fvSolution b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/panelRegion/fvSolution
index e1d5b8db0b76425916fc4dad9c44280d248054df..f485444f2e70136dd27b16cfc4aac18533fedcea 100644
--- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/panelRegion/fvSolution
+++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/system/panelRegion/fvSolution
@@ -32,7 +32,7 @@ solvers
         relTol          0;
     }
 
-    rhoThermo
+    rho
     {
         solver          PCG;
         preconditioner  DIC;
diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSchemes b/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSchemes
index 97a9f76e7207e61f25a0f31040f6de780edd5b24..e82354947c664a7c1ee03dcde3eccf8d04635878 100644
--- a/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSchemes
+++ b/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSchemes
@@ -30,7 +30,7 @@ divSchemes
     default        none;
     div(phi,U)      Gauss linear;
     div(phi,K)      Gauss linear;
-    div(phi,k)      Gauss limitedLinear 0.1;
+    div(phi,k)      Gauss limitedLinear 1;
     div(phi,Yi_h) Gauss multivariateSelection
     {
         O2              limitedLinear01 1;
diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSolution b/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSolution
index 6c64887a86f47a10289f4a9f6cac1af1be49fe08..829f7a4a7ac112b1bd25f30ef358e2dba5b6542a 100644
--- a/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSolution
+++ b/tutorials/combustion/fireFoam/les/smallPoolFire3D/system/fvSolution
@@ -29,7 +29,7 @@ solvers
     {
         solver              GAMG;
         tolerance           1e-7;
-        relTol              0.01;
+        relTol              0.1;
         smoother            GaussSeidel;
         cacheAgglomeration  true;
         nCellsInCoarsestLevel   10;
@@ -88,7 +88,7 @@ PIMPLE
 {
     momentumPredictor yes;
     nOuterCorrectors  1;
-    nCorrectors       1;
+    nCorrectors       2;
     nNonOrthogonalCorrectors 0;
 }
 
@@ -100,7 +100,7 @@ relaxationFactors
     equations
     {
         "(U|k).*"                   1;
-        "(CH4|O2|H2O|CO2|h).*"    0.9;
+        "(CH4|O2|H2O|CO2|h).*"      1;
     }
 }
 
diff --git a/tutorials/compressible/rhoCentralFoam/forwardStep/0/Ma b/tutorials/compressible/rhoCentralFoam/forwardStep/0/Ma
deleted file mode 100644
index 061fe2b89964750c6e1964e4213be2c1cdf5825a..0000000000000000000000000000000000000000
--- a/tutorials/compressible/rhoCentralFoam/forwardStep/0/Ma
+++ /dev/null
@@ -1,264 +0,0 @@
-/*--------------------------------*- C++ -*----------------------------------*\
-| =========                 |                                                 |
-| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
-|  \\    /   O peration     | Version:  dev                                   |
-|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
-|    \\/     M anipulation  |                                                 |
-\*---------------------------------------------------------------------------*/
-FoamFile
-{
-    version     2.0;
-    format      ascii;
-    class       volScalarField;
-    object      Ma;
-}
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-dimensions      [0 0 0 0 0 0 0];
-
-internalField   uniform 3;
-
-boundaryField
-{
-    inlet
-    {
-        type            calculated;
-        value           uniform 3;
-    }
-    outlet
-    {
-        type            calculated;
-        value           uniform 3;
-    }
-    bottom
-    {
-        type            symmetryPlane;
-    }
-    top
-    {
-        type            symmetryPlane;
-    }
-    obstacle
-    {
-        type            calculated;
-        value           nonuniform List<scalar>
-208
-(
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-0
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-)
-;
-    }
-    defaultFaces
-    {
-        type            empty;
-    }
-}
-
-// ************************************************************************* //
diff --git a/tutorials/incompressible/simpleFoam/turbineSiting/constant/sourcesProperties b/tutorials/incompressible/simpleFoam/turbineSiting/constant/sourcesProperties
index a57b5a3b7b34398ead9e3db058e1b200e971a041..47ea4f097841f82e12de1f1ad869e49f15ec261e 100644
--- a/tutorials/incompressible/simpleFoam/turbineSiting/constant/sourcesProperties
+++ b/tutorials/incompressible/simpleFoam/turbineSiting/constant/sourcesProperties
@@ -27,7 +27,7 @@ disk1
     actuationDiskSourceCoeffs
     {
         fieldNames  (U);
-        diskDir     (-1 0 0);   // orientation of the disk
+        diskDir     (1 0 0);   // orientation of the disk
         Cp          0.386;      // Cp
         Ct          0.58;       // Ct
         diskArea    40;         // disk area
@@ -47,7 +47,7 @@ disk2
     actuationDiskSourceCoeffs
     {
         fieldNames  (U);
-        diskDir     (-1 0 0);
+        diskDir     (1 0 0);
         Cp          0.53;
         Ct          0.58;
         diskArea    40;
diff --git a/tutorials/incompressible/simpleFoam/turbineSiting/system/fvSolution b/tutorials/incompressible/simpleFoam/turbineSiting/system/fvSolution
index 2768f93c43803c5fc91b22517d41dae5221b8f55..0ddb5a5c7db5bb9464fa3bae0dc069451f02f089 100644
--- a/tutorials/incompressible/simpleFoam/turbineSiting/system/fvSolution
+++ b/tutorials/incompressible/simpleFoam/turbineSiting/system/fvSolution
@@ -64,9 +64,9 @@ SIMPLE
 
     residualControl
     {
-        p               1e-2;
-        U               1e-3;
-        "(k|epsilon)"   1e-3;
+        p               1e-3;
+        U               1e-4;
+        "(k|epsilon)"   1e-4;
     }
 }