diff --git a/Source/SceneEntities/Objects/imstkCollisionDataDebugObject.cpp b/Source/SceneEntities/Objects/imstkCollisionDataDebugObject.cpp
index e4cde876812bc2458c2f3da9bd4e75d21ffff876..ecceca77b33abe541e7bd7597df8ec9cc5bab810 100644
--- a/Source/SceneEntities/Objects/imstkCollisionDataDebugObject.cpp
+++ b/Source/SceneEntities/Objects/imstkCollisionDataDebugObject.cpp
@@ -181,7 +181,11 @@ CollisionDataDebugObject::debugUpdate()
     }
 
     // Clear the debug object geometry
-    clear();
+    if (m_frameCounter >= m_clearRate)
+    {
+        clear();
+        m_frameCounter = 0;
+    }
 
     std::shared_ptr<PointSet> pointSetA = std::dynamic_pointer_cast<PointSet>(m_cdData->geomA);
     for (int i = 0; i < static_cast<int>(m_cdData->elementsA.size()); i++)
@@ -205,5 +209,17 @@ CollisionDataDebugObject::debugUpdate()
             printContactInfo(elem);
         }
     }
+
+    if (m_countEmptyFrames)
+    {
+        m_frameCounter++;
+    }
+    else
+    {
+        if ((m_cdData->elementsA.size() > 0 || m_cdData->elementsB.size() > 0))
+        {
+            m_frameCounter++;
+        }
+    }
 }
 }
\ No newline at end of file
diff --git a/Source/SceneEntities/Objects/imstkCollisionDataDebugObject.h b/Source/SceneEntities/Objects/imstkCollisionDataDebugObject.h
index ddb1def72a116234677090fcd29ab4d199d02388..4521efd440732d86081e1596b8f7da54913fd260 100644
--- a/Source/SceneEntities/Objects/imstkCollisionDataDebugObject.h
+++ b/Source/SceneEntities/Objects/imstkCollisionDataDebugObject.h
@@ -56,13 +56,44 @@ public:
     ///
     void debugUpdate();
 
+    ///
+    /// \brief Set/Get the input collision data for which geometry is generated for
+    ///
+    ///@{
     void setInputCD(std::shared_ptr<CollisionData> cdData) { m_cdData = cdData; }
     std::shared_ptr<CollisionData> getInputCD() const { return m_cdData; }
+    ///@}
 
+    ///
+    /// \brief Print collision contact data to stdout
+    ///
+    ///@{
     void setPrintContacts(const bool printContacts) { m_printContacts = printContacts; }
+    bool getPrintContacts() const { return m_printContacts; }
+    ///@}
+
+    ///
+    /// \brief Set the amount of simulation frames to cache data for, this is useful if you have
+    /// numerous simulation frames per render and data doesn't persist from one to the next
+    ///
+    ///@{
+    void setClearRate(const int clearRate) { m_clearRate = clearRate; }
+    int getClearRate() const { return m_clearRate; }
+    ///@}
+
+    ///
+    /// \brief If on, frames without collision data won't be counted for clear rate
+    ///
+    ///@{
+    void setCountEmptyFrames(const bool countEmptyFrames) { m_countEmptyFrames = countEmptyFrames; }
+    int getCountEmptyFrames() const { return m_countEmptyFrames; }
+///@}
 
 protected:
     std::shared_ptr<CollisionData> m_cdData = nullptr;
-    bool m_printContacts = false;
+    bool m_printContacts    = false;
+    int  m_clearRate        = 1;
+    int  m_frameCounter     = 0;
+    bool m_countEmptyFrames = true;
 };
 }
\ No newline at end of file