diff --git a/src/finiteVolume/fields/fvPatchFields/derived/timeVaryingMappedFixedValue/timeVaryingMappedFixedValueFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/timeVaryingMappedFixedValue/timeVaryingMappedFixedValueFvPatchField.C
index 67b3513c31280b9821fb60e7383b312ea55addf8..4c352aca055bacf321b5ea7ef239ed0ca32682f9 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/timeVaryingMappedFixedValue/timeVaryingMappedFixedValueFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/timeVaryingMappedFixedValue/timeVaryingMappedFixedValueFvPatchField.C
@@ -29,8 +29,8 @@ License
 #include "triSurface.H"
 #include "vector2D.H"
 #include "OFstream.H"
-#include "long.H"
 #include "AverageIOField.H"
+#include "Random.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -50,6 +50,7 @@ timeVaryingMappedFixedValueFvPatchField
     fixedValueFvPatchField<Type>(p, iF),
     fieldTableName_(iF.name()),
     setAverage_(false),
+    perturb_(0),
     referenceCS_(NULL),
     nearestVertex_(0),
     nearestVertexWeight_(0),
@@ -76,6 +77,7 @@ timeVaryingMappedFixedValueFvPatchField
     fixedValueFvPatchField<Type>(ptf, p, iF, mapper),
     fieldTableName_(ptf.fieldTableName_),
     setAverage_(ptf.setAverage_),
+    perturb_(ptf.perturb_),
     referenceCS_(NULL),
     nearestVertex_(0),
     nearestVertexWeight_(0),
@@ -101,6 +103,7 @@ timeVaryingMappedFixedValueFvPatchField
     fixedValueFvPatchField<Type>(p, iF),
     fieldTableName_(iF.name()),
     setAverage_(readBool(dict.lookup("setAverage"))),
+    perturb_(dict.lookupOrDefault("perturb", 1E-5)),
     referenceCS_(NULL),
     nearestVertex_(0),
     nearestVertexWeight_(0),
@@ -135,6 +138,7 @@ timeVaryingMappedFixedValueFvPatchField
     fixedValueFvPatchField<Type>(ptf),
     fieldTableName_(ptf.fieldTableName_),
     setAverage_(ptf.setAverage_),
+    perturb_(ptf.perturb_),
     referenceCS_(ptf.referenceCS_),
     nearestVertex_(ptf.nearestVertex_),
     nearestVertexWeight_(ptf.nearestVertexWeight_),
@@ -160,6 +164,7 @@ timeVaryingMappedFixedValueFvPatchField
     fixedValueFvPatchField<Type>(ptf, iF),
     fieldTableName_(ptf.fieldTableName_),
     setAverage_(ptf.setAverage_),
+    perturb_(ptf.perturb_),
     referenceCS_(ptf.referenceCS_),
     nearestVertex_(ptf.nearestVertex_),
     nearestVertexWeight_(ptf.nearestVertexWeight_),
@@ -334,16 +339,24 @@ void timeVaryingMappedFixedValueFvPatchField<Type>::readSamplePoints()
     );
     vectorField& localVertices = tlocalVertices();
 
-    // Shear to avoid degenerate cases
+    const boundBox bb(localVertices, true);
+    const point bbMid(bb.midpoint());
+
+    if (debug)
+    {
+        Info<< "timeVaryingMappedFixedValueFvPatchField :"
+            << " Perturbing points with " << perturb_
+            << " fraction of a random position inside " << bb
+            << " to break any ties on regular meshes."
+            << nl << endl;
+    }
+
+    Random rndGen(123456);
     forAll(localVertices, i)
     {
-        point& pt = localVertices[i];
-        const scalar magPt = mag(pt);
-        const point nptDir = pt/magPt;
-        if (magPt > ROOTVSMALL)
-        {
-            pt += pow(magPt, 1.1 + Foam::sqrt(SMALL))*nptDir;
-        }
+        localVertices[i] +=
+            perturb_
+           *(rndGen.position(bb.min(), bb.max())-bbMid);
     }
 
     // Determine triangulation
