diff --git a/GUI/Model/Sample/CompoundItem.cpp b/GUI/Model/Sample/CompoundItem.cpp
index 8ff804c8eb9b77fa13fdb0051f192e3250077bce..8fd3c9809104aabbe85dc2150e6fbf2ddceb6dae 100644
--- a/GUI/Model/Sample/CompoundItem.cpp
+++ b/GUI/Model/Sample/CompoundItem.cpp
@@ -14,6 +14,7 @@
 
 #include "GUI/Model/Sample/CompoundItem.h"
 #include "Base/Util/Assert.h"
+#include "Base/Util/Vec.h"
 #include "GUI/Model/Sample/CoreAndShellItem.h"
 #include "GUI/Model/Sample/MesocrystalItem.h"
 #include "GUI/Model/Sample/ParticleItem.h"
@@ -147,10 +148,12 @@ std::vector<ItemWithParticles*> CompoundItem::itemsWithParticles() const
     return result;
 }
 
-QVector<ItemWithParticles*> CompoundItem::containedItemsWithParticles() const
+std::vector<ItemWithParticles*> CompoundItem::containedItemsWithParticles() const
 {
-    QVector<ItemWithParticles*> result;
-    for (const auto& sel : m_particles)
-        result << sel.certainItem() << sel.certainItem()->containedItemsWithParticles();
+    std::vector<ItemWithParticles*> result;
+    for (const auto& sel : m_particles) {
+        result.push_back(sel.certainItem());
+        Vec::concat(result, sel.certainItem()->containedItemsWithParticles());
+    }
     return result;
 }
diff --git a/GUI/Model/Sample/CompoundItem.h b/GUI/Model/Sample/CompoundItem.h
index bf0197cf810c939da4bdc40c84af6f2088e32a93..5b4cbfa97da79a8e1f52eb336604ef27fe2bf4b4 100644
--- a/GUI/Model/Sample/CompoundItem.h
+++ b/GUI/Model/Sample/CompoundItem.h
@@ -37,7 +37,7 @@ public:
     std::unique_ptr<Compound> createCompound() const;
 
     std::vector<ItemWithParticles*> itemsWithParticles() const;
-    QVector<ItemWithParticles*> containedItemsWithParticles() const override;
+    std::vector<ItemWithParticles*> containedItemsWithParticles() const override;
 
     bool expandCompound = true;
 
diff --git a/GUI/Model/Sample/CoreAndShellItem.cpp b/GUI/Model/Sample/CoreAndShellItem.cpp
index da692bd35d8cf242d720adfa348cc95e014541c4..edd64826e7a8a5e2f2cb99815a4ab10e8a0675d1 100644
--- a/GUI/Model/Sample/CoreAndShellItem.cpp
+++ b/GUI/Model/Sample/CoreAndShellItem.cpp
@@ -14,6 +14,7 @@
 
 #include "GUI/Model/Sample/CoreAndShellItem.h"
 #include "Base/Util/Assert.h"
+#include "Base/Util/Vec.h"
 #include "GUI/Model/Material/MaterialsSet.h"
 #include "GUI/Model/Sample/ParticleItem.h"
 #include "Sample/Particle/CoreAndShell.h"
@@ -174,12 +175,17 @@ ParticleItem* CoreAndShellItem::createShellItem(const MaterialsSet* materials)
     return m_shell.get();
 }
 
-QVector<ItemWithParticles*> CoreAndShellItem::containedItemsWithParticles() const
+std::vector<ItemWithParticles*> CoreAndShellItem::containedItemsWithParticles() const
 {
-    QVector<ItemWithParticles*> result;
-    if (coreItem())
-        result << coreItem() << coreItem()->containedItemsWithParticles();
-    if (shellItem())
-        result << shellItem() << shellItem()->containedItemsWithParticles();
+    std::vector<ItemWithParticles*> result;
+    if (coreItem()) {
+        result.push_back(coreItem());
+        Vec::concat(result, coreItem()->containedItemsWithParticles());
+    }
+    if (shellItem()) {
+        result.push_back(shellItem());
+        Vec::concat(result, shellItem()->containedItemsWithParticles());
+    }
+
     return result;
 }
