diff --git a/GUI/coregui/Models/GUIDomainSampleVisitor.cpp b/GUI/coregui/Models/GUIDomainSampleVisitor.cpp
index ed2253a5fffd23ce0cd72f4a75804a4ff651801a..2f8c6095b0c9987eadf5ffcd6bf9aa38e3b612f0 100644
--- a/GUI/coregui/Models/GUIDomainSampleVisitor.cpp
+++ b/GUI/coregui/Models/GUIDomainSampleVisitor.cpp
@@ -78,11 +78,10 @@ SessionItem* GUIDomainSampleVisitor::populateSampleModel(SampleModel* sampleMode
     if (m_topSampleName.isEmpty())
         m_topSampleName = sample.getName().c_str();
 
-    VisitNodesPreorder(sample, *this);
-    //for (const auto [child, depth, parent]: NodeUtils::progenyPlus(&sample)) {
-    //    setDepth(depth);
-    //    child->accept(this);
-    //}
+    for (const auto [child, depth, parent]: NodeUtils::progenyPlus(&sample)) {
+        setDepth(depth+1);
+        child->accept(this);
+    }
     SessionItem* result = m_levelToParentItem[1];
 
     result->setItemName(m_topSampleName);
diff --git a/Param/Node/INodeVisitor.cpp b/Param/Node/INodeVisitor.cpp
deleted file mode 100644
index 6e70df009b59d05fb4e1fac38fe723c469efcc23..0000000000000000000000000000000000000000
--- a/Param/Node/INodeVisitor.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Param/Node/INodeVisitor.cpp
-//! @brief     Implements interface INodeVisitor.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#include "Param/Node/IterationStrategy.h"
-#include "Param/Node/NodeIterator.h"
-
-void VisitNodesPreorder(const INode& node, INodeVisitor& visitor) {
-    NodeIterator<PreorderStrategy> it(&node);
-    it.first();
-    while (!it.isDone()) {
-        visitor.setDepth(it.depth());
-        const INode* child = it.getCurrent();
-        child->accept(&visitor);
-        it.next();
-    }
-}
diff --git a/Param/Node/INodeVisitor.h b/Param/Node/INodeVisitor.h
index 7520a298676527ddce97186b69292c94235277f9..2acf99b0819f038920b4944c476ca08eb0d8d68d 100644
--- a/Param/Node/INodeVisitor.h
+++ b/Param/Node/INodeVisitor.h
@@ -279,6 +279,4 @@ private:
     int m_depth;
 };
 
-void VisitNodesPreorder(const INode& node, INodeVisitor& visitor);
-
 #endif // BORNAGAIN_PARAM_NODE_INODEVISITOR_H
