diff --git a/GUI/coregui/Models/SessionItemUtils.cpp b/GUI/coregui/Models/SessionItemUtils.cpp
index 95baba76496e73c28c5a8a6ea92d6a8f741a75a4..ec20618c0f78a49666b185d190e5cabf6b100e12 100644
--- a/GUI/coregui/Models/SessionItemUtils.cpp
+++ b/GUI/coregui/Models/SessionItemUtils.cpp
@@ -42,3 +42,21 @@ void SessionItemUtils::SetVectorItem(const SessionItem& item, const QString& nam
     p_vector_item->setItemValue(VectorItem::P_Y, value.y());
     p_vector_item->setItemValue(VectorItem::P_Z, value.z());
 }
+
+int SessionItemUtils::ParentVisibleRow(const SessionItem& item)
+{
+    int result(-1);
+
+    if (!item.parent() || !item.isVisible())
+        return result;
+
+    for(auto child : item.parent()->children()) {
+        if (child->isVisible())
+            ++result;
+
+        if (&item == child)
+            return result;
+    }
+
+    return result;
+}
diff --git a/GUI/coregui/Models/SessionItemUtils.h b/GUI/coregui/Models/SessionItemUtils.h
index 81ef1ce36168b683f5bc19073381bbe87dbfb19b..772753890a659a7e5196e7228b6f4f223fe63f89 100644
--- a/GUI/coregui/Models/SessionItemUtils.h
+++ b/GUI/coregui/Models/SessionItemUtils.h
@@ -28,11 +28,17 @@ namespace SessionItemUtils
 //! Returns the index of the given item within its parent. Returns -1 when no parent is set.
 BA_CORE_API_ int ParentRow(const SessionItem& item);
 
-//! Returns a VectorType group property's value as a kvector_t
+//! Returns a VectorType group property's value as a kvector_t.
 BA_CORE_API_ kvector_t GetVectorItem(const SessionItem& item, const QString& name);
 
-//! Returns a VectorType group property's value as a kvector_t
+//! Returns a VectorType group property's value as a kvector_t.
 BA_CORE_API_ void SetVectorItem(const SessionItem& item, const QString& name, kvector_t value);
+
+//! Returns the row of the given item within its parent not accounting for all hidden items
+//! above. Returns -1 when no parent set or item is hidden.
+
+BA_CORE_API_ int ParentVisibleRow(const SessionItem& item);
+
 }  // namespace SessionItemUtils
 
 #endif // SESSIONITEMUTILS_H
diff --git a/Tests/UnitTests/GUI/TestGUI.cpp b/Tests/UnitTests/GUI/TestGUI.cpp
index 96afb70d414aff2c5cf6366cc8a35090ffc7fb58..9d4f27e388a044c94954a7bed2b8fc9de1fcf389 100644
--- a/Tests/UnitTests/GUI/TestGUI.cpp
+++ b/Tests/UnitTests/GUI/TestGUI.cpp
@@ -34,6 +34,7 @@
 #include "TestModelUtils.h"
 #include "TestComponentProxyModel.h"
 #include "TestProxyModelStrategy.h"
+#include "TestSessionItemUtils.h"
 #include <memory>
 
 class GUITestFactory {
@@ -99,6 +100,7 @@ int main(int argc, char** argv) {
     tests.add<TestModelUtils>();
     tests.add<TestComponentProxyModel>();
     tests.add<TestProxyModelStrategy>();
+    tests.add<TestSessionItemUtils>();
 
     return tests.runAll(argc, argv);
 }
diff --git a/Tests/UnitTests/GUI/TestSessionItemUtils.h b/Tests/UnitTests/GUI/TestSessionItemUtils.h
new file mode 100644
index 0000000000000000000000000000000000000000..6bc3496bbf0da7ed8cc5727ee7b49a19912abbc7
--- /dev/null
+++ b/Tests/UnitTests/GUI/TestSessionItemUtils.h
@@ -0,0 +1,56 @@
+#include <QtTest>
+#include "SessionItemUtils.h"
+#include "SessionModel.h"
+#include "SessionItem.h"
+#include "VectorItem.h"
+#include "item_constants.h"
+
+class TestSessionItemUtils : public QObject
+{
+    Q_OBJECT
+public:
+
+private slots:
+    void test_ParentVisibleRow();
+};
+
+//! Test SessionItemUtils::ParentVisibleRow utility method.
+
+inline void TestSessionItemUtils::test_ParentVisibleRow()
+{
+    SessionModel model("TestModel");
+
+    // 3 property items in root, all visible
+    auto item1 = model.insertNewItem(Constants::PropertyType);
+    auto item2 = model.insertNewItem(Constants::PropertyType);
+    auto item3 = model.insertNewItem(Constants::PropertyType);
+    QCOMPARE(SessionItemUtils::ParentVisibleRow(*item1), 0);
+    QCOMPARE(SessionItemUtils::ParentVisibleRow(*item2), 1);
+    QCOMPARE(SessionItemUtils::ParentVisibleRow(*item3), 2);
+
+    // one item become invisible
+    item2->setVisible(false);
+    QCOMPARE(SessionItemUtils::ParentVisibleRow(*item1), 0);
+    QCOMPARE(SessionItemUtils::ParentVisibleRow(*item2), -1);
+    QCOMPARE(SessionItemUtils::ParentVisibleRow(*item3), 1);
+
+    // two more items
+    auto item4 = model.insertNewItem(Constants::PropertyType);
+    auto item5 = model.insertNewItem(Constants::PropertyType);
+    item5->setVisible(false);
+    QCOMPARE(SessionItemUtils::ParentVisibleRow(*item1), 0);
+    QCOMPARE(SessionItemUtils::ParentVisibleRow(*item2), -1);
+    QCOMPARE(SessionItemUtils::ParentVisibleRow(*item3), 1);
+    QCOMPARE(SessionItemUtils::ParentVisibleRow(*item4), 2);
+    QCOMPARE(SessionItemUtils::ParentVisibleRow(*item5), -1);
+
+    // adding vector item
+    SessionItem* vector = model.insertNewItem(Constants::VectorType);
+    auto x = vector->getItem(VectorItem::P_X);
+    auto y = vector->getItem(VectorItem::P_Y);
+    auto z = vector->getItem(VectorItem::P_Z);
+    x->setVisible(false);
+    QCOMPARE(SessionItemUtils::ParentVisibleRow(*x), -1);
+    QCOMPARE(SessionItemUtils::ParentVisibleRow(*y), 0);
+    QCOMPARE(SessionItemUtils::ParentVisibleRow(*z), 1);
+}