diff --git a/GUI/coregui/Models/ItemFactory.cpp b/GUI/coregui/Models/ItemFactory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..977c9b0fd7a8318142925f62fd97991742f3fd56
--- /dev/null
+++ b/GUI/coregui/Models/ItemFactory.cpp
@@ -0,0 +1,25 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Models/ItemFactory.cpp
+//! @brief     Implements class ItemFactory.
+//!
+//! @homepage  http://apps.jcns.fz-juelich.de/BornAgain
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2013
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "ItemFactory.h"
+#include "MultiLayerItem.h"
+
+
+ParameterizedItem *ItemFactory::createItem(const QString &model_name)
+{
+    if (model_name==QString("MultiLayer")) {
+        return new MultiLayerItem();
+    }
+}
diff --git a/GUI/coregui/Models/ItemFactory.h b/GUI/coregui/Models/ItemFactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..1a7f8f50ed7c40184ce49e76f27a4030781cf8eb
--- /dev/null
+++ b/GUI/coregui/Models/ItemFactory.h
@@ -0,0 +1,30 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Models/ItemFactory.h
+//! @brief     Defines class ItemFactory.
+//!
+//! @homepage  http://apps.jcns.fz-juelich.de/BornAgain
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2013
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef ITEMFACTORY_H
+#define ITEMFACTORY_H
+
+#include "ParameterizedItem.h"
+
+class ItemFactory
+{
+public:
+    static ParameterizedItem *createItem(const QString &model_name);
+private:
+    ItemFactory() {}
+    ~ItemFactory() {}
+};
+
+#endif // ITEMFACTORY_H
diff --git a/GUI/coregui/Models/MultiLayerItem.cpp b/GUI/coregui/Models/MultiLayerItem.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9ce4a44008ab2a48ba9da589d362ba7fee22b3ab
--- /dev/null
+++ b/GUI/coregui/Models/MultiLayerItem.cpp
@@ -0,0 +1,27 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Models/MultiLayerItem.cpp
+//! @brief     Implements class MultiLayerItem.
+//!
+//! @homepage  http://apps.jcns.fz-juelich.de/BornAgain
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2013
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "MultiLayerItem.h"
+
+
+MultiLayerItem::MultiLayerItem()
+    : ParameterizedItem(QString("MultiLayer"))
+{
+    m_parameters[QString("Cross Correlation Length")] = 0.0;
+}
+
+MultiLayerItem::~MultiLayerItem()
+{
+}
diff --git a/GUI/coregui/Models/MultiLayerItem.h b/GUI/coregui/Models/MultiLayerItem.h
new file mode 100644
index 0000000000000000000000000000000000000000..a13e8c137d0c07c1135efd384c1d2085575313c2
--- /dev/null
+++ b/GUI/coregui/Models/MultiLayerItem.h
@@ -0,0 +1,28 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Models/MultiLayerItem.h
+//! @brief     Defines class MultiLayerItem.
+//!
+//! @homepage  http://apps.jcns.fz-juelich.de/BornAgain
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2013
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#ifndef MULTILAYERITEM_H
+#define MULTILAYERITEM_H
+
+#include "ParameterizedItem.h"
+
+class MultiLayerItem : public ParameterizedItem
+{
+public:
+    explicit MultiLayerItem();
+    ~MultiLayerItem();
+};
+
+#endif // MULTILAYERITEM_H
diff --git a/GUI/coregui/Models/ParameterizedItem.cpp b/GUI/coregui/Models/ParameterizedItem.cpp
index 01b8be21b64b9b1080fd965ef08f20a7a52909ea..236da75bc7734b0016a807f50f26570316789ab7 100644
--- a/GUI/coregui/Models/ParameterizedItem.cpp
+++ b/GUI/coregui/Models/ParameterizedItem.cpp
@@ -14,32 +14,44 @@
 // ************************************************************************** //
 
 #include "ParameterizedItem.h"
+#include "Exceptions.h"
 
 
 
-ParameterizedItem::ParameterizedItem(BA_MODEL_ID::Model_ID model_type,
-                                     const QString &name)
+ParameterizedItem::ParameterizedItem(const QString &name)
     : QStandardItem(name)
-    , m_model_type(model_type)
 {
-    populateWithParameters();
 }
 
 ParameterizedItem::~ParameterizedItem()
 {
+}
 