diff --git a/GUI/Model/Sample/CoreAndShellItem.h b/GUI/Model/Sample/CoreAndShellItem.h
index 3dd0a74b5951c18670121c3b5de5d9b0bb1e1573..59aa98b2ed9dc4df18ab8049db2628d9e914969c 100644
--- a/GUI/Model/Sample/CoreAndShellItem.h
+++ b/GUI/Model/Sample/CoreAndShellItem.h
@@ -37,7 +37,7 @@ public:
     ParticleItem* shellItem() const;
     ParticleItem* createShellItem(const MaterialsSet* materials);
 
-    QVector<ItemWithParticles*> containedItemsWithParticles() const override;
+    std::vector<ItemWithParticles*> containedItemsWithParticles() const override;
 
     bool expandMain = true;
     bool expandCore = true;
diff --git a/GUI/Model/Sample/ItemWithParticles.h b/GUI/Model/Sample/ItemWithParticles.h
index e305867673451e0f5866a08faf9092ee871abe72..e72065633de2706fefcd5191722c7d65e8bfdbb7 100644
--- a/GUI/Model/Sample/ItemWithParticles.h
+++ b/GUI/Model/Sample/ItemWithParticles.h
@@ -44,10 +44,8 @@ public:
     //! nullptr only if "no rotation". Can contain identity!
     std::unique_ptr<IRotation> createRotation() const;
 
-    //! Return full hierarchical contained items with particles.
-    //!
-    //! For example CompoundItem contains other items, ParticleItem doesn't.
-    virtual QVector<ItemWithParticles*> containedItemsWithParticles() const = 0;
+    //! Returns particles contained at any sublevel (recursive).
+    virtual std::vector<ItemWithParticles*> containedItemsWithParticles() const = 0;
 
     virtual void writeTo(QXmlStreamWriter* w) const;
     virtual void readFrom(QXmlStreamReader* r);
diff --git a/GUI/Model/Sample/LayerItem.cpp b/GUI/Model/Sample/LayerItem.cpp
index 95c6a7e4a0467281c894951abf3a2705a69921e8..8262e25b4cbaa64f0bb9009279de571c90f516e4 100644
--- a/GUI/Model/Sample/LayerItem.cpp
+++ b/GUI/Model/Sample/LayerItem.cpp
@@ -89,11 +89,11 @@ QVector<ItemWithMaterial*> LayerItem::itemsWithMaterial()
     return result;
 }
 
-QVector<ItemWithParticles*> LayerItem::itemsWithParticles() const
+std::vector<ItemWithParticles*> LayerItem::itemsWithParticles() const
 {
-    QVector<ItemWithParticles*> result;
+    std::vector<ItemWithParticles*> result;
     for (auto* layout : layoutItems())
-        result << layout->containedItemsWithParticles();
+        Vec::concat(result, layout->containedItemsWithParticles());
     return result;
 }
 
diff --git a/GUI/Model/Sample/LayerItem.h b/GUI/Model/Sample/LayerItem.h
index 91e257bad3673902f4565d81a87239d0f9f4bf98..6849f4d169ed4f4fab20aca44bb3f3349089f33b 100644
--- a/GUI/Model/Sample/LayerItem.h
+++ b/GUI/Model/Sample/LayerItem.h
@@ -36,7 +36,7 @@ public:
     void setLayerName(const QString& n) { m_name = n; }
 
     QVector<ItemWithMaterial*> itemsWithMaterial();
-    QVector<ItemWithParticles*> itemsWithParticles() const;
+    std::vector<ItemWithParticles*> itemsWithParticles() const;
 
     DoubleProperty& thickness() { return m_thickness; }
     const DoubleProperty& thickness() const { return m_thickness; }
