diff --git a/Source/Scene/imstkPbdObjectCuttingPair.cpp b/Source/Scene/imstkPbdObjectCuttingPair.cpp
index 62dd5f8431a536886bf3ca2c6a0f498c9f65d566..9475c1479c166294f4ca7ec91b46c56f37f0343a 100644
--- a/Source/Scene/imstkPbdObjectCuttingPair.cpp
+++ b/Source/Scene/imstkPbdObjectCuttingPair.cpp
@@ -30,6 +30,7 @@ limitations under the License.
 #include "imstkPbdSolver.h"
 #include "imstkSurfaceMesh.h"
 #include "imstkSurfaceMeshCut.h"
+#include "imstkVecDataArray.h"
 
 namespace imstk
 {
@@ -79,4 +80,109 @@ PbdObjectCuttingPair::apply()
     pbdModel->getSolver()->setInvMasses(pbdModel->getInvMasses());
     pbdModel->getSolver()->setPositions(pbdModel->getCurrentState()->getPositions());
 }
+
+void
+PbdObjectCuttingPair::addVertices(std::shared_ptr<SurfaceMesh> pbdMesh,
+                                  std::shared_ptr<VecDataArray<double, 3>> newVertices,
+                                  std::shared_ptr<VecDataArray<double, 3>> newInitialVertices)
+{
+    auto vertices = pbdMesh->getVertexPositions();
+    auto initialVertices = pbdMesh->getInitialVertexPositions();
+
+    auto nVertices    = vertices->size();
+    auto nNewVertices = newVertices->size();
+    if (nNewVertices != initialVertices->size())
+    {
+        LOG(WARNING) << "Number of new vertices does not match number of new initial vertices";
+        return;
+    }
+
+    vertices->reserve(nVertices + nNewVertices);
+    initialVertices->reserve(nVertices + nNewVertices);
+    for (int i = 0; i < nNewVertices; ++i)
+    {
+        vertices->push_back((*newVertices)[i]);
+        initialVertices->push_back((*newInitialVertices)[i]);
+    }
+    pbdMesh->modified();
+}
+
+void
+PbdObjectCuttingPair::modifyVertices(std::shared_ptr<SurfaceMesh> pbdMesh,
+                                     std::shared_ptr<std::vector<size_t>> modifiedVertexIndices,
+                                     std::shared_ptr<VecDataArray<double, 3>> modifiedVertices,
+                                     std::shared_ptr<VecDataArray<double, 3>> modifiedInitialVertices)
+{
+    auto vertices = pbdMesh->getVertexPositions();
+    auto initialVertices = pbdMesh->getInitialVertexPositions();
+
+    auto nVertices = vertices->size();
+    auto nModifiedVertices = modifiedVertices->size();
+    if (nVertices != initialVertices->size()
+        || nModifiedVertices != modifiedInitialVertices->size()
+        || nModifiedVertices != modifiedVertexIndices->size())
+    {
+        LOG(WARNING) << "Numbers of vertices do not match.";
+        return;
+    }
+
+    for (int i = 0; i < nModifiedVertices; ++i)
+    {
+        auto vertexIdx = modifiedVertexIndices->at(i);
+        (*vertices)[vertexIdx] = (*modifiedVertices)[i];
+        (*initialVertices)[vertexIdx] = (*modifiedInitialVertices)[i];
+        m_removeConstraintVertices->insert(vertexIdx);
+        m_addConstraintVertices->insert(vertexIdx);
+    }
+    pbdMesh->modified();
+}
+
+void
+PbdObjectCuttingPair::addTriangles(std::shared_ptr<SurfaceMesh> pbdMesh,
+                                   std::shared_ptr<VecDataArray<int, 3>> newTriangles)
+{
+    auto triangles     = pbdMesh->getTriangleIndices();
+    auto nTriangles    = triangles->size();
+    auto nNewTriangles = newTriangles->size();
+
+    triangles->reserve(nTriangles + nNewTriangles);
+    for (int i = 0; i < nNewTriangles; ++i)
+    {
+        auto& tri = (*newTriangles)[i];
+        triangles->push_back(tri);
+        m_addConstraintVertices->insert(tri[0]);
+        m_addConstraintVertices->insert(tri[1]);
+        m_addConstraintVertices->insert(tri[2]);
+    }
+    pbdMesh->modified();
+}
+
+void
+PbdObjectCuttingPair::modifyTriangles(std::shared_ptr<SurfaceMesh> pbdMesh,
+                                      std::shared_ptr<std::vector<size_t>> modifiedTriangleIndices,
+                                      std::shared_ptr<VecDataArray<int, 3>> modifiedTriangles)
+{
+    auto triangles  = pbdMesh->getTriangleIndices();
+    auto nTriangles = triangles->size();
+    auto nModifiedTriangles = modifiedTriangles->size();
+
+    if (nModifiedTriangles != modifiedTriangleIndices->size())
+    {
+        LOG(WARNING) << "Numbers of vertices do not match.";
+        return;
+    }
+
+    for (int i = 0; i < nModifiedTriangles; ++i)
+    {
+        auto& tri = (*modifiedTriangles)[i];
+        (*triangles)[modifiedTriangleIndices->at(i)] = tri;
+        m_removeConstraintVertices->insert(tri[0]);
+        m_removeConstraintVertices->insert(tri[1]);
+        m_removeConstraintVertices->insert(tri[2]);
+        m_addConstraintVertices->insert(tri[0]);
+        m_addConstraintVertices->insert(tri[1]);
+        m_addConstraintVertices->insert(tri[2]);
+    }
+    pbdMesh->modified();
+}
 }