diff --git a/Param/Node/IterationStrategy.cpp b/Param/Node/IterationStrategy.cpp
deleted file mode 100644
index 8d3d34f184536756b4f870b8799fa6b11995ec8d..0000000000000000000000000000000000000000
--- a/Param/Node/IterationStrategy.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Param/Node/IterationStrategy.cpp
-//! @brief     Implements class IterationStrategy and children.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#include "Param/Node/IterationStrategy.h"
-#include "Base/Utils/Assert.h"
-#include "Param/Node/NodeIterator.h"
-
-PreorderStrategy::PreorderStrategy() = default;
-
-PreorderStrategy* PreorderStrategy::clone() const {
-    return new PreorderStrategy();
-}
-
-IteratorMemento PreorderStrategy::first(const INode* p_root) {
-    IteratorMemento iterator_stack;
-    iterator_stack.push_state(IteratorState(p_root));
-    return iterator_stack;
-}
-
-void PreorderStrategy::next(IteratorMemento& iterator_stack) const {
-    const INode* node = iterator_stack.getCurrent();
-    ASSERT(node);
-    std::vector<const INode*> children = node->getChildren();
-    if (children.size() > 0) {
-        iterator_stack.push_state(IteratorState(children));
-        return;
-    }
-    iterator_stack.next();
-    while (!iterator_stack.empty() && iterator_stack.get_state().isEnd()) {
-        iterator_stack.pop_state();
-        if (!iterator_stack.empty())
-            iterator_stack.next();
-    }
-}
-
-bool PreorderStrategy::isDone(IteratorMemento& iterator_stack) const {
-    return iterator_stack.empty();
-}
diff --git a/Param/Node/IterationStrategy.h b/Param/Node/IterationStrategy.h
deleted file mode 100644
index 74668675b2ddea78f192fd31abce76aa662c42a9..0000000000000000000000000000000000000000
--- a/Param/Node/IterationStrategy.h
+++ /dev/null
@@ -1,46 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Param/Node/IterationStrategy.h
-//! @brief     Defines class IterationStrategy and children.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#ifndef BORNAGAIN_PARAM_NODE_ITERATIONSTRATEGY_H
-#define BORNAGAIN_PARAM_NODE_ITERATIONSTRATEGY_H
-
-class INode;
-class IteratorMemento;
-
-//! Abstract base class for tree traversal strategies, for use in INodeVisitor.
-//!
-//! For definition of different strategies see https://en.wikipedia.org/wiki/Tree_traversal.
-
-class IterationStrategy {
-public:
-    virtual IterationStrategy* clone() const = 0;
-
-    virtual IteratorMemento first(const INode* p_root) = 0;
-    virtual void next(IteratorMemento& iterator_stack) const = 0;
-    virtual bool isDone(IteratorMemento& iterator_stack) const = 0;
-};
-
-//! Traverse tree; visit parents before their children.
-class PreorderStrategy : public IterationStrategy {
-public:
-    PreorderStrategy();
-
-    virtual PreorderStrategy* clone() const;
-
-    virtual IteratorMemento first(const INode* p_root);
-    virtual void next(IteratorMemento& iterator_stack) const;
-    virtual bool isDone(IteratorMemento& iterator_stack) const;
-};
-
-#endif // BORNAGAIN_PARAM_NODE_ITERATIONSTRATEGY_H
diff --git a/Param/Node/NodeIterator.cpp b/Param/Node/NodeIterator.cpp
deleted file mode 100644
index 3ec63f0b68fb18340c8fa917ad2a0e9f25fecb14..0000000000000000000000000000000000000000
--- a/Param/Node/NodeIterator.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Param/Node/NodeIterator.cpp
-//! @brief     Implements class IteratorState.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#include "Param/Node/NodeIterator.h"
-
-IteratorState::IteratorState(const INode* single_element) : m_position(0) {
-    m_samples.push_back(single_element);
-}
-
-IteratorState::IteratorState(std::vector<const INode*> samples)
-    : m_samples(samples), m_position(0) {}
diff --git a/Param/Node/NodeIterator.h b/Param/Node/NodeIterator.h
deleted file mode 100644
index afe7857bab7a789f298543a6f873eb6be78c8f68..0000000000000000000000000000000000000000
--- a/Param/Node/NodeIterator.h
+++ /dev/null
@@ -1,125 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Param/Node/NodeIterator.h
-//! @brief     Defines classes IteratorState, IteratorMemento and NodeIterator.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#ifndef BORNAGAIN_PARAM_NODE_NODEITERATOR_H
-#define BORNAGAIN_PARAM_NODE_NODEITERATOR_H
-
-#include "Param/Node/INode.h"
-#include <ostream>
-#include <stack>
-#include <vector>
-
-//! Holds state of iterator at single level for SampleTreeIterator.
-//! @ingroup samples_internal
-
-class IteratorState {
-public:
-    IteratorState(const INode* single_element);
-    IteratorState(std::vector<const INode*> samples);
-
-    virtual ~IteratorState() {}
-
-    const INode* getCurrent() const { return m_samples[m_position]; }
-    bool isEnd() const { return m_position >= m_samples.size(); }
-    void next() { ++m_position; }
-
-    friend std::ostream& operator<<(std::ostream& output_stream,
-                                    IteratorState const& iterator_state) {
-        return output_stream << "memento state " << iterator_state.m_position << " "
-                             << iterator_state.m_samples.size();
-    }
-
-private:
-    std::vector<const INode*> m_samples;
-    size_t m_position;
-
-    IteratorState();
-};
-
-//! Holds all iterator states encountered for SampleTreeIterator.
-//! @ingroup samples_internal
-
-class IteratorMemento {
-public:
-    IteratorMemento() {}
-    virtual ~IteratorMemento() {}
-
-    void push_state(const IteratorState& state) { m_state_stack.push(state); }
-    void pop_state() { m_state_stack.pop(); }
-    IteratorState& get_state() { return m_state_stack.top(); }
-    bool empty() const { return m_state_stack.empty(); }
-    void reset() {
-        while (!m_state_stack.empty())
-            m_state_stack.pop();
-    }
-    const INode* getCurrent() { return m_state_stack.top().getCurrent(); }
-    void next() { m_state_stack.top().next(); }
-    size_t size() const { return m_state_stack.size(); }
-
-protected:
-    std::stack<IteratorState> m_state_stack;
-};
-
-//! Iterator through INode tree of objects.
-//!
-//! Usage example:
-//!    SampleTreeIterator<Strategy> it(&sample);
-//!    it.first();
-//!    while( !it.is_done() ) {
-//!        INode *p_sample = it.get_current();
-//!        it.next();
-//!     }
-//! @ingroup samples_internal
-
-template <class Strategy> class NodeIterator {
-public:
-    NodeIterator(const INode* root);
-    virtual ~NodeIterator() {}
-
-    void first();
-    void next();
-    const INode* getCurrent();
-    bool isDone() const;
-    int depth() const;
-
-protected:
-    Strategy m_strategy;
-    IteratorMemento m_memento_itor;
-    const INode* m_root;
-};
-
-template <class Strategy>
-inline NodeIterator<Strategy>::NodeIterator(const INode* root) : m_root(root) {}
-
-template <class Strategy> inline void NodeIterator<Strategy>::first() {
-    m_memento_itor = m_strategy.first(m_root);
-}
-
-template <class Strategy> inline void NodeIterator<Strategy>::next() {
-    m_strategy.next(m_memento_itor);
-}
-
-template <class Strategy> inline const INode* NodeIterator<Strategy>::getCurrent() {
-    return m_memento_itor.getCurrent();
-}
-
-template <class Strategy> inline bool NodeIterator<Strategy>::isDone() const {
-    return m_memento_itor.size() == 0;
-}
-
-template <class Strategy> inline int NodeIterator<Strategy>::depth() const {
-    return static_cast<int>(m_memento_itor.size());
-}
-
-#endif // BORNAGAIN_PARAM_NODE_NODEITERATOR_H
diff --git a/auto/Wrap/doxygenParam.i b/auto/Wrap/doxygenParam.i
index b111bfa70451d97a29d7043ea66f1fef102b9c29..a777a86bf758b52ee04d38f596d874918b8997fa 100644
--- a/auto/Wrap/doxygenParam.i
+++ b/auto/Wrap/doxygenParam.i
@@ -1630,10 +1630,10 @@ C++ includes: Unit.h
 // File: namespace_0d15.xml
 
 