+double ParameterizedItem::getParameterValue(QString name)
+{
+    if (!m_parameters.contains(name)) {
+        throw Exceptions::RuntimeErrorException("ParameterizedItem::getParameterValue: "
+                                                "parameter does not exist");
+    }
+    return m_parameters[name];
 }
 
 void ParameterizedItem::setParameter(QString name, double value)
 {
-    if (m_parameters.contains(name)) {
-        m_parameters[name] = value;
+    if (!m_parameters.contains(name)) {
+        throw Exceptions::RuntimeErrorException("ParameterizedItem::getParameterValue: "
+                                                "parameter does not exist");
     }
+    m_parameters[name] = value;
 }
 
-void ParameterizedItem::populateWithParameters()
+bool ParameterizedItem::acceptsAsChild(ParameterizedItem *child)
 {
-    m_parameters[QString("firstparam")] = 5.0;
-    m_parameters[QString("anotherparam")] = 6.0;
-    m_parameters[QString("lastparam")] = 7.0;
+    return child->isValidParent(this->text());
 }
+
+bool ParameterizedItem::isValidParent(QString parentName)
+{
+    return m_valid_parents.contains(parentName);
+}
+
diff --git a/GUI/coregui/Models/ParameterizedItem.h b/GUI/coregui/Models/ParameterizedItem.h
index 18cd39e94d014a5d4423af5cb4c01c49e57117dd..89d39e159940408431014d78c632e67f1705a05f 100644
--- a/GUI/coregui/Models/ParameterizedItem.h
+++ b/GUI/coregui/Models/ParameterizedItem.h
@@ -17,29 +17,36 @@
 #define PARAMETERIZEDITEM_H_
 
 #include <QStandardItem>
+#include <QList>
 #include <QMap>
 
-namespace BA_MODEL_ID {
-enum Model_ID {
-    MultiLayer,
-    Layer,
-};
-}
-
 class ParameterizedItem : public QStandardItem
 {
 public:
-    explicit ParameterizedItem(BA_MODEL_ID::Model_ID model_type, const QString &name);
+    explicit ParameterizedItem(const QString &name);
     ~ParameterizedItem();
 
+    //! retrieves the parameter's value
+    double getParameterValue(QString name);
+
+    //! sets the parameter's value, if it exists
     void setParameter(QString name, double value);
+
+    //! retrieves the whole list of paramaters
     QMap<QString, double> &getParameters() {
         return m_parameters;
     }
-private:
-    void populateWithParameters();
-    BA_MODEL_ID::Model_ID m_model_type;
+
+    //! indicates if the passed item can be set as
+    //! a child item
+    bool acceptsAsChild(ParameterizedItem *child);
+protected:
+    QList<QString> m_valid_parents;
     QMap<QString, double> m_parameters;
+private:
+    //! indicates if the item name, passed as argument
+    //! can be the current item's parent
+    bool isValidParent(QString parentName);
 };
 
 
diff --git a/GUI/coregui/Models/SessionModel.cpp b/GUI/coregui/Models/SessionModel.cpp
index 2bf8945725edaea6a8a7cf769303cb22490e35b4..8487f6a7b46fd1cafdaaff17f08f08103e5c8004 100644
--- a/GUI/coregui/Models/SessionModel.cpp
+++ b/GUI/coregui/Models/SessionModel.cpp
@@ -14,6 +14,7 @@
 // ************************************************************************** //
 
 #include "SessionModel.h"
+#include "ItemFactory.h"
 
 
 SessionModel::SessionModel(QObject *parent)
@@ -27,7 +28,7 @@ SessionModel::~SessionModel()
 
 }
 
