diff --git a/src/OpenFOAM/db/Time/Time.C b/src/OpenFOAM/db/Time/Time.C
index 155c4c2eb48456ef366aa43b7de061321f16dca6..8619e2da91669622d1a06bba18bdc9415368e234 100644
--- a/src/OpenFOAM/db/Time/Time.C
+++ b/src/OpenFOAM/db/Time/Time.C
@@ -324,6 +324,7 @@ Foam::Time::Time
     secondaryWriteControl_(wcTimeStep),
     secondaryWriteInterval_(labelMax/10.0), // bit less to allow calculations
     purgeWrite_(0),
+    secondaryPurgeWrite_(0),
     writeOnce_(false),
     subCycling_(false),
     sigWriteNow_(true, *this),
@@ -416,6 +417,7 @@ Foam::Time::Time
     secondaryWriteControl_(wcTimeStep),
     secondaryWriteInterval_(labelMax/10.0),
     purgeWrite_(0),
+    secondaryPurgeWrite_(0),
     writeOnce_(false),
     subCycling_(false),
     sigWriteNow_(true, *this),
@@ -511,6 +513,7 @@ Foam::Time::Time
     secondaryWriteControl_(wcTimeStep),
     secondaryWriteInterval_(labelMax/10.0),
     purgeWrite_(0),
+    secondaryPurgeWrite_(0),
     writeOnce_(false),
     subCycling_(false),
     sigWriteNow_(true, *this),
@@ -608,6 +611,7 @@ Foam::Time::Time
     secondaryWriteControl_(wcTimeStep),
     secondaryWriteInterval_(labelMax/10.0),
     purgeWrite_(0),
+    secondaryPurgeWrite_(0),
     writeOnce_(false),
     subCycling_(false),
 
@@ -1070,11 +1074,13 @@ Foam::Time& Foam::Time::operator++()
 
 
         outputTime_ = false;
+        primaryOutputTime_ = false;
+        secondaryOutputTime_ = false;
 
         switch (writeControl_)
         {
             case wcTimeStep:
-                outputTime_ = !(timeIndex_ % label(writeInterval_));
+                primaryOutputTime_ = !(timeIndex_ % label(writeInterval_));
             break;
 
             case wcRunTime:
@@ -1088,7 +1094,7 @@ Foam::Time& Foam::Time::operator++()
 
                 if (outputIndex > outputTimeIndex_)
                 {
-                    outputTime_ = true;
+                    primaryOutputTime_ = true;
                     outputTimeIndex_ = outputIndex;
                 }
             }
@@ -1103,7 +1109,7 @@ Foam::Time& Foam::Time::operator++()
                 );
                 if (outputIndex > outputTimeIndex_)
                 {
-                    outputTime_ = true;
+                    primaryOutputTime_ = true;
                     outputTimeIndex_ = outputIndex;
                 }
             }
@@ -1118,7 +1124,7 @@ Foam::Time& Foam::Time::operator++()
                 );
                 if (outputIndex > outputTimeIndex_)
                 {
-                    outputTime_ = true;
+                    primaryOutputTime_ = true;
                     outputTimeIndex_ = outputIndex;
                 }
             }
@@ -1130,9 +1136,8 @@ Foam::Time& Foam::Time::operator++()
         switch (secondaryWriteControl_)
         {
             case wcTimeStep:
-                outputTime_ =
-                    outputTime_
-                || !(timeIndex_ % label(secondaryWriteInterval_));
+                secondaryOutputTime_ =
+                    !(timeIndex_ % label(secondaryWriteInterval_));
             break;
 
             case wcRunTime:
@@ -1146,7 +1151,7 @@ Foam::Time& Foam::Time::operator++()
 
                 if (outputIndex > secondaryOutputTimeIndex_)
                 {
-                    outputTime_ = true;
+                    secondaryOutputTime_ = true;
                     secondaryOutputTimeIndex_ = outputIndex;
                 }
             }
@@ -1161,7 +1166,7 @@ Foam::Time& Foam::Time::operator++()
                 );
                 if (outputIndex > secondaryOutputTimeIndex_)
                 {
-                    outputTime_ = true;
+                    secondaryOutputTime_ = true;
                     secondaryOutputTimeIndex_ = outputIndex;
                 }
             }
@@ -1176,7 +1181,7 @@ Foam::Time& Foam::Time::operator++()
                 );
                 if (outputIndex > secondaryOutputTimeIndex_)
                 {
-                    outputTime_ = true;
+                    secondaryOutputTime_ = true;
                     secondaryOutputTimeIndex_ = outputIndex;
                 }
             }
@@ -1184,6 +1189,9 @@ Foam::Time& Foam::Time::operator++()
         }
 
 
+        outputTime_ = primaryOutputTime_ || secondaryOutputTime_;
+
+
         // see if endTime needs adjustment to stop at the next run()/end() check
         if (!end())
         {
@@ -1195,6 +1203,7 @@ Foam::Time& Foam::Time::operator++()
             {
                 endTime_ = value();
                 outputTime_ = true;
+                primaryOutputTime_ = true;
             }
             else if (stopAt_ == saNextWrite && outputTime_ == true)
             {
@@ -1205,6 +1214,7 @@ Foam::Time& Foam::Time::operator++()
         // Override outputTime if one-shot writing
         if (writeOnce_)
         {
+            primaryOutputTime_ = true;
             outputTime_ = true;
             writeOnce_ = false;
         }
diff --git a/src/OpenFOAM/db/Time/Time.H b/src/OpenFOAM/db/Time/Time.H
index 26e6b21bc7bbeef91186169940c056d17dc68153..1e761cd73eaaff3d81b4a27d15c996d885bbd19c 100644
--- a/src/OpenFOAM/db/Time/Time.H
+++ b/src/OpenFOAM/db/Time/Time.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
@@ -138,10 +138,15 @@ protected:
 
             scalar secondaryWriteInterval_;
 
-
         label  purgeWrite_;
         mutable FIFOStack<word> previousOutputTimes_;
 
+        // Additional purging
+
+            label  secondaryPurgeWrite_;
+            mutable FIFOStack<word> previousSecondaryOutputTimes_;
+
+
         // One-shot writing
         bool writeOnce_;
 
diff --git a/src/OpenFOAM/db/Time/TimeIO.C b/src/OpenFOAM/db/Time/TimeIO.C
index 6a80618404ef323e9b9a2d1cfa79fed6fd1e75ae..1637d35bfcfe598fc4effec0f94f9b9798550059 100644
--- a/src/OpenFOAM/db/Time/TimeIO.C
+++ b/src/OpenFOAM/db/Time/TimeIO.C
@@ -160,6 +160,20 @@ void Foam::Time::readDict()
         }
     }
 
+    if (controlDict_.readIfPresent("secondaryPurgeWrite", secondaryPurgeWrite_))
+    {
+        if (secondaryPurgeWrite_ < 0)
+        {
+            WarningIn("Time::readDict()")
+                << "invalid value for secondaryPurgeWrite "
+                << secondaryPurgeWrite_
+                << ", should be >= 0, setting to 0"
+                << endl;
+
+            secondaryPurgeWrite_ = 0;
+        }
+    }
+
     if (controlDict_.found("timeFormat"))
     {
         const word formatName(controlDict_.lookup("timeFormat"));
@@ -347,13 +361,45 @@ bool Foam::Time::writeObject
         timeDict.regIOobject::writeObject(fmt, ver, cmp);
         bool writeOK = objectRegistry::writeObject(fmt, ver, cmp);
 
-        if (writeOK && purgeWrite_)
+        if (writeOK)
         {
-            previousOutputTimes_.push(tmName);
+            // Does primary or secondary time trigger purging?
+            // Note that primary times can only be purged by primary
+            // purging. Secondary times can be purged by either primary
+            // or secondary purging.
+            if (primaryOutputTime_ && purgeWrite_)
+            {
+                previousOutputTimes_.push(tmName);
 
-            while (previousOutputTimes_.size() > purgeWrite_)
+                while (previousOutputTimes_.size() > purgeWrite_)
+                {
+                    rmDir(objectRegistry::path(previousOutputTimes_.pop()));
+                }
+            }
+            if
+            (
+               !primaryOutputTime_
+             && secondaryOutputTime_
+             && secondaryPurgeWrite_
+            )
             {
-                rmDir(objectRegistry::path(previousOutputTimes_.pop()));
+                // Writing due to secondary
+                previousSecondaryOutputTimes_.push(tmName);
+
+                while
+                (
+                    previousSecondaryOutputTimes_.size()
+                  > secondaryPurgeWrite_
+                )
+                {
+                    rmDir
+                    (
+                        objectRegistry::path
+                        (
+                            previousSecondaryOutputTimes_.pop()
+                        )
+                    );
+                }
             }
         }
 
@@ -368,6 +414,7 @@ bool Foam::Time::writeObject
 
 bool Foam::Time::writeNow()
 {
+    primaryOutputTime_ = true;
     outputTime_ = true;
     return write();
 }
diff --git a/src/OpenFOAM/db/Time/TimeState.C b/src/OpenFOAM/db/Time/TimeState.C
index 500ca47d43ffb35c6d761886b1741dfd8dc6bf6e..f3e37401076380ceea06cc3220d24e25115f1a18 100644
--- a/src/OpenFOAM/db/Time/TimeState.C
+++ b/src/OpenFOAM/db/Time/TimeState.C
@@ -37,7 +37,9 @@ Foam::TimeState::TimeState()
     deltaT0_(0),
     deltaTchanged_(false),
     outputTimeIndex_(0),
+    primaryOutputTime_(false),
     secondaryOutputTimeIndex_(0),
+    secondaryOutputTime_(false),
     outputTime_(false)
 {}
 
diff --git a/src/OpenFOAM/db/Time/TimeState.H b/src/OpenFOAM/db/Time/TimeState.H
index d721529480ea79ce2de2b9f4cca74875ea11502b..b055d439f0f8389c8f4183d84e7259ef4040f2f1 100644
--- a/src/OpenFOAM/db/Time/TimeState.H
+++ b/src/OpenFOAM/db/Time/TimeState.H
@@ -61,8 +61,14 @@ protected:
         bool deltaTchanged_;
 
         label outputTimeIndex_;
+        //- Is outputTime because of primary?
+        bool primaryOutputTime_;
+
         label secondaryOutputTimeIndex_;
-        bool  outputTime_;
+        //- Is outputTime because of secondary?
+        bool secondaryOutputTime_;
+
+        bool outputTime_;
 
 public:
 
@@ -112,7 +118,7 @@ public:
 
         // Check
 
-            //- Return true if this is an output time
+            //- Return true if this is an output time (primary or secondary)
             bool outputTime() const;
 };