\ No newline at end of file
diff --git a/Source/Scene/imstkPbdObjectCuttingPair.h b/Source/Scene/imstkPbdObjectCuttingPair.h
index 7fe35f62f394dad7f4e43ec88b0dfce744bed46f..6a58f2a2c4053cf9f9a00aabc339fb628679a6d2 100644
--- a/Source/Scene/imstkPbdObjectCuttingPair.h
+++ b/Source/Scene/imstkPbdObjectCuttingPair.h
@@ -22,11 +22,16 @@ limitations under the License.
 #pragma once
 
 #include "imstkObjectInteractionPair.h"
+#include "imstkVecDataArray.h"
+
+#include <unordered_set>
+#include <vector>
 
 namespace imstk
 {
-class PbdObject;
 class CollidingObject;
+class PbdObject;
+class SurfaceMesh;
 
 ///
 /// \class PbdObjectCuttingPair
@@ -42,5 +47,36 @@ public:
     void apply();
 
 protected:
+
+    ///
+    /// \brief Add new vertices to pbdObj
+    ///
+    void addVertices(std::shared_ptr<SurfaceMesh> pbdMesh,
+                     std::shared_ptr<VecDataArray<double, 3>> vertices,
+                     std::shared_ptr<VecDataArray<double, 3>> initialVertices);
+
+    ///
+    /// \brief Modify current vertices of pbdObj
+    ///
+    void modifyVertices(std::shared_ptr<SurfaceMesh> pbdMesh,
+                        std::shared_ptr<std::vector<size_t>> vertexIndices,
+                        std::shared_ptr<VecDataArray<double, 3>> vertices,
+                        std::shared_ptr<VecDataArray<double, 3>> initialVertices);
+
+    ///
+    /// \brief Add new elements to pbdObj
+    ///
+    void addTriangles(std::shared_ptr<SurfaceMesh> pbdMesh,
+                      std::shared_ptr<VecDataArray<int, 3>> elements);
+
+    ///
+    /// \brief Modify exsiting elements of pbdObj
+    ///
+    void modifyTriangles(std::shared_ptr<SurfaceMesh> pbdMesh,
+                         std::shared_ptr<std::vector<size_t>> elementIndices,
+                         std::shared_ptr<VecDataArray<int, 3>> elements);
+
+    std::shared_ptr<std::unordered_set<size_t>> m_removeConstraintVertices = std::make_shared<std::unordered_set<size_t>>();
+    std::shared_ptr<std::unordered_set<size_t>> m_addConstraintVertices    = std::make_shared<std::unordered_set<size_t>>();
 };
 }
\ No newline at end of file