diff --git a/GUI/Model/Sample/MesocrystalItem.cpp b/GUI/Model/Sample/MesocrystalItem.cpp
index 6835bedf0fd87ba36bbe13011c4b047aaab71332..1c31aaec6ca51286102c6497d66007230e78fe84 100644
--- a/GUI/Model/Sample/MesocrystalItem.cpp
+++ b/GUI/Model/Sample/MesocrystalItem.cpp
@@ -13,6 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Model/Sample/MesocrystalItem.h"
+#include "Base/Util/Vec.h"
 #include "GUI/Model/Sample/CompoundItem.h"
 #include "GUI/Model/Sample/CoreAndShellItem.h"
 #include "GUI/Model/Sample/ParticleItem.h"
@@ -200,10 +201,12 @@ std::unique_ptr<IFormFactor> MesocrystalItem::getOuterShape() const
     return m_outer_shape->createFormFactor();
 }
 
-QVector<ItemWithParticles*> MesocrystalItem::containedItemsWithParticles() const
+std::vector<ItemWithParticles*> MesocrystalItem::containedItemsWithParticles() const
 {
-    QVector<ItemWithParticles*> result;
-    if (basisItem())
-        result << basisItem() << basisItem()->containedItemsWithParticles();
+    std::vector<ItemWithParticles*> result;
+    if (basisItem()) {
+        result.push_back(basisItem());
+        Vec::concat(result, basisItem()->containedItemsWithParticles());
+    }
     return result;
 }
diff --git a/GUI/Model/Sample/MesocrystalItem.h b/GUI/Model/Sample/MesocrystalItem.h
index c57e93c3a2c51c415ca533b8f07f935d21b8226d..d02b3f435d457004be99f63493459b22f2d9315a 100644
--- a/GUI/Model/Sample/MesocrystalItem.h
+++ b/GUI/Model/Sample/MesocrystalItem.h
@@ -62,7 +62,7 @@ public:
     const VectorProperty& vectorC() const { return m_vectorC; }
     void setVectorC(const R3& v) { m_vectorC.setR3(v); }
 
-    QVector<ItemWithParticles*> containedItemsWithParticles() const override;
+    std::vector<ItemWithParticles*> containedItemsWithParticles() const override;
 
     bool expandMesocrystal = true;
 
diff --git a/GUI/Model/Sample/ParticleItem.cpp b/GUI/Model/Sample/ParticleItem.cpp
index 20c5f78433f327b7603fe76bdcf2d16ee314fb3d..2986946edd7279a39615e156f48c43e7f8be8fd9 100644
--- a/GUI/Model/Sample/ParticleItem.cpp
+++ b/GUI/Model/Sample/ParticleItem.cpp
@@ -124,8 +124,3 @@ FormFactorItem* ParticleItem::formFactorItem() const
 {
     return m_form_factor.certainItem();
 }
-
-QVector<ItemWithParticles*> ParticleItem::containedItemsWithParticles() const
-{
-    return {};
-}
diff --git a/GUI/Model/Sample/ParticleItem.h b/GUI/Model/Sample/ParticleItem.h
index 83061ef786f2d0afdddb2513dfd3dd68d779ea63..1d757fe7ad59afbec0df67df3474a0290c1cab18 100644
--- a/GUI/Model/Sample/ParticleItem.h
+++ b/GUI/Model/Sample/ParticleItem.h
@@ -36,7 +36,7 @@ public:
     template <typename T> T* setFormFactorItemType();
     void setFormFactor(FormFactorItem* p);
     FormFactorItem* formFactorItem() const;
-    QVector<ItemWithParticles*> containedItemsWithParticles() const override;
+    std::vector<ItemWithParticles*> containedItemsWithParticles() const override { return {}; }
 
     bool expandParticle = true;
 