-QStandardItem *SessionModel::insertNewItem(BA_MODEL_ID::Model_ID model_type, const QModelIndex &index)
+QStandardItem *SessionModel::insertNewItem(QString model_type, const QModelIndex &index)
 {
     QStandardItem *parent;
     if (index.isValid()) {
@@ -44,14 +45,11 @@ QStandardItem *SessionModel::insertNewItem(BA_MODEL_ID::Model_ID model_type, con
 
 void SessionModel::initialize()
 {
-    m_default_names[BA_MODEL_ID::MultiLayer] = QString("MultiLayer");
-    m_default_names[BA_MODEL_ID::Layer] = QString("Layer");
 }
 
-QStandardItem *SessionModel::createNewItem(QStandardItem *parent, BA_MODEL_ID::Model_ID model_type)
+QStandardItem *SessionModel::createNewItem(QStandardItem *parent, QString model_type)
 {
-    QString name = m_default_names[model_type];
-    ParameterizedItem *new_item = new ParameterizedItem(model_type, name);
+    ParameterizedItem *new_item = ItemFactory::createItem(model_type);
     parent->appendRow(new_item);
     return new_item;
 }
diff --git a/GUI/coregui/Models/SessionModel.h b/GUI/coregui/Models/SessionModel.h
index ed9e9ec7c008794221dec3b99a77868bd5119380..78d97fcabd466286a414dd9df3607842245ac62a 100644
--- a/GUI/coregui/Models/SessionModel.h
+++ b/GUI/coregui/Models/SessionModel.h
@@ -30,7 +30,7 @@ public:
     void setFilename(const QString &filename) {
         m_filename = filename;
     }
-    QStandardItem *insertNewItem(BA_MODEL_ID::Model_ID model_type,
+    QStandardItem *insertNewItem(QString model_type,
                                  const QModelIndex &index);
 
 //    void load(const QString &filename=QString());
@@ -39,9 +39,8 @@ public:
 private:
     void initialize();
     QStandardItem *createNewItem(QStandardItem *parent,
-                                 BA_MODEL_ID::Model_ID model_type);
+                                 QString model_type);
     QString m_filename;
-    QMap<BA_MODEL_ID::Model_ID, QString> m_default_names;
 };
 
 #endif // SESSIONMODEL_H
diff --git a/GUI/coregui/Views/SampleView.cpp b/GUI/coregui/Views/SampleView.cpp
index 79ee5e11725d40a003c6997c6b7ddda6d47d47e9..cc2b849928d279cf5ae1735cfdf0d05193d7aee2 100644
--- a/GUI/coregui/Views/SampleView.cpp
+++ b/GUI/coregui/Views/SampleView.cpp
@@ -78,9 +78,9 @@ void SampleView::initSubWindows()
 
     SessionModel *session_model = new SessionModel();
     // Temporary for testing
-    QStandardItem *multilayer = session_model->insertNewItem(BA_MODEL_ID::MultiLayer, QModelIndex());
-    QStandardItem *layer = session_model->insertNewItem(BA_MODEL_ID::Layer, QModelIndex());
-    session_model->insertNewItem(BA_MODEL_ID::Layer, multilayer->index());
+    QStandardItem *multilayer = session_model->insertNewItem("MultiLayer", QModelIndex());
+    QStandardItem *layer = session_model->insertNewItem("Layer", QModelIndex());
+    session_model->insertNewItem("Layer", multilayer->index());
     // END temporary
     m_subWindows[SampleTreeView] = SampleViewComponents::createTreeView(session_model, this);
 
diff --git a/GUI/coregui/Views/SampleViewComponents.cpp b/GUI/coregui/Views/SampleViewComponents.cpp
index 344ebefd333ed8d8e208dbd9ec71ce78a401825a..e7dcbf2fb16130fbfc9ae4754a26e764b7794a46 100644
--- a/GUI/coregui/Views/SampleViewComponents.cpp
+++ b/GUI/coregui/Views/SampleViewComponents.cpp
@@ -29,7 +29,6 @@ SampleWidgetBox *SampleViewComponents::createWidgetBox(SampleDesignerInterface *
     return new SampleWidgetBox(core, parent);
 }
 
-
 //SamplePropertyEditorInterface *SampleViewComponents::createPropertyEditor(QWidget *parent)
 SamplePropertyEditor *SampleViewComponents::createPropertyEditor(SampleDesignerInterface *core, QWidget *parent)
 {
@@ -39,11 +38,14 @@ SamplePropertyEditor *SampleViewComponents::createPropertyEditor(SampleDesignerI
 //    result->setObjectName(QLatin1String("PropertyEditor"));
     return new SamplePropertyEditor(core, parent);
 }
+
 QTreeView *SampleViewComponents::createTreeView(SessionModel *session_model, QWidget *parent)
 {
     QTreeView *tree_view = new QTreeView(parent);
     tree_view->setModel(session_model);
     tree_view->setAllColumnsShowFocus(true);
+    tree_view->setWindowTitle(QString("Object Tree View"));
+    tree_view->setObjectName(QString("ObjectTree"));
     return tree_view;
 }