@@ -354,6 +367,8 @@ void timeVaryingMappedFixedValueFvPatchField<Type>::readSamplePoints()
         localVertices2D[i][1] = localVertices[i][1];
     }
 
+    triSurface s(triSurfaceTools::delaunay2D(localVertices2D));
+
     tmp<pointField> tlocalFaceCentres
     (
         referenceCS().localPosition
@@ -361,40 +376,7 @@ void timeVaryingMappedFixedValueFvPatchField<Type>::readSamplePoints()
             this->patch().patch().faceCentres()
         )
     );
-
-    pointField& localFaceCentres = tlocalFaceCentres();
-
-    // Shear to avoid degenerate cases
-    forAll(localFaceCentres, i)
-    {
-        point& pt = localFaceCentres[i];
-        const scalar magPt = mag(pt);
-        const point nptDir = pt/magPt;
-        if (magPt > ROOTVSMALL)
-        {
-            pt += pow(magPt, 1.1 + Foam::sqrt(SMALL))*nptDir;
-        }
-    }
-
-    if (debug)
-    {
-        OFstream str
-        (
-            this->db().time().path()/this->patch().name()
-          + "_localFaceCentres.obj"
-        );
-        Pout<< "readSamplePoints :"
-            << " Dumping face centres to " << str.name() << endl;
-
-        forAll(localFaceCentres, i)
-        {
-            const point& p = localFaceCentres[i];
-            str<< "v " << p.x() << ' ' << p.y() << ' ' << p.z() << nl;
-        }
-    }
-
-
-    triSurface s(triSurfaceTools::delaunay2D(localVertices2D));
+    const pointField& localFaceCentres = tlocalFaceCentres();
 
     if (debug)
     {
@@ -786,6 +768,7 @@ void timeVaryingMappedFixedValueFvPatchField<Type>::write(Ostream& os) const
 {
     fvPatchField<Type>::write(os);
     os.writeKeyword("setAverage") << setAverage_ << token::END_STATEMENT << nl;
+    os.writeKeyword("peturb") << perturb_ << token::END_STATEMENT << nl;
 
     if (fieldTableName_ != this->dimensionedInternalField().name())
     {
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/timeVaryingMappedFixedValue/timeVaryingMappedFixedValueFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/timeVaryingMappedFixedValue/timeVaryingMappedFixedValueFvPatchField.H
index 1e0195bb4ec406e40bfdf2f19a76a4e6716dd240..40a2b8a1c09729d76af0f0ac9533b4510454573b 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/timeVaryingMappedFixedValue/timeVaryingMappedFixedValueFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/derived/timeVaryingMappedFixedValue/timeVaryingMappedFixedValueFvPatchField.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2004-2011 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -27,6 +27,36 @@ Class
 Description
     Foam::timeVaryingMappedFixedValueFvPatchField
 
+    Interpolates from a set of supplied points in space and time. Supplied
+    data in constant/boundaryData/<patchname>:
+        - points : pointField with locations
+        - ddd    : supplied values at time ddd
+    Points need to be more or less on a plane since get triangulated in 2D.
+
+    At startup this bc does the triangulation and determines linear
+    interpolation (triangle it is in and weights to the 3 vertices)
+    for every face centre. Interpolates linearly inbetween times.
+
+    @verbatim
+        inlet
+        {
+            type            timeVaryingMappedFixedValue;
+
+            // Maintain average to that of the supplied values
+            setAverage      false;
+
+            // Optional: change perturbation (default 1E-5) to avoid any ties
+            // in triangulating regular geometries.
+            //perturb       0.0;
+
+            // Optional: use name instead of patchname for location of data
+            //fieldTableName samples;
+        }
+    @endverbatim
+
+    Switch on debug flag to have it dump the triangulation (in transformed
+    space) and transform face centres.
+
 SourceFiles
     timeVaryingMappedFixedValueFvPatchField.C
 
@@ -62,6 +92,9 @@ class timeVaryingMappedFixedValueFvPatchField
         //- If true adjust the mapped field to maintain average value
         bool setAverage_;
 
+        //- Fraction of perturbation (fraction of bounding box) to add
+        scalar perturb_;
+
         //- Coordinate system
         autoPtr<coordinateSystem> referenceCS_;