diff --git a/GUI/Model/Sample/ParticleLayoutItem.cpp b/GUI/Model/Sample/ParticleLayoutItem.cpp
index 43eb30b3fb8a56ecb88b1e8acc217bdc4d0c00be..9384bdfa80bcbe52383203a60bbb2fd3f4840720 100644
--- a/GUI/Model/Sample/ParticleLayoutItem.cpp
+++ b/GUI/Model/Sample/ParticleLayoutItem.cpp
@@ -14,6 +14,7 @@
 
 #include "GUI/Model/Sample/ParticleLayoutItem.h"
 #include "Base/Util/Assert.h"
+#include "Base/Util/Vec.h"
 #include "GUI/Model/Sample/CompoundItem.h"
 #include "GUI/Model/Sample/Lattice2DItems.h"
 #include "GUI/Model/Sample/MesocrystalItem.h"
@@ -76,11 +77,13 @@ std::vector<ItemWithParticles*> ParticleLayoutItem::itemsWithParticles() const
     return result;
 }
 
-QVector<ItemWithParticles*> ParticleLayoutItem::containedItemsWithParticles() const
+std::vector<ItemWithParticles*> ParticleLayoutItem::containedItemsWithParticles() const
 {
-    QVector<ItemWithParticles*> result;
-    for (const auto& sel : m_particles)
-        result << sel.certainItem() << sel.certainItem()->containedItemsWithParticles();
+    std::vector<ItemWithParticles*> result;
+    for (const auto& sel : m_particles) {
+        result.push_back(sel.certainItem());
+        Vec::concat(result, sel.certainItem()->containedItemsWithParticles());
+    }
     return result;
 }
 
diff --git a/GUI/Model/Sample/ParticleLayoutItem.h b/GUI/Model/Sample/ParticleLayoutItem.h
index 79478555f9d48f0e9daacca3df46e87c5ae828ee..d05107b6d71d3f40cd99bfdceb77907a59c6e02b 100644
--- a/GUI/Model/Sample/ParticleLayoutItem.h
+++ b/GUI/Model/Sample/ParticleLayoutItem.h
@@ -49,7 +49,7 @@ public:
     std::vector<ItemWithParticles*> itemsWithParticles() const;
 
     //! Return particles contained at any level (recursive).
-    QVector<ItemWithParticles*> containedItemsWithParticles() const;
+    std::vector<ItemWithParticles*> containedItemsWithParticles() const;
 
     void addItemWithParticleSelection(ItemWithParticles* particle);
     void removeItemWithParticle(ItemWithParticles* particle);
diff --git a/GUI/View/Views/SampleView.cpp b/GUI/View/Views/SampleView.cpp
index 667e295d03fa94dfa5235e5925c7d39e56bec00c..e40aa9ca77fa444b81ede86ce046a398e89f0c4e 100644
--- a/GUI/View/Views/SampleView.cpp
+++ b/GUI/View/Views/SampleView.cpp
@@ -13,6 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/View/Views/SampleView.h"
+#include "Base/Util/Vec.h"
 #include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/Model/Sample/ItemWithParticles.h"
 #include "GUI/Model/Sample/LayerItem.h"
@@ -177,15 +178,16 @@ void SampleView::onAboutToRemoveItem(Item3D* item)
 
     } else if (auto* i = dynamic_cast<LayerItem*>(item)) {
         if (item == widget->displayedItem() || i->layoutItems().contains(displayed)
-            || i->itemsWithParticles().contains(displayed))
+            || Vec::containsPtr(displayed, i->itemsWithParticles()))
             widget->resetScene();
 
     } else if (auto* i = dynamic_cast<ParticleLayoutItem*>(item)) {
-        if (item == widget->displayedItem() || i->containedItemsWithParticles().contains(displayed))
+        if (item == widget->displayedItem()
+            || Vec::containsPtr(displayed, i->containedItemsWithParticles()))
             widget->resetScene();
 
     } else if (auto* i = dynamic_cast<ItemWithParticles*>(item)) {
-        if (item == displayed || i->containedItemsWithParticles().contains(displayed))
+        if (item == displayed || Vec::containsPtr(displayed, i->containedItemsWithParticles()))
             widget->resetScene();
     }
 }