-// File: namespace_0d25.xml
+// File: namespace_0d24.xml
 
 
-// File: namespace_0d30.xml
+// File: namespace_0d29.xml
 
 
 // File: namespaceNodeUtils.xml
@@ -1726,14 +1726,7 @@ Returns units of main parameter.
 ";
 
 
-// File: INodeVisitor_8cpp.xml
-%feature("docstring")  VisitNodesPreorder "void VisitNodesPreorder(const INode &node, INodeVisitor &visitor)
-";
-
-
 // File: INodeVisitor_8h.xml
-%feature("docstring")  VisitNodesPreorder "void VisitNodesPreorder(const INode &node, INodeVisitor &visitor)
-";
 
 
 // File: IterationStrategy_8cpp.xml
diff --git a/auto/Wrap/libBornAgainParam.py b/auto/Wrap/libBornAgainParam.py
index 1bd005bce613afaa9078a8131f09cc2f4135e4de..ccd5a62b6833e3e358e852330bdd8c104d177508 100644
--- a/auto/Wrap/libBornAgainParam.py
+++ b/auto/Wrap/libBornAgainParam.py
@@ -3491,14 +3491,6 @@ class INodeVisitor(object):
 # Register INodeVisitor in _libBornAgainParam:
 _libBornAgainParam.INodeVisitor_swigregister(INodeVisitor)
 
-
-def VisitNodesPreorder(node, visitor):
-    r"""
-    VisitNodesPreorder(INode node, INodeVisitor visitor)
-    void VisitNodesPreorder(const INode &node, INodeVisitor &visitor)
-
-    """
-    return _libBornAgainParam.VisitNodesPreorder(node, visitor)
 class IDistribution1D(libBornAgainBase.ICloneable, INode):
     r"""
 
diff --git a/auto/Wrap/libBornAgainParam_wrap.cpp b/auto/Wrap/libBornAgainParam_wrap.cpp
index c4ec55623e15cc279162830a64978ac90bbf82f5..52e2a6cca627deb63db10d156a8ffa3774db2037 100644
--- a/auto/Wrap/libBornAgainParam_wrap.cpp
+++ b/auto/Wrap/libBornAgainParam_wrap.cpp
@@ -42286,41 +42286,6 @@ SWIGINTERN PyObject *INodeVisitor_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObj
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_VisitNodesPreorder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  INode *arg1 = 0 ;
-  INodeVisitor *arg2 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "VisitNodesPreorder", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_INode,  0  | 0);
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VisitNodesPreorder" "', argument " "1"" of type '" "INode const &""'"); 
-  }
-  if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VisitNodesPreorder" "', argument " "1"" of type '" "INode const &""'"); 
-  }
-  arg1 = reinterpret_cast< INode * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_INodeVisitor,  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VisitNodesPreorder" "', argument " "2"" of type '" "INodeVisitor &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VisitNodesPreorder" "', argument " "2"" of type '" "INodeVisitor &""'"); 
-  }
-  arg2 = reinterpret_cast< INodeVisitor * >(argp2);
-  VisitNodesPreorder((INode const &)*arg1,*arg2);
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_IDistribution1D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IDistribution1D *arg1 = (IDistribution1D *) 0 ;
@@ -51455,11 +51420,6 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "INodeVisitor_swigregister", INodeVisitor_swigregister, METH_O, NULL},
 	 { "INodeVisitor_swiginit", INodeVisitor_swiginit, METH_VARARGS, NULL},
-	 { "VisitNodesPreorder", _wrap_VisitNodesPreorder, METH_VARARGS, "\n"
-		"VisitNodesPreorder(INode node, INodeVisitor visitor)\n"
-		"void VisitNodesPreorder(const INode &node, INodeVisitor &visitor)\n"
-		"\n"
-		""},
 	 { "IDistribution1D_clone", _wrap_IDistribution1D_clone, METH_O, "\n"
 		"IDistribution1D_clone(IDistribution1D self) -> IDistribution1D\n"
 		"virtual IDistribution1D* IDistribution1D::clone() const =0\n"