diff --git a/src/finiteVolume/finiteVolume/gradSchemes/gradScheme/gradScheme.C b/src/finiteVolume/finiteVolume/gradSchemes/gradScheme/gradScheme.C
index c9fcdace2b53fb82f51a920aa0ceb54da12c8986..3b7549204492170a37944e56b38e7a99d6fbd309 100644
--- a/src/finiteVolume/finiteVolume/gradSchemes/gradScheme/gradScheme.C
+++ b/src/finiteVolume/finiteVolume/gradSchemes/gradScheme/gradScheme.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           |
+    \\  /    A nd           | Copyright (C) 2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -91,67 +91,49 @@ Foam::fv::gradScheme<Type>::grad
     typedef typename outerProduct<vector, Type>::type GradType;
     typedef GeometricField<GradType, fvPatchField, volMesh> GradFieldType;
 
-    if (!this->mesh().changing() && this->mesh().cache(name))
+    GradFieldType* pgGrad =
+        mesh().objectRegistry::template getObjectPtr<GradFieldType>(name);
+
+    if (!this->mesh().cache(name) || this->mesh().changing())
     {
-        if (!mesh().objectRegistry::template foundObject<GradFieldType>(name))
+        // Delete any old occurrences to avoid double registration
+        if (pgGrad && pgGrad->ownedByRegistry())
         {
-            solution::cachePrintMessage("Calculating and caching", name, vsf);
-            tmp<GradFieldType> tgGrad = calcGrad(vsf, name);
-            regIOobject::store(tgGrad.ptr());
+            solution::cachePrintMessage("Deleting", name, vsf);
+            pgGrad->release();
+            delete pgGrad;
         }
 
-        solution::cachePrintMessage("Retrieving", name, vsf);
-        GradFieldType& gGrad =
-            mesh().objectRegistry::template lookupObjectRef<GradFieldType>
-            (
-                name
-            );
-
-        if (gGrad.upToDate(vsf))
-        {
-            return gGrad;
-        }
-        else
-        {
-            solution::cachePrintMessage("Deleting", name, vsf);
-            gGrad.release();
-            delete &gGrad;
+        solution::cachePrintMessage("Calculating", name, vsf);
+        return calcGrad(vsf, name);
+    }
 
-            solution::cachePrintMessage("Recalculating", name, vsf);
-            tmp<GradFieldType> tgGrad = calcGrad(vsf, name);
 
-            solution::cachePrintMessage("Storing", name, vsf);
-            regIOobject::store(tgGrad.ptr());
-            GradFieldType& gGrad =
-                mesh().objectRegistry::template lookupObjectRef<GradFieldType>
-                (
-                    name
-                );
+    if (!pgGrad)
+    {
+        solution::cachePrintMessage("Calculating and caching", name, vsf);
 
-            return gGrad;
-        }
+        pgGrad = calcGrad(vsf, name).ptr();
+        regIOobject::store(pgGrad);
     }
     else
     {
-        if (mesh().objectRegistry::template foundObject<GradFieldType>(name))
+        if (pgGrad->upToDate(vsf))
         {
-            GradFieldType& gGrad =
-                mesh().objectRegistry::template lookupObjectRef<GradFieldType>
-                (
-                    name
-                );
-
-            if (gGrad.ownedByRegistry())
-            {
-                solution::cachePrintMessage("Deleting", name, vsf);
-                gGrad.release();
-                delete &gGrad;
-            }
+            solution::cachePrintMessage("Reusing", name, vsf);
         }
+        else
+        {
+            solution::cachePrintMessage("Updating", name, vsf);
+            pgGrad->release();
+            delete pgGrad;
 
-        solution::cachePrintMessage("Calculating", name, vsf);
-        return calcGrad(vsf, name);
+            pgGrad = calcGrad(vsf, name).ptr();
+            regIOobject::store(pgGrad);
+        }
     }
+
+    return *pgGrad;
 }