diff --git a/src/OpenFOAM/Make/files b/src/OpenFOAM/Make/files
index 29d6eee577..5d2dc3f178 100644
--- a/src/OpenFOAM/Make/files
+++ b/src/OpenFOAM/Make/files
@@ -284,6 +284,7 @@ $(Time)/Time.C
$(Time)/TimeIO.C
$(Time)/findTimes.C
$(Time)/subCycleTime.C
+$(Time)/subLoopTime.C
$(Time)/findInstance.C
$(Time)/timeSelector.C
diff --git a/src/OpenFOAM/db/Time/subLoopTime.C b/src/OpenFOAM/db/Time/subLoopTime.C
new file mode 100644
index 0000000000..5d6d8a8585
--- /dev/null
+++ b/src/OpenFOAM/db/Time/subLoopTime.C
@@ -0,0 +1,85 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
+ \\/ 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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "subLoopTime.H"
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::subLoopTime::subLoopTime(Time& runTime, const label nCycles)
+:
+ time_(runTime),
+ index_(0),
+ total_(nCycles)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::subLoopTime::~subLoopTime()
+{
+ stop();
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::subLoopTime::status() const
+{
+ return (index_ < total_);
+}
+
+
+void Foam::subLoopTime::stop()
+{
+ // If called manually, ensure status() will return false
+ index_ = total_ + 1;
+}
+
+
+bool Foam::subLoopTime::loop()
+{
+ const bool active = (index_ < total_); // as per status()
+
+ if (active)
+ {
+ operator++();
+ }
+ else if (index_)
+ {
+ // Not active, the loop condition has now exiting on the last subloop
+ }
+
+ return active;
+}
+
+
+Foam::subLoopTime& Foam::subLoopTime::operator++()
+{
+ ++index_;
+ return *this;
+}
+
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/db/Time/subLoopTime.H b/src/OpenFOAM/db/Time/subLoopTime.H
new file mode 100644
index 0000000000..c8deb680e8
--- /dev/null
+++ b/src/OpenFOAM/db/Time/subLoopTime.H
@@ -0,0 +1,137 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
+ \\/ 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 .
+
+Class
+ Foam::subLoopTime
+
+Description
+ A class for managing sub-loops referencing Time.
+
+SourceFiles
+ subLoopTime.C
+
+SeeAlso
+ subCycleTime
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef subLoopTime_H
+#define subLoopTime_H
+
+#include "Time.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ Class subLoopTime Declaration
+\*---------------------------------------------------------------------------*/
+
+class subLoopTime
+{
+ // Private Member Functions
+
+ //- Disallow default bitwise copy construct
+ subLoopTime(const subLoopTime&) = delete;
+
+ //- Disallow default bitwise assignment
+ void operator=(const subLoopTime&) = delete;
+
+
+protected:
+
+ // Protected data
+
+ Time& time_;
+
+ //- The current sub-cycle index
+ label index_;
+
+ //- The total number of cycles in the sub-cycle
+ label total_;
+
+
+public:
+
+ // Constructors
+
+ //- Construct from time with fixed number of cycles
+ // \param runTime the top-level time
+ // \param nCycles the number of times to loop
+ subLoopTime(Time& runTime, const label nCycles);
+
+
+ //- Destructor
+ ~subLoopTime();
+
+
+ // Member Functions
+
+ //- The current cycle index
+ inline label index() const
+ {
+ return index_;
+ }
+
+ //- The total number of cycles
+ inline label nCycles() const
+ {
+ return total_;
+ }
+
+ //- Return true if looping is active
+ bool status() const;
+
+ //- Force terminate the loop
+ void stop();
+
+ //- True if looping is active, increments the index.
+ // Example usage,
+ // \code
+ // while (control.loop())
+ // {
+ // solve;
+ // }
+ // \endcode
+ bool loop();
+
+
+ // Member Operators
+
+ //- Prefix increment
+ subLoopTime& operator++();
+
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //