diff --git a/Source/Common/Testing/imstkDataArrayTest.cpp b/Source/Common/Testing/imstkDataArrayTest.cpp
index 61223bdf20ab31932438bde42e9b1080ce5c355d..28039ffb5c62cf6c43a7c81733a5c806fb9d525a 100644
--- a/Source/Common/Testing/imstkDataArrayTest.cpp
+++ b/Source/Common/Testing/imstkDataArrayTest.cpp
@@ -99,28 +99,44 @@ TEST(imstkDataArrayTest, Mapping)
 
 TEST(imstkDataArrayTest, CapacityManagement)
 {
-    DataArray<int> a;
-    EXPECT_EQ(0, a.size());
-    EXPECT_EQ(1, a.getCapacity());
-    a.push_back(0);
-    EXPECT_EQ(1, a.size());
-    EXPECT_EQ(1, a.getCapacity());
-    for (int i = 1; i < 10; ++i)
     {
-        a.push_back(i);
-        EXPECT_EQ(i + 1, a.size());
+        DataArray<int> a;
+        EXPECT_EQ(0, a.size());
+        EXPECT_EQ(1, a.getCapacity());
+        a.push_back(0);
+        EXPECT_EQ(1, a.size());
+        EXPECT_EQ(1, a.getCapacity());
+        for (int i = 1; i < 10; ++i)
+        {
+            a.push_back(i);
+            EXPECT_EQ(i + 1, a.size());
+        }
+        EXPECT_TRUE(isEqualTo(a, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }));
+    }
+    {
+        DataArray<int> a;
+        a.resize(100);
+        EXPECT_EQ(100, a.size());
+        EXPECT_EQ(100, a.getCapacity());
+        a.resize(50);
+        EXPECT_EQ(50, a.size());
+        EXPECT_EQ(50, a.getCapacity());
+        a.resize(0);
+        EXPECT_EQ(0, a.size());
+        EXPECT_EQ(1, a.getCapacity());
+    }
+    {
+        DataArray<int> a{ 1, 2, 3, 4 };
+        a.reserve(256);
+        EXPECT_EQ(4, a.size());
+        EXPECT_EQ(256, a.getCapacity());
+        a.reserve(100);
+        EXPECT_EQ(256, a.getCapacity());
+        EXPECT_EQ(4, a.size());
+        a.squeeze();
+        EXPECT_EQ(4, a.getCapacity());
+        EXPECT_EQ(4, a.size());
     }
-    EXPECT_TRUE(isEqualTo(a, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }));
-    a.reserve(256);
-    EXPECT_EQ(256, a.getCapacity());
-    EXPECT_EQ(10, a.size());
-    a.reserve(100);
-    EXPECT_EQ(100, a.getCapacity());
-    EXPECT_EQ(10, a.size());
-//     Doesn't work as expected
-//     a.squeeze();
-//     EXPECT_EQ(10, a.getCapacity());
-//     EXPECT_EQ(10, a.size());
 }
 
 TEST(imstkDataArrayTest, Iterators)
diff --git a/Source/Common/Testing/imstkVecDataArrayTest.cpp b/Source/Common/Testing/imstkVecDataArrayTest.cpp
index ed716e738c731e67fc5ecda7d1f3a9ca96d461c7..7395fe29cbfeaa55020b604f90c6c39e4e5a6613 100644
--- a/Source/Common/Testing/imstkVecDataArrayTest.cpp
+++ b/Source/Common/Testing/imstkVecDataArrayTest.cpp
@@ -114,30 +114,44 @@ TEST(imstkVecDataArrayTest, Mapping)
 
 TEST(imstkVecDataArrayTest, CapacityManagement)
 {
-    VecDataArray<int, 2> a;
-    EXPECT_EQ(0, a.size());
-    EXPECT_EQ(2, a.getCapacity());
-    a.push_back({ 0, 0 });
-    EXPECT_EQ(1, a.size());
-    EXPECT_EQ(2, a.getCapacity());
-    for (int i = 1; i < 10; ++i)
     {
-        a.push_back({ i, i });
-        EXPECT_EQ(i + 1, a.size());
+        VecDataArray<int, 2> a;
+        EXPECT_EQ(0, a.size());
+        EXPECT_EQ(2, a.getCapacity());
+        a.push_back({ 0, 0 });
+        EXPECT_EQ(1, a.size());
+        EXPECT_EQ(2, a.getCapacity());
+        for (int i = 1; i < 10; ++i)
+        {
+            a.push_back({ i, i });
+            EXPECT_EQ(i + 1, a.size());
+        }
+        EXPECT_TRUE(isEqualTo(a, { { 0, 0 }, { 1, 1 }, { 2, 2 }, { 3, 3 }, { 4, 4 }, { 5, 5 }, { 6, 6 }, { 7, 7 }, { 8, 8 }, { 9, 9 } }));
+    }
+    {
+        VecDataArray<int, 2> a;
+        a.resize(100);
+        EXPECT_EQ(100, a.size());
+        EXPECT_EQ(100 * 2, a.getCapacity());
+        a.resize(50);
+        EXPECT_EQ(50, a.size());
+        EXPECT_EQ(50 * 2, a.getCapacity());
+        a.resize(0);
+        EXPECT_EQ(0, a.size());
+        EXPECT_EQ(1 * 2, a.getCapacity());
+    }
+    {
+        VecDataArray<int, 2> a{ imstk::Vec2i{ 0, 2, }, { 4, 6 } };
+        a.reserve(256);
+        EXPECT_EQ(2, a.size());
+        EXPECT_EQ(256 * 2, a.getCapacity());
+        a.reserve(100);
+        EXPECT_EQ(2, a.size());
+        EXPECT_EQ(256 * 2, a.getCapacity());
+        a.squeeze();
+        EXPECT_EQ(2, a.size());
+        EXPECT_EQ(2 * 2, a.getCapacity());
     }
-    EXPECT_TRUE(isEqualTo(a, { { 0, 0 }, { 1, 1 }, { 2, 2 }, { 3, 3 }, { 4, 4 }, { 5, 5 }, { 6, 6 }, { 7, 7 }, { 8, 8 }, { 9, 9 } }));
-    // Odd ... reserves takes n rather than n * components as input
-    // result capacity is increased to n*components...
-    a.reserve(256);
-    EXPECT_EQ(256 * 2, a.getCapacity());
-    EXPECT_EQ(10, a.size());
-    a.reserve(100);
-    EXPECT_EQ(100 * 2, a.getCapacity());
-    EXPECT_EQ(10, a.size());
-    //     Doesn't work as expected
-    //     a.squeeze();
-    //     EXPECT_EQ(10, a.getCapacity());
-    //     EXPECT_EQ(10, a.size());
 }
 
 TEST(imstkVecDataArrayTest, Iterators)
@@ -163,11 +177,21 @@ TEST(imstkVecDataArrayTest, Iterators)
     }
 }
 
-TEST(imstkVecDataArrayTest, constructorCast)
+TEST(imstkVecDataArrayTest, ConstructorCast)
 {
-    VecDataArray<long, 2> a{ Vec2i{1,2}, {3,4} };
-    EXPECT_EQ(Vec2i(1,2), a[0].cast<int>());
+    VecDataArray<long, 2> a{ Vec2i{ 1, 2 }, { 3, 4 } };
+    EXPECT_EQ(Vec2i(1, 2), a[0].cast<int>());
+}
 
+TEST(imstkVecDataArrayTest, Erase)
+{
+    VecDataArray<int, 2> a { imstk::Vec2i{ 1, 1 }, { 2, 2 }, { 3, 3 } };
+    a.erase(1);
+    EXPECT_TRUE(isEqualTo(a, { imstk::Vec2i{ 1, 1, }, { 3, 3 } }));
+    a.erase(1);
+    EXPECT_TRUE(isEqualTo(a, { imstk::Vec2i{ 1, 1, } }));
+    a.erase(0);
+    EXPECT_EQ(0, a.size());
 }
 
 int
diff --git a/Source/Common/imstkDataArray.h b/Source/Common/imstkDataArray.h
index e258cd4581a48256833ccc9211611c51af8c84a0..f9f1850788e28f5a412cebcb50d4504341117785 100644
--- a/Source/Common/imstkDataArray.h
+++ b/Source/Common/imstkDataArray.h
@@ -189,8 +189,14 @@ public:
     inline void resize(const int size) override
     {
         // Can't resize a mapped vector
-        if (m_mapped || size == m_size)
+        if (m_mapped)
+        {
+            return;
+        }
+
+        if (size == m_capacity)
         {
+            m_size = m_capacity;
             return;
         }
 
@@ -242,10 +248,9 @@ public:
         }
 
         const int newSize = m_size + 1;
-        if (newSize > m_capacity) // If the new size exceeds capacity
+        if (newSize > m_capacity)   // If the new size exceeds capacity
         {
-            m_capacity *= 2;
-            resize(m_capacity); // Conservative/copies values
+            resize(m_capacity * 2); // Conservative/copies values
         }
         m_size = newSize;
         m_data[newSize - 1] = val;
@@ -260,10 +265,9 @@ public:
         }
 
         const int newSize = m_size + 1;
-        if (newSize > m_capacity) // If the new size exceeds capacity
+        if (newSize > m_capacity)   // If the new size exceeds capacity
         {
-            m_capacity *= 2;
-            resize(m_capacity); // Conservative/copies values
+            resize(m_capacity * 2); // Conservative/copies values
         }
         m_size = newSize;
         m_data[newSize - 1] = val;
@@ -280,15 +284,17 @@ public:
     ///
     /// \brief Allocates extra capacity, for the number of values, conservative reallocate
     ///
-    inline void reserve(const int size) override
+    inline void reserve(const int capacity) override
     {
         if (m_mapped)
         {
             return;
         }
 
+        if (capacity <= m_capacity) { return; }
+
         const int currSize = m_size;
-        resize(size);      // Reallocate
+        resize(capacity);  // Reallocate
         m_size = currSize; // Keep current size
     }
 
diff --git a/Source/Common/imstkVecDataArray.h b/Source/Common/imstkVecDataArray.h
index c6b4172ad4ba47ae95841d38dd0fbfe11f727fe7..41eaf18f71eac1a85e2d592e73103f44ac059a0c 100644
--- a/Source/Common/imstkVecDataArray.h
+++ b/Source/Common/imstkVecDataArray.h
@@ -181,7 +181,7 @@ public:
     inline void resize(const int size) override
     {
         // Can't resize a mapped vector
-        if (DataArray<T>::m_mapped || size == m_vecSize)
+        if (DataArray<T>::m_mapped || size == m_vecCapacity)
         {
             return;
         }
@@ -219,10 +219,9 @@ public:
         }
 
         const int newVecSize = m_vecSize + 1;
-        if (newVecSize > m_vecCapacity) // If the new size exceeds capacity
+        if (newVecSize > m_vecCapacity)              // If the new size exceeds capacity
         {
-            m_vecCapacity *= 2;
-            VecDataArray::resize(m_vecCapacity); // Conservative/copies values
+            VecDataArray::resize(m_vecCapacity * 2); // Conservative/copies values
         }
         m_vecSize = newVecSize;
         AbstractDataArray::m_size  = newVecSize * N;
@@ -238,10 +237,9 @@ public:
         }
 
         const int newVecSize = m_vecSize + 1;
-        if (newVecSize > m_vecCapacity) // If the new size exceeds capacity
+        if (newVecSize > m_vecCapacity)              // If the new size exceeds capacity
         {
-            m_vecCapacity *= 2;
-            VecDataArray::resize(m_vecCapacity); // Conservative/copies values
+            VecDataArray::resize(m_vecCapacity * 2); // Conservative/copies values
         }
         m_vecSize = newVecSize;
         AbstractDataArray::m_size  = newVecSize * N;
@@ -266,6 +264,8 @@ public:
             return;
         }
 
+        if (size < m_vecCapacity) { return; }
+
         const int currVecSize = m_vecSize;
         const int currSize    = AbstractDataArray::m_size;
         this->resize(size);      // Resize to desired capacity