diff --git a/App/src/TestPolarizedDWBATerms.cpp b/App/src/TestPolarizedDWBATerms.cpp
index 17f50b2f3d8150102ad3049267da92b15bdf4dc9..0890860aa46cf9eb0c1d145b090f9a9b3a9004d7 100644
--- a/App/src/TestPolarizedDWBATerms.cpp
+++ b/App/src/TestPolarizedDWBATerms.cpp
@@ -59,13 +59,15 @@ TestPolarizedDWBATerms::TestPolarizedDWBATerms()
 void TestPolarizedDWBATerms::execute()
 {
     Bin1D alpha_f_bin(m_alpha_f, m_alpha_f);
-    const ILayerRTCoefficients *p_in_coeffs =
-            mp_specular_info->getInCoefficients();
+    ScalarRTCoefficients in_coeffs;
+    in_coeffs.lambda = complex_t(0.2, 0.003);
+    in_coeffs.kz = -m_ki.z();
+    in_coeffs.t_r << complex_t(-0.18, 0.001), complex_t(0.7, 0.001);
     boost::scoped_ptr<const ILayerRTCoefficients> P_out_coeffs(
             mp_specular_info->getOutCoefficients(
-                    alpha_f_bin.getMidPoint(), 0.0) );
-    mp_scalar_ff->setSpecularInfo(p_in_coeffs, P_out_coeffs.get());
-    mp_matrix_ff->setSpecularInfo(p_in_coeffs, P_out_coeffs.get());
+                    alpha_f_bin.getMidPoint(), 0.0, 1.0) );
+    mp_scalar_ff->setSpecularInfo(&in_coeffs, P_out_coeffs.get());
+    mp_matrix_ff->setSpecularInfo(&in_coeffs, P_out_coeffs.get());
     Bin1D zero_bin;
     mp_scalar_ff->calculateTerms(m_ki, m_kf_bin, alpha_f_bin);
     mp_matrix_ff->calculateTerms(m_ki, m_kf_bin, alpha_f_bin, zero_bin);
@@ -90,13 +92,6 @@ void TestPolarizedDWBATerms::initWavevectors()
 void TestPolarizedDWBATerms::initSpecularInfo()
 {
     ScalarSpecularInfoMap *p_coeff_map =
-            new ScalarSpecularInfoMap(mp_multilayer, 0, 1.0);
-    mp_specular_info->addOutCoefficients(p_coeff_map);
-
-    ScalarRTCoefficients rt_coeffs;
-
-    rt_coeffs.lambda = complex_t(0.2, 0.003);
-    rt_coeffs.kz = -m_ki.z();
-    rt_coeffs.t_r << complex_t(-0.18, 0.001), complex_t(0.7, 0.001);
-    mp_specular_info->addInCoefficients(new ScalarRTCoefficients(rt_coeffs));
+            new ScalarSpecularInfoMap(mp_multilayer, 0);
+    mp_specular_info->addRTCoefficients(p_coeff_map);
 }
diff --git a/Core/Algorithms/inc/LayerStrategyBuilder.h b/Core/Algorithms/inc/LayerStrategyBuilder.h
index 2d7483dd3a1bd53e8d3c7ae49ec62e982f723adc..2bb02fa04748a01b92a638e6faa3de1447becde2 100644
--- a/Core/Algorithms/inc/LayerStrategyBuilder.h
+++ b/Core/Algorithms/inc/LayerStrategyBuilder.h
@@ -73,7 +73,7 @@ private:
     double getWavelength();
     //! Creates formfactor info for single particle
     FormFactorInfo *createFormFactorInfo(
-        const ParticleInfo *p_particle_info,
+        const ParticleInfo &particle_info,
         const IMaterial *p_ambient_material,
         complex_t factor) const;
 
diff --git a/Core/Algorithms/src/LayerStrategyBuilder.cpp b/Core/Algorithms/src/LayerStrategyBuilder.cpp
index fc28cca16d7d7abb54dd7830d165d8dff1b5928d..eebfd8c20a1d6672748ae1a7a1d842193ff1b750 100644
--- a/Core/Algorithms/src/LayerStrategyBuilder.cpp
+++ b/Core/Algorithms/src/LayerStrategyBuilder.cpp
@@ -113,10 +113,10 @@ void LayerStrategyBuilder::collectFormFactorInfos()
     size_t number_of_particles = p_layout->getNumberOfParticles();
     for (size_t particle_index =
              0; particle_index<number_of_particles; ++particle_index) {
-        const ParticleInfo *p_particle_info =
-            p_layout->getParticleInfo(particle_index);
+        ParticleInfo particle_info(*p_layout->getParticle(particle_index),
+                                   p_layout->getAbundanceOfParticle(particle_index) );
         FormFactorInfo *p_ff_info;
-        p_ff_info = createFormFactorInfo(p_particle_info, p_layer_material,
+        p_ff_info = createFormFactorInfo(particle_info, p_layer_material,
                 wavevector_scattering_factor);
         p_ff_info->m_abundance =
             p_layout->getAbundanceOfParticle(particle_index)/total_abundance;
@@ -141,27 +141,17 @@ double LayerStrategyBuilder::getWavelength()
 }
 
 FormFactorInfo *LayerStrategyBuilder::createFormFactorInfo(
-        const ParticleInfo *p_particle_info,
+        const ParticleInfo &particle_info,
         const IMaterial *p_ambient_material,
         complex_t factor) const
 {
     FormFactorInfo *p_result = new FormFactorInfo;
-    boost::scoped_ptr<IParticle> P_particle_clone(p_particle_info->
+    boost::scoped_ptr<IParticle> P_particle_clone(particle_info.
             getParticle()->clone());
     P_particle_clone->setAmbientMaterial(*p_ambient_material);
 
     // formfactor
-    IFormFactor *p_ff_particle=0;
-    kvector_t position = p_particle_info->getPosition();
-    if (position==kvector_t(0.0, 0.0, 0.0)) {
-        p_ff_particle = P_particle_clone->createFormFactor(factor);
-    }
-    else {
-        boost::scoped_ptr<IFormFactor> P_clone(
-                    P_particle_clone->createFormFactor(factor) );
-        p_ff_particle = new FormFactorDecoratorPositionFactor(
-                    *P_clone, position);
-    }
+    IFormFactor *p_ff_particle = P_particle_clone->createFormFactor(factor);
     IFormFactor *p_ff_framework(p_ff_particle);
     size_t n_layers = mp_layer->getNumberOfLayers();
     if (n_layers>1) {
@@ -176,9 +166,10 @@ FormFactorInfo *LayerStrategyBuilder::createFormFactorInfo(
     }
     p_result->mp_ff = p_ff_framework;
     // Other info (position and abundance)
+    kvector_t position = P_particle_clone->getPosition();
     p_result->m_pos_x = position.x();
     p_result->m_pos_y = position.y();
-    p_result->m_abundance = p_particle_info->getAbundance();
+    p_result->m_abundance = particle_info.getAbundance();
     return p_result;
 }
 
diff --git a/Core/FormFactors/inc/FormFactorDecoratorTransformation.h b/Core/FormFactors/inc/FormFactorDecoratorRotation.h
similarity index 73%
rename from Core/FormFactors/inc/FormFactorDecoratorTransformation.h
rename to Core/FormFactors/inc/FormFactorDecoratorRotation.h
index c2be85f061d5594a1519a46832256d8fa116f852..24a93e35ce39d30b160f0a0fdc63b74d9d762a3e 100644
--- a/Core/FormFactors/inc/FormFactorDecoratorTransformation.h
+++ b/Core/FormFactors/inc/FormFactorDecoratorRotation.h
@@ -2,8 +2,8 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      FormFactors/inc/FormFactorDecoratorTransformation.h
-//! @brief     Defines class FormFactorDecoratorTransformation.
+//! @file      FormFactors/inc/FormFactorDecoratorRotation.h
+//! @brief     Defines class FormFactorDecoratorRotation.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -13,32 +13,32 @@
 //
 // ************************************************************************** //
 
-#ifndef FORMFACTORDECORATORTRANSFORMATION_H
-#define FORMFACTORDECORATORTRANSFORMATION_H
+#ifndef FORMFACTORDECORATORROTATION_H
+#define FORMFACTORDECORATORROTATION_H
 
 #include "IFormFactorDecorator.h"
 #include "Rotations.h"
 #include <memory>
 
-//! @class FormFactorDecoratorTransformation
+//! @class FormFactorDecoratorRotation
 //! @ingroup formfactors_internal
 //! @brief Equips a formfactor with a rotation.
 
-class BA_CORE_API_ FormFactorDecoratorTransformation : public IFormFactorDecorator
+class BA_CORE_API_ FormFactorDecoratorRotation : public IFormFactorDecorator
 {
 public:
     //! Constructor, setting form factor and rotation.
-    FormFactorDecoratorTransformation(
+    FormFactorDecoratorRotation(
         IFormFactor *p_form_factor, const IRotation& transform)
         : IFormFactorDecorator(p_form_factor)
     {
-        setName("FormFactorDecoratorTransformation");
+        setName("FormFactorDecoratorRotation");
         m_transform = transform.getTransform3D();
     }
 
-    virtual ~FormFactorDecoratorTransformation() {}
+    virtual ~FormFactorDecoratorRotation() {}
 
-    virtual FormFactorDecoratorTransformation *clone() const;
+    virtual FormFactorDecoratorRotation *clone() const;
     virtual void accept(ISampleVisitor *visitor) const { visitor->visit(this); }
 
     virtual complex_t evaluate(const cvector_t& k_i,
@@ -52,7 +52,7 @@ protected:
 };
 
 
-inline complex_t FormFactorDecoratorTransformation::evaluate(
+inline complex_t FormFactorDecoratorRotation::evaluate(
     const cvector_t& k_i, const Bin1DCVector& k_f_bin, const Bin1D &alpha_f_bin) const
 {
     cvector_t new_ki =
@@ -65,6 +65,6 @@ inline complex_t FormFactorDecoratorTransformation::evaluate(
     return mp_form_factor->evaluate(new_ki, new_kf_bin, alpha_f_bin);
 }
 
-#endif // FORMFACTORDECORATORTRANSFORMATION_H
+#endif // FORMFACTORDECORATORROTATION_H
 
 
diff --git a/Core/FormFactors/inc/FormFactors.h b/Core/FormFactors/inc/FormFactors.h
index 23526530908125b92a71a7b2d6d4a90a994ae471..62948814e6823238322e310c23be51ce643defe8 100644
--- a/Core/FormFactors/inc/FormFactors.h
+++ b/Core/FormFactors/inc/FormFactors.h
@@ -28,7 +28,7 @@
 #include "FormFactorDecoratorMultiPositionFactor.h"
 #include "FormFactorDecoratorPositionFactor.h"
 #include "FormFactorDecoratorMaterial.h"
-#include "FormFactorDecoratorTransformation.h"
+#include "FormFactorDecoratorRotation.h"
 #include "FormFactorDWBA.h"
 #include "FormFactorDWBAPol.h"
 #include "FormFactorEllipsoidalCylinder.h"
diff --git a/Core/FormFactors/src/FormFactorCrystal.cpp b/Core/FormFactors/src/FormFactorCrystal.cpp
index 91ed23a672ea7fb2974e48c3d3b7d8e5f8e1c221..63769acad3f0a54965592a926ccf8d99390ce739 100644
--- a/Core/FormFactors/src/FormFactorCrystal.cpp
+++ b/Core/FormFactors/src/FormFactorCrystal.cpp
@@ -29,7 +29,7 @@ FormFactorCrystal::FormFactorCrystal(const Crystal &p_crystal,
     const IRotation *p_rotation = p_crystal.getRotation();
     if (p_rotation) {
         mp_meso_form_factor
-            = new FormFactorDecoratorTransformation(meso_crystal_form_factor.clone(), *p_rotation);
+            = new FormFactorDecoratorRotation(meso_crystal_form_factor.clone(), *p_rotation);
     } else {
         mp_meso_form_factor = meso_crystal_form_factor.clone();
     }
diff --git a/Core/FormFactors/src/FormFactorDecoratorTransformation.cpp b/Core/FormFactors/src/FormFactorDecoratorRotation.cpp
similarity index 68%
rename from Core/FormFactors/src/FormFactorDecoratorTransformation.cpp
rename to Core/FormFactors/src/FormFactorDecoratorRotation.cpp
index 3108c19632de320366b28c1988280cc4f2b429b7..a6b25bbf6fd26fc11400d2c9dabc041010cbdc75 100644
--- a/Core/FormFactors/src/FormFactorDecoratorTransformation.cpp
+++ b/Core/FormFactors/src/FormFactorDecoratorRotation.cpp
@@ -2,8 +2,8 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      FormFactors/src/FormFactorDecoratorTransformation.cpp
-//! @brief     Implements class FormFactorDecoratorTransformation
+//! @file      FormFactors/src/FormFactorDecoratorRotation.cpp
+//! @brief     Implements class FormFactorDecoratorRotation
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -13,14 +13,14 @@
 //
 // ************************************************************************** //
 
-#include "FormFactorDecoratorTransformation.h"
+#include "FormFactorDecoratorRotation.h"
 
 #include <boost/scoped_ptr.hpp>
 
-FormFactorDecoratorTransformation *FormFactorDecoratorTransformation::clone() const
+FormFactorDecoratorRotation *FormFactorDecoratorRotation::clone() const
 {
     boost::scoped_ptr<IRotation> P_rotation(IRotation::createRotation(m_transform));
-    FormFactorDecoratorTransformation *result =  new FormFactorDecoratorTransformation(
+    FormFactorDecoratorRotation *result =  new FormFactorDecoratorRotation(
                 mp_form_factor->clone(), *P_rotation);
 
     result->setName(getName());
diff --git a/Core/PythonAPI/inc/ParticleInfo.pypp.h b/Core/PythonAPI/inc/ParticleInfo.pypp.h
deleted file mode 100644
index 917bccc328e7251b736b762c3d133f9441c90d95..0000000000000000000000000000000000000000
--- a/Core/PythonAPI/inc/ParticleInfo.pypp.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// This file has been generated by Py++.
-
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Automatically generated boost::python code for BornAgain Python bindings
-//! @brief     Automatically generated boost::python code for BornAgain Python bindings
-//!
-//! @homepage  http://bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Juelich GmbH 2015
-//! @authors   Scientific Computing Group at MLZ Garching
-//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
-//
-// ************************************************************************** //
-
-#ifndef ParticleInfo_hpp__pyplusplus_wrapper
-#define ParticleInfo_hpp__pyplusplus_wrapper
-
-void register_ParticleInfo_class();
-
-#endif//ParticleInfo_hpp__pyplusplus_wrapper
diff --git a/Core/PythonAPI/inc/PythonCoreList.h b/Core/PythonAPI/inc/PythonCoreList.h
index 455a286b92bbffdeee6ff2b674c9ceb16d3aa1ad..75d0a12f26b60abf898e8909e16e391c6e7a715e 100644
--- a/Core/PythonAPI/inc/PythonCoreList.h
+++ b/Core/PythonAPI/inc/PythonCoreList.h
@@ -91,7 +91,6 @@
 #include "ParticleDistribution.h"
 #include "ParticleCoreShell.h"
 #include "ParticleLayout.h"
-#include "ParticleInfo.h"
 #include "PythonOutputData.h"
 #include "RealParameterWrapper.h"
 #include "ResolutionFunction2DGaussian.h"
diff --git a/Core/PythonAPI/src/Crystal.pypp.cpp b/Core/PythonAPI/src/Crystal.pypp.cpp
index 559e2a52bbcf97700295774459d0af95ea882b09..ffeee5538aa721712588c5168d79ffbe496f5abc 100644
--- a/Core/PythonAPI/src/Crystal.pypp.cpp
+++ b/Core/PythonAPI/src/Crystal.pypp.cpp
@@ -37,16 +37,16 @@ struct Crystal_wrapper : Crystal, bp::wrapper< Crystal > {
     m_pyobj = 0;
     }
 
-    virtual void applyTransformation( ::IRotation const & rotation ) {
-        if( bp::override func_applyTransformation = this->get_override( "applyTransformation" ) )
-            func_applyTransformation( boost::ref(rotation) );
+    virtual void applyRotation( ::IRotation const & rotation ) {
+        if( bp::override func_applyRotation = this->get_override( "applyRotation" ) )
+            func_applyRotation( boost::ref(rotation) );
         else{
-            this->Crystal::applyTransformation( boost::ref(rotation) );
+            this->Crystal::applyRotation( boost::ref(rotation) );
         }
     }
     
-    void default_applyTransformation( ::IRotation const & rotation ) {
-        Crystal::applyTransformation( boost::ref(rotation) );
+    void default_applyRotation( ::IRotation const & rotation ) {
+        Crystal::applyRotation( boost::ref(rotation) );
     }
 
     virtual ::Crystal * clone(  ) const  {
@@ -306,15 +306,15 @@ void register_Crystal_class(){
         typedef bp::class_< Crystal_wrapper, bp::bases< IClusteredParticles >, std::auto_ptr< Crystal_wrapper >, boost::noncopyable > Crystal_exposer_t;
         Crystal_exposer_t Crystal_exposer = Crystal_exposer_t( "Crystal", "A crystal structure with a form factor as a basis.", bp::init< ParticleComposition const &, Lattice const & >(( bp::arg("lattice_basis"), bp::arg("lattice") )) );
         bp::scope Crystal_scope( Crystal_exposer );
-        { //::Crystal::applyTransformation
+        { //::Crystal::applyRotation
         
-            typedef void ( ::Crystal::*applyTransformation_function_type)( ::IRotation const & ) ;
-            typedef void ( Crystal_wrapper::*default_applyTransformation_function_type)( ::IRotation const & ) ;
+            typedef void ( ::Crystal::*applyRotation_function_type)( ::IRotation const & ) ;
+            typedef void ( Crystal_wrapper::*default_applyRotation_function_type)( ::IRotation const & ) ;
             
             Crystal_exposer.def( 
-                "applyTransformation"
-                , applyTransformation_function_type(&::Crystal::applyTransformation)
-                , default_applyTransformation_function_type(&Crystal_wrapper::default_applyTransformation)
+                "applyRotation"
+                , applyRotation_function_type(&::Crystal::applyRotation)
+                , default_applyRotation_function_type(&Crystal_wrapper::default_applyRotation)
                 , ( bp::arg("rotation") ) );
         
         }
diff --git a/Core/PythonAPI/src/IClusteredParticles.pypp.cpp b/Core/PythonAPI/src/IClusteredParticles.pypp.cpp
index f80df7631c6c10c6a2b3c23e00fdf7f7bdf4df60..2537f95b689fbd74da2173e2e05bf19c5882ccdd 100644
--- a/Core/PythonAPI/src/IClusteredParticles.pypp.cpp
+++ b/Core/PythonAPI/src/IClusteredParticles.pypp.cpp
@@ -42,16 +42,16 @@ struct IClusteredParticles_wrapper : IClusteredParticles, bp::wrapper< IClustere
         func_accept( boost::python::ptr(visitor) );
     }
 
-    virtual void applyTransformation( ::IRotation const & rotation ) {
-        if( bp::override func_applyTransformation = this->get_override( "applyTransformation" ) )
-            func_applyTransformation( boost::ref(rotation) );
+    virtual void applyRotation( ::IRotation const & rotation ) {
+        if( bp::override func_applyRotation = this->get_override( "applyRotation" ) )
+            func_applyRotation( boost::ref(rotation) );
         else{
-            this->IClusteredParticles::applyTransformation( boost::ref(rotation) );
+            this->IClusteredParticles::applyRotation( boost::ref(rotation) );
         }
     }
     
-    void default_applyTransformation( ::IRotation const & rotation ) {
-        IClusteredParticles::applyTransformation( boost::ref(rotation) );
+    void default_applyRotation( ::IRotation const & rotation ) {
+        IClusteredParticles::applyRotation( boost::ref(rotation) );
     }
 
     virtual ::IClusteredParticles * clone(  ) const {
@@ -294,15 +294,15 @@ void register_IClusteredParticles_class(){
                 , "calls the ISampleVisitor's visit method." );
         
         }
-        { //::IClusteredParticles::applyTransformation
+        { //::IClusteredParticles::applyRotation
         
-            typedef void ( ::IClusteredParticles::*applyTransformation_function_type)( ::IRotation const & ) ;
-            typedef void ( IClusteredParticles_wrapper::*default_applyTransformation_function_type)( ::IRotation const & ) ;
+            typedef void ( ::IClusteredParticles::*applyRotation_function_type)( ::IRotation const & ) ;
+            typedef void ( IClusteredParticles_wrapper::*default_applyRotation_function_type)( ::IRotation const & ) ;
             
             IClusteredParticles_exposer.def( 
-                "applyTransformation"
-                , applyTransformation_function_type(&::IClusteredParticles::applyTransformation)
-                , default_applyTransformation_function_type(&IClusteredParticles_wrapper::default_applyTransformation)
+                "applyRotation"
+                , applyRotation_function_type(&::IClusteredParticles::applyRotation)
+                , default_applyRotation_function_type(&IClusteredParticles_wrapper::default_applyRotation)
                 , ( bp::arg("rotation") ) );
         
         }
diff --git a/Core/PythonAPI/src/ILayout.pypp.cpp b/Core/PythonAPI/src/ILayout.pypp.cpp
index 93071e3b1c323433f12f260dcdb08f60645672be..d5320977775c4918eaa3875606d627b0120704f8 100644
--- a/Core/PythonAPI/src/ILayout.pypp.cpp
+++ b/Core/PythonAPI/src/ILayout.pypp.cpp
@@ -79,9 +79,9 @@ struct ILayout_wrapper : ILayout, bp::wrapper< ILayout > {
         return func_getNumberOfParticles(  );
     }
 
-    virtual ::ParticleInfo const * getParticleInfo( ::std::size_t index ) const {
-        bp::override func_getParticleInfo = this->get_override( "getParticleInfo" );
-        return func_getParticleInfo( index );
+    virtual ::IParticle const * getParticle( ::std::size_t index ) const {
+        bp::override func_getParticle = this->get_override( "getParticle" );
+        return func_getParticle( index );
     }
 
     virtual bool areParametersChanged(  ) {
@@ -370,13 +370,13 @@ void register_ILayout_class(){
                 , "Returns number of particles." );
         
         }
-        { //::ILayout::getParticleInfo
+        { //::ILayout::getParticle
         
-            typedef ::ParticleInfo const * ( ::ILayout::*getParticleInfo_function_type)( ::std::size_t ) const;
+            typedef ::IParticle const * ( ::ILayout::*getParticle_function_type)( ::std::size_t ) const;
             
             ILayout_exposer.def( 
-                "getParticleInfo"
-                , bp::pure_virtual( getParticleInfo_function_type(&::ILayout::getParticleInfo) )
+                "getParticle"
+                , bp::pure_virtual( getParticle_function_type(&::ILayout::getParticle) )
                 , ( bp::arg("index") )
                 , bp::return_value_policy< bp::reference_existing_object >()
                 , "Returns information about particle with index." );
diff --git a/Core/PythonAPI/src/IParticle.pypp.cpp b/Core/PythonAPI/src/IParticle.pypp.cpp
index 53a520ba7fb8585a8cadfd52c0f3e863de963e23..9f6eddec1ab5a90d597d3372160cd832937a71f1 100644
--- a/Core/PythonAPI/src/IParticle.pypp.cpp
+++ b/Core/PythonAPI/src/IParticle.pypp.cpp
@@ -264,14 +264,15 @@ void register_IParticle_class(){
         typedef bp::class_< IParticle_wrapper, bp::bases< ICompositeSample >, std::auto_ptr< IParticle_wrapper >, boost::noncopyable > IParticle_exposer_t;
         IParticle_exposer_t IParticle_exposer = IParticle_exposer_t( "IParticle", "Interface for a generic particl.", bp::no_init );
         bp::scope IParticle_scope( IParticle_exposer );
-        { //::IParticle::applyTransformation
+        { //::IParticle::applyRotation
         
-            typedef void ( ::IParticle::*applyTransformation_function_type)( ::IRotation const & ) ;
+            typedef void ( ::IParticle::*applyRotation_function_type)( ::IRotation const & ) ;
             
             IParticle_exposer.def( 
-                "applyTransformation"
-                , applyTransformation_function_type( &::IParticle::applyTransformation )
-                , ( bp::arg("rotation") ) );
+                "applyRotation"
+                , applyRotation_function_type( &::IParticle::applyRotation )
+                , ( bp::arg("rotation") )
+                , "Applies transformation by composing it with the existing one." );
         
         }
         { //::IParticle::applyTransformationToSubParticles
@@ -327,6 +328,26 @@ void register_IParticle_class(){
                 , bp::return_value_policy< bp::reference_existing_object >()
                 , "Returns particle's material." );
         
+        }
+        { //::IParticle::getDepth
+        
+            typedef double ( ::IParticle::*getDepth_function_type)(  ) const;
+            
+            IParticle_exposer.def( 
+                "getDepth"
+                , getDepth_function_type( &::IParticle::getDepth )
+                , "Returns depth of particle." );
+        
+        }
+        { //::IParticle::getPosition
+        
+            typedef ::kvector_t ( ::IParticle::*getPosition_function_type)(  ) const;
+            
+            IParticle_exposer.def( 
+                "getPosition"
+                , getPosition_function_type( &::IParticle::getPosition )
+                , "Returns particle position, including depth." );
+        
         }
         { //::IParticle::getRotation
         
@@ -351,14 +372,26 @@ void register_IParticle_class(){
                 , ( bp::arg("material") ) );
         
         }
-        { //::IParticle::setTransformation
+        { //::IParticle::setPosition
         
-            typedef void ( ::IParticle::*setTransformation_function_type)( ::IRotation const & ) ;
+            typedef void ( ::IParticle::*setPosition_function_type)( ::kvector_t ) ;
             
             IParticle_exposer.def( 
-                "setTransformation"
-                , setTransformation_function_type( &::IParticle::setTransformation )
-                , ( bp::arg("rotation") ) );
+                "setPosition"
+                , setPosition_function_type( &::IParticle::setPosition )
+                , ( bp::arg("position") )
+                , "Sets particle position, including depth." );
+        
+        }
+        { //::IParticle::setRotation
+        
+            typedef void ( ::IParticle::*setRotation_function_type)( ::IRotation const & ) ;
+            
+            IParticle_exposer.def( 
+                "setRotation"
+                , setRotation_function_type( &::IParticle::setRotation )
+                , ( bp::arg("rotation") )
+                , "Sets transformation." );
         
         }
         { //::IParameterized::areParametersChanged
diff --git a/Core/PythonAPI/src/ParticleInfo.pypp.cpp b/Core/PythonAPI/src/ParticleInfo.pypp.cpp
deleted file mode 100644
index c87256214087a67df5330072b7ea1552047ea55d..0000000000000000000000000000000000000000
--- a/Core/PythonAPI/src/ParticleInfo.pypp.cpp
+++ /dev/null
@@ -1,538 +0,0 @@
-// This file has been generated by Py++.
-
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Automatically generated boost::python code for BornAgain Python bindings
-//! @brief     Automatically generated boost::python code for BornAgain Python bindings
-//!
-//! @homepage  http://bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Juelich GmbH 2015
-//! @authors   Scientific Computing Group at MLZ Garching
-//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
-//
-// ************************************************************************** //
-
-#include "Macros.h"
-GCC_DIAG_OFF(unused-parameter)
-GCC_DIAG_OFF(missing-field-initializers)
-#include "boost/python.hpp"
-GCC_DIAG_ON(unused-parameter)
-GCC_DIAG_ON(missing-field-initializers)
-#include "__call_policies.pypp.hpp"
-#include "__convenience.pypp.hpp"
-#include "PythonCoreList.h"
-#include "ParticleInfo.pypp.h"
-
-namespace bp = boost::python;
-
-struct ParticleInfo_wrapper : ParticleInfo, bp::wrapper< ParticleInfo > {
-
-    ParticleInfo_wrapper(::IParticle const & p_particle, double depth=0.0, double abundance=1.0e+0 )
-    : ParticleInfo( boost::ref(p_particle), depth, abundance )
-      , bp::wrapper< ParticleInfo >(){
-        // constructor
-    m_pyobj = 0;
-    }
-
-    ParticleInfo_wrapper(::IParticle const & p_particle, ::kvector_t position, double abundance=1.0e+0 )
-    : ParticleInfo( boost::ref(p_particle), position, abundance )
-      , bp::wrapper< ParticleInfo >(){
-        // constructor
-    m_pyobj = 0;
-    }
-
-    virtual ::ParticleInfo * clone(  ) const  {
-        if( bp::override func_clone = this->get_override( "clone" ) )
-            return func_clone(  );
-        else{
-            return this->ParticleInfo::clone(  );
-        }
-    }
-    
-    ::ParticleInfo * default_clone(  ) const  {
-        return ParticleInfo::clone( );
-    }
-
-    virtual ::ParticleInfo * cloneInvertB(  ) const  {
-        if( bp::override func_cloneInvertB = this->get_override( "cloneInvertB" ) )
-            return func_cloneInvertB(  );
-        else{
-            return this->ParticleInfo::cloneInvertB(  );
-        }
-    }
-    
-    ::ParticleInfo * default_cloneInvertB(  ) const  {
-        return ParticleInfo::cloneInvertB( );
-    }
-
-    virtual bool areParametersChanged(  ) {
-        if( bp::override func_areParametersChanged = this->get_override( "areParametersChanged" ) )
-            return func_areParametersChanged(  );
-        else{
-            return this->IParameterized::areParametersChanged(  );
-        }
-    }
-    
-    bool default_areParametersChanged(  ) {
-        return IParameterized::areParametersChanged( );
-    }
-
-    virtual void clearParameterPool(  ) {
-        if( bp::override func_clearParameterPool = this->get_override( "clearParameterPool" ) )
-            func_clearParameterPool(  );
-        else{
-            this->IParameterized::clearParameterPool(  );
-        }
-    }
-    
-    void default_clearParameterPool(  ) {
-        IParameterized::clearParameterPool( );
-    }
-
-    virtual bool containsMagneticMaterial(  ) const  {
-        if( bp::override func_containsMagneticMaterial = this->get_override( "containsMagneticMaterial" ) )
-            return func_containsMagneticMaterial(  );
-        else{
-            return this->ISample::containsMagneticMaterial(  );
-        }
-    }
-    
-    bool default_containsMagneticMaterial(  ) const  {
-        return ISample::containsMagneticMaterial( );
-    }
-
-    virtual ::ParameterPool * createParameterTree(  ) const  {
-        if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
-            return func_createParameterTree(  );
-        else{
-            return this->IParameterized::createParameterTree(  );
-        }
-    }
-    
-    ::ParameterPool * default_createParameterTree(  ) const  {
-        return IParameterized::createParameterTree( );
-    }
-
-    virtual ::ICompositeSample * getCompositeSample(  ) {
-        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
-            return func_getCompositeSample(  );
-        else{
-            return this->ICompositeSample::getCompositeSample(  );
-        }
-    }
-    
-    ::ICompositeSample * default_getCompositeSample(  ) {
-        return ICompositeSample::getCompositeSample( );
-    }
-
-    virtual ::ICompositeSample const * getCompositeSample(  ) const  {
-        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
-            return func_getCompositeSample(  );
-        else{
-            return this->ICompositeSample::getCompositeSample(  );
-        }
-    }
-    
-    ::ICompositeSample const * default_getCompositeSample(  ) const  {
-        return ICompositeSample::getCompositeSample( );
-    }
-
-    virtual bool preprocess(  ) {
-        if( bp::override func_preprocess = this->get_override( "preprocess" ) )
-            return func_preprocess(  );
-        else{
-            return this->ISample::preprocess(  );
-        }
-    }
-    
-    bool default_preprocess(  ) {
-        return ISample::preprocess( );
-    }
-
-    virtual void printParameters(  ) const  {
-        if( bp::override func_printParameters = this->get_override( "printParameters" ) )
-            func_printParameters(  );
-        else{
-            this->IParameterized::printParameters(  );
-        }
-    }
-    
-    void default_printParameters(  ) const  {
-        IParameterized::printParameters( );
-    }
-
-    virtual void printSampleTree(  ) {
-        if( bp::override func_printSampleTree = this->get_override( "printSampleTree" ) )
-            func_printSampleTree(  );
-        else{
-            this->ISample::printSampleTree(  );
-        }
-    }
-    
-    void default_printSampleTree(  ) {
-        ISample::printSampleTree( );
-    }
-
-    virtual void registerParameter( ::std::string const & name, double * parpointer, ::AttLimits const & limits=AttLimits::limitless( ) ) {
-        namespace bpl = boost::python;
-        if( bpl::override func_registerParameter = this->get_override( "registerParameter" ) ){
-            bpl::object py_result = bpl::call<bpl::object>( func_registerParameter.ptr(), name, parpointer, limits );
-        }
-        else{
-            IParameterized::registerParameter( name, parpointer, boost::ref(limits) );
-        }
-    }
-    
-    static void default_registerParameter( ::IParameterized & inst, ::std::string const & name, long unsigned int parpointer, ::AttLimits const & limits=AttLimits::limitless( ) ){
-        if( dynamic_cast< ParticleInfo_wrapper * >( boost::addressof( inst ) ) ){
-            inst.::IParameterized::registerParameter(name, reinterpret_cast< double * >( parpointer ), limits);
-        }
-        else{
-            inst.registerParameter(name, reinterpret_cast< double * >( parpointer ), limits);
-        }
-    }
-
-    virtual bool setParameterValue( ::std::string const & name, double value ) {
-        if( bp::override func_setParameterValue = this->get_override( "setParameterValue" ) )
-            return func_setParameterValue( name, value );
-        else{
-            return this->IParameterized::setParameterValue( name, value );
-        }
-    }
-    
-    bool default_setParameterValue( ::std::string const & name, double value ) {
-        return IParameterized::setParameterValue( name, value );
-    }
-
-    virtual void setParametersAreChanged(  ) {
-        if( bp::override func_setParametersAreChanged = this->get_override( "setParametersAreChanged" ) )
-            func_setParametersAreChanged(  );
-        else{
-            this->IParameterized::setParametersAreChanged(  );
-        }
-    }
-    
-    void default_setParametersAreChanged(  ) {
-        IParameterized::setParametersAreChanged( );
-    }
-
-    virtual ::std::size_t size(  ) const  {
-        if( bp::override func_size = this->get_override( "size" ) )
-            return func_size(  );
-        else{
-            return this->ICompositeSample::size(  );
-        }
-    }
-    
-    ::std::size_t default_size(  ) const  {
-        return ICompositeSample::size( );
-    }
-
-    virtual void transferToCPP(  ) {
-        
-        if( !this->m_pyobj) {
-            this->m_pyobj = boost::python::detail::wrapper_base_::get_owner(*this);
-            Py_INCREF(this->m_pyobj);
-        }
-        
-        if( bp::override func_transferToCPP = this->get_override( "transferToCPP" ) )
-            func_transferToCPP(  );
-        else{
-            this->ICloneable::transferToCPP(  );
-        }
-    }
-    
-    void default_transferToCPP(  ) {
-        
-        if( !this->m_pyobj) {
-            this->m_pyobj = boost::python::detail::wrapper_base_::get_owner(*this);
-            Py_INCREF(this->m_pyobj);
-        }
-        
-        ICloneable::transferToCPP( );
-    }
-
-    PyObject* m_pyobj;
-
-};
-
-void register_ParticleInfo_class(){
-
-    { //::ParticleInfo
-        typedef bp::class_< ParticleInfo_wrapper, bp::bases< ICompositeSample >, std::auto_ptr< ParticleInfo_wrapper >, boost::noncopyable > ParticleInfo_exposer_t;
-        ParticleInfo_exposer_t ParticleInfo_exposer = ParticleInfo_exposer_t( "ParticleInfo", "Holds additional information about particle.", bp::init< IParticle const &, bp::optional< double, double > >(( bp::arg("p_particle"), bp::arg("depth")=0.0, bp::arg("abundance")=1.0e+0 )) );
-        bp::scope ParticleInfo_scope( ParticleInfo_exposer );
-        ParticleInfo_exposer.def( bp::init< IParticle const &, kvector_t, bp::optional< double > >(( bp::arg("p_particle"), bp::arg("position"), bp::arg("abundance")=1.0e+0 )) );
-        { //::ParticleInfo::applyTransformation
-        
-            typedef void ( ::ParticleInfo::*applyTransformation_function_type)( ::IRotation const & ) ;
-            
-            ParticleInfo_exposer.def( 
-                "applyTransformation"
-                , applyTransformation_function_type( &::ParticleInfo::applyTransformation )
-                , ( bp::arg("transform") )
-                , "Applies transformation by composing it with the existing one." );
-        
-        }
-        { //::ParticleInfo::clone
-        
-            typedef ::ParticleInfo * ( ::ParticleInfo::*clone_function_type)(  ) const;
-            typedef ::ParticleInfo * ( ParticleInfo_wrapper::*default_clone_function_type)(  ) const;
-            
-            ParticleInfo_exposer.def( 
-                "clone"
-                , clone_function_type(&::ParticleInfo::clone)
-                , default_clone_function_type(&ParticleInfo_wrapper::default_clone)
-                , bp::return_value_policy< bp::manage_new_object >() );
-        
-        }
-        { //::ParticleInfo::cloneInvertB
-        
-            typedef ::ParticleInfo * ( ::ParticleInfo::*cloneInvertB_function_type)(  ) const;
-            typedef ::ParticleInfo * ( ParticleInfo_wrapper::*default_cloneInvertB_function_type)(  ) const;
-            
-            ParticleInfo_exposer.def( 
-                "cloneInvertB"
-                , cloneInvertB_function_type(&::ParticleInfo::cloneInvertB)
-                , default_cloneInvertB_function_type(&ParticleInfo_wrapper::default_cloneInvertB)
-                , bp::return_value_policy< bp::reference_existing_object >() );
-        
-        }
-        { //::ParticleInfo::getAbundance
-        
-            typedef double ( ::ParticleInfo::*getAbundance_function_type)(  ) const;
-            
-            ParticleInfo_exposer.def( 
-                "getAbundance"
-                , getAbundance_function_type( &::ParticleInfo::getAbundance )
-                , "Returns abundance." );
-        
-        }
-        { //::ParticleInfo::getDepth
-        
-            typedef double ( ::ParticleInfo::*getDepth_function_type)(  ) const;
-            
-            ParticleInfo_exposer.def( 
-                "getDepth"
-                , getDepth_function_type( &::ParticleInfo::getDepth )
-                , "Returns depth." );
-        
-        }
-        { //::ParticleInfo::getParticle
-        
-            typedef ::IParticle const * ( ::ParticleInfo::*getParticle_function_type)(  ) const;
-            
-            ParticleInfo_exposer.def( 
-                "getParticle"
-                , getParticle_function_type( &::ParticleInfo::getParticle )
-                , bp::return_value_policy< bp::reference_existing_object >()
-                , "Returns particle." );
-        
-        }
-        { //::ParticleInfo::getPosition
-        
-            typedef ::kvector_t ( ::ParticleInfo::*getPosition_function_type)(  ) const;
-            
-            ParticleInfo_exposer.def( 
-                "getPosition"
-                , getPosition_function_type( &::ParticleInfo::getPosition )
-                , "Returns particle position, including depth." );
-        
-        }
-        { //::ParticleInfo::setAbundance
-        
-            typedef void ( ::ParticleInfo::*setAbundance_function_type)( double ) ;
-            
-            ParticleInfo_exposer.def( 
-                "setAbundance"
-                , setAbundance_function_type( &::ParticleInfo::setAbundance )
-                , ( bp::arg("abundance") )
-                , "Sets abundance." );
-        
-        }
-        { //::ParticleInfo::setAmbientMaterial
-        
-            typedef void ( ::ParticleInfo::*setAmbientMaterial_function_type)( ::IMaterial const & ) ;
-            
-            ParticleInfo_exposer.def( 
-                "setAmbientMaterial"
-                , setAmbientMaterial_function_type( &::ParticleInfo::setAmbientMaterial )
-                , ( bp::arg("material") )
-                , "Sets the ambient material." );
-        
-        }
-        { //::ParticleInfo::setPosition
-        
-            typedef void ( ::ParticleInfo::*setPosition_function_type)( ::kvector_t ) ;
-            
-            ParticleInfo_exposer.def( 
-                "setPosition"
-                , setPosition_function_type( &::ParticleInfo::setPosition )
-                , ( bp::arg("position") )
-                , "Sets particle position, including depth." );
-        
-        }
-        { //::IParameterized::areParametersChanged
-        
-            typedef bool ( ::IParameterized::*areParametersChanged_function_type)(  ) ;
-            typedef bool ( ParticleInfo_wrapper::*default_areParametersChanged_function_type)(  ) ;
-            
-            ParticleInfo_exposer.def( 
-                "areParametersChanged"
-                , areParametersChanged_function_type(&::IParameterized::areParametersChanged)
-                , default_areParametersChanged_function_type(&ParticleInfo_wrapper::default_areParametersChanged) );
-        
-        }
-        { //::IParameterized::clearParameterPool
-        
-            typedef void ( ::IParameterized::*clearParameterPool_function_type)(  ) ;
-            typedef void ( ParticleInfo_wrapper::*default_clearParameterPool_function_type)(  ) ;
-            
-            ParticleInfo_exposer.def( 
-                "clearParameterPool"
-                , clearParameterPool_function_type(&::IParameterized::clearParameterPool)
-                , default_clearParameterPool_function_type(&ParticleInfo_wrapper::default_clearParameterPool) );
-        
-        }
-        { //::ISample::containsMagneticMaterial
-        
-            typedef bool ( ::ISample::*containsMagneticMaterial_function_type)(  ) const;
-            typedef bool ( ParticleInfo_wrapper::*default_containsMagneticMaterial_function_type)(  ) const;
-            
-            ParticleInfo_exposer.def( 
-                "containsMagneticMaterial"
-                , containsMagneticMaterial_function_type(&::ISample::containsMagneticMaterial)
-                , default_containsMagneticMaterial_function_type(&ParticleInfo_wrapper::default_containsMagneticMaterial) );
-        
-        }
-        { //::IParameterized::createParameterTree
-        
-            typedef ::ParameterPool * ( ::IParameterized::*createParameterTree_function_type)(  ) const;
-            typedef ::ParameterPool * ( ParticleInfo_wrapper::*default_createParameterTree_function_type)(  ) const;
-            
-            ParticleInfo_exposer.def( 
-                "createParameterTree"
-                , createParameterTree_function_type(&::IParameterized::createParameterTree)
-                , default_createParameterTree_function_type(&ParticleInfo_wrapper::default_createParameterTree)
-                , bp::return_value_policy< bp::manage_new_object >() );
-        
-        }
-        { //::ICompositeSample::getCompositeSample
-        
-            typedef ::ICompositeSample * ( ::ICompositeSample::*getCompositeSample_function_type)(  ) ;
-            typedef ::ICompositeSample * ( ParticleInfo_wrapper::*default_getCompositeSample_function_type)(  ) ;
-            
-            ParticleInfo_exposer.def( 
-                "getCompositeSample"
-                , getCompositeSample_function_type(&::ICompositeSample::getCompositeSample)
-                , default_getCompositeSample_function_type(&ParticleInfo_wrapper::default_getCompositeSample)
-                , bp::return_value_policy< bp::reference_existing_object >() );
-        
-        }
-        { //::ICompositeSample::getCompositeSample
-        
-            typedef ::ICompositeSample const * ( ::ICompositeSample::*getCompositeSample_function_type)(  ) const;
-            typedef ::ICompositeSample const * ( ParticleInfo_wrapper::*default_getCompositeSample_function_type)(  ) const;
-            
-            ParticleInfo_exposer.def( 
-                "getCompositeSample"
-                , getCompositeSample_function_type(&::ICompositeSample::getCompositeSample)
-                , default_getCompositeSample_function_type(&ParticleInfo_wrapper::default_getCompositeSample)
-                , bp::return_value_policy< bp::reference_existing_object >() );
-        
-        }
-        { //::ISample::preprocess
-        
-            typedef bool ( ::ISample::*preprocess_function_type)(  ) ;
-            typedef bool ( ParticleInfo_wrapper::*default_preprocess_function_type)(  ) ;
-            
-            ParticleInfo_exposer.def( 
-                "preprocess"
-                , preprocess_function_type(&::ISample::preprocess)
-                , default_preprocess_function_type(&ParticleInfo_wrapper::default_preprocess) );
-        
-        }
-        { //::IParameterized::printParameters
-        
-            typedef void ( ::IParameterized::*printParameters_function_type)(  ) const;
-            typedef void ( ParticleInfo_wrapper::*default_printParameters_function_type)(  ) const;
-            
-            ParticleInfo_exposer.def( 
-                "printParameters"
-                , printParameters_function_type(&::IParameterized::printParameters)
-                , default_printParameters_function_type(&ParticleInfo_wrapper::default_printParameters) );
-        
-        }
-        { //::ISample::printSampleTree
-        
-            typedef void ( ::ISample::*printSampleTree_function_type)(  ) ;
-            typedef void ( ParticleInfo_wrapper::*default_printSampleTree_function_type)(  ) ;
-            
-            ParticleInfo_exposer.def( 
-                "printSampleTree"
-                , printSampleTree_function_type(&::ISample::printSampleTree)
-                , default_printSampleTree_function_type(&ParticleInfo_wrapper::default_printSampleTree) );
-        
-        }
-        { //::IParameterized::registerParameter
-        
-            typedef void ( *default_registerParameter_function_type )( ::IParameterized &,::std::string const &,long unsigned int,::AttLimits const & );
-            
-            ParticleInfo_exposer.def( 
-                "registerParameter"
-                , default_registerParameter_function_type( &ParticleInfo_wrapper::default_registerParameter )
-                , ( bp::arg("inst"), bp::arg("name"), bp::arg("parpointer"), bp::arg("limits")=AttLimits::limitless( ) )
-                , "main method to register data address in the pool." );
-        
-        }
-        { //::IParameterized::setParameterValue
-        
-            typedef bool ( ::IParameterized::*setParameterValue_function_type)( ::std::string const &,double ) ;
-            typedef bool ( ParticleInfo_wrapper::*default_setParameterValue_function_type)( ::std::string const &,double ) ;
-            
-            ParticleInfo_exposer.def( 
-                "setParameterValue"
-                , setParameterValue_function_type(&::IParameterized::setParameterValue)
-                , default_setParameterValue_function_type(&ParticleInfo_wrapper::default_setParameterValue)
-                , ( bp::arg("name"), bp::arg("value") ) );
-        
-        }
-        { //::IParameterized::setParametersAreChanged
-        
-            typedef void ( ::IParameterized::*setParametersAreChanged_function_type)(  ) ;
-            typedef void ( ParticleInfo_wrapper::*default_setParametersAreChanged_function_type)(  ) ;
-            
-            ParticleInfo_exposer.def( 
-                "setParametersAreChanged"
-                , setParametersAreChanged_function_type(&::IParameterized::setParametersAreChanged)
-                , default_setParametersAreChanged_function_type(&ParticleInfo_wrapper::default_setParametersAreChanged) );
-        
-        }
-        { //::ICompositeSample::size
-        
-            typedef ::std::size_t ( ::ICompositeSample::*size_function_type)(  ) const;
-            typedef ::std::size_t ( ParticleInfo_wrapper::*default_size_function_type)(  ) const;
-            
-            ParticleInfo_exposer.def( 
-                "size"
-                , size_function_type(&::ICompositeSample::size)
-                , default_size_function_type(&ParticleInfo_wrapper::default_size) );
-        
-        }
-        { //::ICloneable::transferToCPP
-        
-            typedef void ( ::ICloneable::*transferToCPP_function_type)(  ) ;
-            typedef void ( ParticleInfo_wrapper::*default_transferToCPP_function_type)(  ) ;
-            
-            ParticleInfo_exposer.def( 
-                "transferToCPP"
-                , transferToCPP_function_type(&::ICloneable::transferToCPP)
-                , default_transferToCPP_function_type(&ParticleInfo_wrapper::default_transferToCPP) );
-        
-        }
-    }
-
-}
diff --git a/Core/PythonAPI/src/ParticleLayout.pypp.cpp b/Core/PythonAPI/src/ParticleLayout.pypp.cpp
index 513b206025b9b9f8d83b2e4213b737832be1805c..1cd7f115c3945376bdaadb1af60ee5ad28d52b40 100644
--- a/Core/PythonAPI/src/ParticleLayout.pypp.cpp
+++ b/Core/PythonAPI/src/ParticleLayout.pypp.cpp
@@ -116,16 +116,16 @@ struct ParticleLayout_wrapper : ParticleLayout, bp::wrapper< ParticleLayout > {
         return ParticleLayout::getNumberOfParticles( );
     }
 
-    virtual ::ParticleInfo const * getParticleInfo( ::std::size_t index ) const  {
-        if( bp::override func_getParticleInfo = this->get_override( "getParticleInfo" ) )
-            return func_getParticleInfo( index );
+    virtual ::IParticle const * getParticle( ::std::size_t index ) const  {
+        if( bp::override func_getParticle = this->get_override( "getParticle" ) )
+            return func_getParticle( index );
         else{
-            return this->ParticleLayout::getParticleInfo( index );
+            return this->ParticleLayout::getParticle( index );
         }
     }
     
-    ::ParticleInfo const * default_getParticleInfo( ::std::size_t index ) const  {
-        return ParticleLayout::getParticleInfo( index );
+    ::IParticle const * default_getParticle( ::std::size_t index ) const  {
+        return ParticleLayout::getParticle( index );
     }
 
     virtual bool preprocess(  ) {
@@ -358,17 +358,6 @@ void register_ParticleLayout_class(){
                 , ( bp::arg("particle"), bp::arg("depth")=0.0, bp::arg("abundance")=1.0e+0 )
                 , "Adds particle without rotation." );
         
-        }
-        { //::ParticleLayout::addParticleInfo
-        
-            typedef void ( ::ParticleLayout::*addParticleInfo_function_type)( ::ParticleInfo const & ) ;
-            
-            ParticleLayout_exposer.def( 
-                "addParticleInfo"
-                , addParticleInfo_function_type( &::ParticleLayout::addParticleInfo )
-                , ( bp::arg("info") )
-                , "Adds particle info." );
-        
         }
         { //::ParticleLayout::clone
         
@@ -451,15 +440,15 @@ void register_ParticleLayout_class(){
                 , default_getNumberOfParticles_function_type(&ParticleLayout_wrapper::default_getNumberOfParticles) );
         
         }
-        { //::ParticleLayout::getParticleInfo
+        { //::ParticleLayout::getParticle
         
-            typedef ::ParticleInfo const * ( ::ParticleLayout::*getParticleInfo_function_type)( ::std::size_t ) const;
-            typedef ::ParticleInfo const * ( ParticleLayout_wrapper::*default_getParticleInfo_function_type)( ::std::size_t ) const;
+            typedef ::IParticle const * ( ::ParticleLayout::*getParticle_function_type)( ::std::size_t ) const;
+            typedef ::IParticle const * ( ParticleLayout_wrapper::*default_getParticle_function_type)( ::std::size_t ) const;
             
             ParticleLayout_exposer.def( 
-                "getParticleInfo"
-                , getParticleInfo_function_type(&::ParticleLayout::getParticleInfo)
-                , default_getParticleInfo_function_type(&ParticleLayout_wrapper::default_getParticleInfo)
+                "getParticle"
+                , getParticle_function_type(&::ParticleLayout::getParticle)
+                , default_getParticle_function_type(&ParticleLayout_wrapper::default_getParticle)
                 , ( bp::arg("index") )
                 , bp::return_value_policy< bp::reference_existing_object >() );
         
diff --git a/Core/PythonAPI/src/PythonInterface_free_functions.pypp.cpp b/Core/PythonAPI/src/PythonInterface_free_functions.pypp.cpp
index 81ad8dda658de56a55cdd8c9c01f4e5094c6fc52..e28b5b205f9da605b876fb5ca67d7d55e633022c 100644
--- a/Core/PythonAPI/src/PythonInterface_free_functions.pypp.cpp
+++ b/Core/PythonAPI/src/PythonInterface_free_functions.pypp.cpp
@@ -28,6 +28,18 @@ namespace bp = boost::python;
 
 void register_free_functions(){
 
+    { //::CreateProduct
+    
+        typedef ::IRotation * ( *CreateProduct_function_type )( ::IRotation const &,::IRotation const & );
+        
+        bp::def( 
+            "CreateProduct"
+            , CreateProduct_function_type( &::CreateProduct )
+            , ( bp::arg("left"), bp::arg("right") )
+            , bp::return_value_policy< bp::reference_existing_object >() );
+    
+    }
+
     { //::MathFunctions::GenerateNormalRandom
     
         typedef double ( *GenerateNormalRandom_function_type )( double,double );
diff --git a/Core/PythonAPI/src/PythonModule.cpp b/Core/PythonAPI/src/PythonModule.cpp
index b56588902c3ff6bf41eee6df367b0358bae51818..dd2248edd81bf72ab33750024361d73486f32352 100644
--- a/Core/PythonAPI/src/PythonModule.cpp
+++ b/Core/PythonAPI/src/PythonModule.cpp
@@ -121,7 +121,6 @@ GCC_DIAG_ON(missing-field-initializers)
 #include "Lattice.pypp.h"
 #include "AttLimits.pypp.h"
 #include "IInterferenceFunction.pypp.h"
-#include "ParticleInfo.pypp.h"
 #include "Instrument.pypp.h"
 #include "FormFactorInfLongBox.pypp.h"
 #include "FormFactorCone.pypp.h"
@@ -264,7 +263,6 @@ BOOST_PYTHON_MODULE(libBornAgainCore){
     register_ParticleComposition_class();
     register_ParticleCoreShell_class();
     register_ParticleDistribution_class();
-    register_ParticleInfo_class();
     register_ParticleLayout_class();
     register_RealParameterWrapper_class();
     register_ResolutionFunction2DGaussian_class();
diff --git a/Core/Samples/inc/Crystal.h b/Core/Samples/inc/Crystal.h
index 961e1a091eab7716ee1db633de810650c6b47dbf..195679e32fd07719baba50e7d4b78c931122f6bd 100644
--- a/Core/Samples/inc/Crystal.h
+++ b/Core/Samples/inc/Crystal.h
@@ -60,7 +60,7 @@ public:
     void setDWFactor(double dw_factor) { m_dw_factor = dw_factor; }
 
     //! Composes transformation with existing one
-    void applyTransformation(const IRotation& rotation);
+    void applyRotation(const IRotation& rotation);
 
     //! Gets transformation
     const IRotation* getRotation() const {
@@ -76,7 +76,7 @@ private:
     void applyTransformationToSubParticles(const IRotation& rotation);
 
     Lattice m_lattice;
-    std::auto_ptr<IRotation> mP_rotation;
+    boost::scoped_ptr<IRotation> mP_rotation;
     ParticleComposition *mp_lattice_basis;
     double m_dw_factor;
 };
diff --git a/Core/Samples/inc/IClusteredParticles.h b/Core/Samples/inc/IClusteredParticles.h
index af6f4223ee1a70be416d93097fcc94bd8b9d3449..309ee15fbfb01b4927e4f418428b1612b859e047 100644
--- a/Core/Samples/inc/IClusteredParticles.h
+++ b/Core/Samples/inc/IClusteredParticles.h
@@ -18,7 +18,6 @@
 
 #include "IFormFactor.h"
 #include "ICompositeSample.h"
-#include "ParticleInfo.h"
 #include "Exceptions.h"
 
 //! @class IClusteredParticles
@@ -64,7 +63,7 @@ public:
     }
 
     //! Composes transformation with existing one
-    virtual void applyTransformation(const IRotation& rotation)
+    virtual void applyRotation(const IRotation& rotation)
     {
         (void)rotation;
         throw NotImplementedException(
diff --git a/Core/Samples/inc/ILayout.h b/Core/Samples/inc/ILayout.h
index b873f39e3e14f67cdd0eeed7874fe78ea3fb3ae4..c2e62324509b767b9095924fb40d16cba732a138 100644
--- a/Core/Samples/inc/ILayout.h
+++ b/Core/Samples/inc/ILayout.h
@@ -18,7 +18,6 @@
 
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
-#include "ParticleInfo.h"
 #include "SafePointerVector.h"
 
 class IInterferenceFunctionStrategy;
@@ -49,7 +48,7 @@ public:
     virtual size_t getNumberOfParticles() const=0;
 
     //! Returns information about particle with index
-    virtual const ParticleInfo *getParticleInfo(size_t index) const=0;
+    virtual const IParticle *getParticle(size_t index) const=0;
 
     /// Get abundance fraction of particle with index
     virtual double getAbundanceOfParticle(size_t index) const=0;
diff --git a/Core/Samples/inc/IParticle.h b/Core/Samples/inc/IParticle.h
index 2ec2cc8e0a8091f941fa80b9c270def13302facb..11e07fe8f2573c21b21e038566c32333f352358d 100644
--- a/Core/Samples/inc/IParticle.h
+++ b/Core/Samples/inc/IParticle.h
@@ -56,7 +56,25 @@ public:
     //! Create a form factor which includes the particle's shape,
     //! material, ambient material, an optional transformation and an extra
     //! scattering factor
-    virtual IFormFactor *createFormFactor(complex_t wavevector_scattering_factor) const = 0;
+    virtual IFormFactor *createFormFactor(complex_t wavevector_scattering_factor) const=0;
+
+    //! Returns particle position, including depth.
+    kvector_t getPosition() const
+    {
+        return m_position;
+    }
+
+    //! Returns depth of particle
+    double getDepth() const
+    {
+        return -m_position.z();
+    }
+
+    //! Sets particle position, including depth.
+    void setPosition(kvector_t position)
+    {
+        m_position = position;
+    }
 
     //! Returns rotation object
     const IRotation *getRotation() const
@@ -65,42 +83,16 @@ public:
     }
 
     //! Sets transformation.
-    void setTransformation(const IRotation &rotation);
+    void setRotation(const IRotation &rotation);
 
     //! Applies transformation by composing it with the existing one
-    void applyTransformation(const IRotation &roation);
+    void applyRotation(const IRotation &rotation);
 
 protected:
     virtual void applyTransformationToSubParticles(const IRotation &rotation) = 0;
+    IFormFactor *createTransformedFormFactor(const IFormFactor &bare_ff) const;
+    kvector_t m_position;
     boost::scoped_ptr<IRotation> mP_rotation;
 };
 
-inline void IParticle::setTransformation(const IRotation &rotation)
-{
-    if (!mP_rotation.get()) {
-        mP_rotation.reset(rotation.clone());
-        registerChild(mP_rotation.get());
-        applyTransformationToSubParticles(rotation);
-        return;
-    }
-    deregisterChild(mP_rotation.get());
-    boost::scoped_ptr<IRotation> P_inverse_rotation(mP_rotation->createInverse());
-    applyTransformationToSubParticles(*P_inverse_rotation);
-    mP_rotation.reset(rotation.clone());
-    registerChild(mP_rotation.get());
-    applyTransformationToSubParticles(rotation);
-}
-
-inline void IParticle::applyTransformation(const IRotation &rotation)
-{
-    if (mP_rotation.get()) {
-        deregisterChild(mP_rotation.get());
-        mP_rotation.reset(CreateProduct(rotation, *mP_rotation));
-    } else {
-        mP_rotation.reset(rotation.clone());
-    }
-    registerChild(mP_rotation.get());
-    applyTransformationToSubParticles(rotation);
-}
-
 #endif // IPARTICLE_H
diff --git a/Core/Samples/inc/ISampleVisitor.h b/Core/Samples/inc/ISampleVisitor.h
index 4e33ecebf3c6d4b21334f4ff611db2562d3e4c5a..0e4f8639f420e964c8e627aa0c2a0d9e9e17f895 100644
--- a/Core/Samples/inc/ISampleVisitor.h
+++ b/Core/Samples/inc/ISampleVisitor.h
@@ -89,7 +89,7 @@ class FormFactorDecoratorFactor;
 class FormFactorDecoratorMaterial;
 class FormFactorDecoratorMultiPositionFactor;
 class FormFactorDecoratorPositionFactor;
-class FormFactorDecoratorTransformation;
+class FormFactorDecoratorRotation;
 // -
 class IInterferenceFunction;
 class InterferenceFunction1DLattice;
@@ -192,7 +192,7 @@ public:
     virtual void visit(const FormFactorDecoratorMaterial *);
     virtual void visit(const FormFactorDecoratorMultiPositionFactor *);
     virtual void visit(const FormFactorDecoratorPositionFactor *);
-    virtual void visit(const FormFactorDecoratorTransformation *);
+    virtual void visit(const FormFactorDecoratorRotation *);
 
     virtual void visit(const IInterferenceFunction *);
     virtual void visit(const InterferenceFunction1DLattice *);
diff --git a/Core/Samples/inc/Particle.h b/Core/Samples/inc/Particle.h
index d830e0edaf64211c0967d79fffab080ea16a6907..c63b8295e388842656b937889259c819646a0be7 100644
--- a/Core/Samples/inc/Particle.h
+++ b/Core/Samples/inc/Particle.h
@@ -18,7 +18,7 @@
 
 #include "IParticle.h"
 #include "FormFactorDecoratorMaterial.h"
-#include "FormFactorDecoratorTransformation.h"
+#include "FormFactorDecoratorRotation.h"
 #include "IMaterial.h"
 
 #include <boost/scoped_ptr.hpp>
@@ -89,7 +89,6 @@ public:
     }
 
 protected:
-    IFormFactor *createTransformedFormFactor() const;
     //! Propagates a transformation to child particles
     virtual void applyTransformationToSubParticles(const IRotation& rotation);
     boost::scoped_ptr<IMaterial> mP_material;
diff --git a/Core/Samples/inc/ParticleComposition.h b/Core/Samples/inc/ParticleComposition.h
index 92dae500584caf9d668449cf0bd059a9f15f4fab..966b7a1701d3540115e8e1462ba27b0790223daa 100644
--- a/Core/Samples/inc/ParticleComposition.h
+++ b/Core/Samples/inc/ParticleComposition.h
@@ -58,7 +58,7 @@ public:
     }
 
     kvector_t getParticlePosition(size_t index) const
-    { return m_position_vector[check_index(index)]; }
+    { return m_particles[check_index(index)]->getPosition(); }
 
 protected:
     virtual void applyTransformationToSubParticles(const IRotation& rotation);
@@ -66,16 +66,17 @@ protected:
 private:
     //! Checks index
     inline size_t check_index(size_t index) const {
-        return index < m_position_vector.size()
+        return index < m_particles.size()
                 ? index
                 : throw OutOfBoundsException("ParticleComposition::check_index()"
                         "-> Index is out of bounds"); }
 
     //! For internal use in cloneInvertB():
-    void addParticlePointer(IParticle *p_particle, kvector_t position);
+    void addParticlePointer(IParticle *p_particle);
+
+    void addParticleNoPosition(const IParticle& particle);
 
     std::vector<IParticle *> m_particles;
-    std::vector<kvector_t> m_position_vector;
 };
 
 #endif /* PARTICLECOMPOSITION_H_ */
diff --git a/Core/Samples/inc/ParticleDistribution.h b/Core/Samples/inc/ParticleDistribution.h
index e88503ff56de0faafbe4239cc2c1d3593b300314..a3ca505f11b3f17efa0abc158a35fc8078af48f8 100644
--- a/Core/Samples/inc/ParticleDistribution.h
+++ b/Core/Samples/inc/ParticleDistribution.h
@@ -52,13 +52,13 @@ public:
     //! scattering power)
     virtual void setAmbientMaterial(const IMaterial &material)
     {
-        m_particle.setAmbientMaterial(material);
+        mP_particle->setAmbientMaterial(material);
     }
 
     //! Returns particle's material.
     virtual const IMaterial *getAmbientMaterial() const
     {
-        return m_particle.getParticle()->getAmbientMaterial();
+        return mP_particle->getAmbientMaterial();
     }
 
     //! Should not be called for objects of this class:
@@ -67,7 +67,7 @@ public:
     virtual IFormFactor *createFormFactor(complex_t wavevector_scattering_factor) const;
 
     //! Returns list of new particles generated according to a distribution
-    std::vector<ParticleInfo *> generateParticleInfos(kvector_t position, double abundance) const;
+    std::vector<ParticleInfo *> generateParticleInfos(double abundance) const;
 
     //! Returns the distributed parameter data
     ParameterDistribution getParameterDistribution() const
@@ -77,17 +77,17 @@ public:
 
     //! Returns the parameter pool that can be used for parameter distributions
     ParameterPool *createDistributedParameterPool() const {
-        return m_particle.createParameterTree();
+        return mP_particle->createParameterTree();
     }
 
     //! Returns particle.
     const IParticle *getParticle() const
     {
-        return m_particle.getParticle();
+        return mP_particle.get();
     }
 
 protected:
-    ParticleInfo m_particle;
+    boost::scoped_ptr<IParticle> mP_particle;
     ParameterDistribution m_par_distribution;
     //! Propagates a transformation to child particles
     virtual void applyTransformationToSubParticles(const IRotation& rotation);
diff --git a/Core/Samples/inc/ParticleInfo.h b/Core/Samples/inc/ParticleInfo.h
index f3c6e842f13c2228c542c7551e9a1722a76ab69f..a30e3128fd4d64130ef04feebf77b0dc02a4a086 100644
--- a/Core/Samples/inc/ParticleInfo.h
+++ b/Core/Samples/inc/ParticleInfo.h
@@ -19,17 +19,18 @@
 #include "ICompositeSample.h"
 #include "IParticle.h"
 
+#include <boost/scoped_ptr.hpp>
+
 //! @class ParticleInfo
 //! @ingroup samples
 //! @brief Holds additional information about particle.
 //!
 //! Used in ParticleLayout
 
-class BA_CORE_API_ ParticleInfo : public ICompositeSample
+class ParticleInfo : public ICompositeSample
 {
 public:
-    ParticleInfo(const IParticle &p_particle, double depth = 0.0, double abundance = 1.0);
-    ParticleInfo(const IParticle &p_particle, kvector_t position, double abundance = 1.0);
+    ParticleInfo(const IParticle &p_particle, double abundance = 1.0);
 
     virtual ~ParticleInfo()
     {
@@ -55,13 +56,13 @@ public:
     //! Returns depth.
     double getDepth() const
     {
-        return m_depth;
+        return -mP_particle->getPosition().z();
     }
 
     //! Returns particle position, including depth.
     kvector_t getPosition() const
     {
-        return kvector_t(m_x, m_y, -m_depth);
+        return mP_particle->getPosition();
     }
 
     //! Sets particle position, including depth.
@@ -85,18 +86,12 @@ public:
         mP_particle->setAmbientMaterial(material);
     }
 
-    //! Applies transformation by composing it with the existing one
-    void applyTransformation(const IRotation& transform);
-
 protected:
     virtual void init_parameters();
 
     virtual void print(std::ostream &ostr) const;
 
-    std::auto_ptr<IParticle> mP_particle;
-    double m_x;
-    double m_y;
-    double m_depth;
+    boost::scoped_ptr<IParticle> mP_particle;
     double m_abundance;
 };
 
diff --git a/Core/Samples/inc/ParticleLayout.h b/Core/Samples/inc/ParticleLayout.h
index 2b2dde60add66e0666ff3f5111eeb2c75c888271..df968ae1c116947ec2f48b790d61185927abe80e 100644
--- a/Core/Samples/inc/ParticleLayout.h
+++ b/Core/Samples/inc/ParticleLayout.h
@@ -51,9 +51,6 @@ public:
     //! Adds particle without rotation
     void addParticle(const IParticle &particle, double depth = 0.0, double abundance = 1.0);
 
-    //! Adds particle info
-    void addParticleInfo(const ParticleInfo &info);
-
     //! Returns number of particles
     virtual size_t getNumberOfParticles() const
     {
@@ -61,7 +58,7 @@ public:
     }
 
     //! get information about particle with index
-    virtual const ParticleInfo *getParticleInfo(size_t index) const;
+    virtual const IParticle *getParticle(size_t index) const;
 
     //! Get abundance fraction of particle with index
     double getAbundanceOfParticle(size_t index) const;
diff --git a/Core/Samples/src/Crystal.cpp b/Core/Samples/src/Crystal.cpp
index a1a322f30296f35e75ddb1cb0270f90e182c6367..35c93ebc9f187124ca7e31456c0ffd6dd7bd041c 100644
--- a/Core/Samples/src/Crystal.cpp
+++ b/Core/Samples/src/Crystal.cpp
@@ -74,7 +74,7 @@ Lattice Crystal::getTransformedLattice() const
     }
 }
 
-void Crystal::applyTransformation(const IRotation& rotation)
+void Crystal::applyRotation(const IRotation& rotation)
 {
     if (mP_rotation.get()) {
         IRotation *total_rotation = CreateProduct(rotation, *mP_rotation);
@@ -97,5 +97,5 @@ Crystal::Crystal(ParticleComposition* p_lattice_basis, const Lattice& lattice)
 
 void Crystal::applyTransformationToSubParticles(const IRotation& rotation)
 {
-    mp_lattice_basis->applyTransformation(rotation);
+    mp_lattice_basis->applyRotation(rotation);
 }
diff --git a/Core/Samples/src/IParticle.cpp b/Core/Samples/src/IParticle.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7ca9d2f8ab83ee724279dcb0729a05f68a39910d
--- /dev/null
+++ b/Core/Samples/src/IParticle.cpp
@@ -0,0 +1,67 @@
+// ************************************************************************** //
+//
+//  BornAgain: simulate and fit scattering at grazing incidence
+//
+//! @file      Samples/src/IParticle.cpp
+//! @brief     Implements generic member functions of IParticle.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @authors   Scientific Computing Group at MLZ Garching
+//! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+//
+// ************************************************************************** //
+
+#include "IParticle.h"
+#include "IFormFactor.h"
+#include "FormFactorDecoratorRotation.h"
+#include "FormFactorDecoratorPositionFactor.h"
+
+void IParticle::setRotation(const IRotation &rotation)
+{
+    if (!mP_rotation.get()) {
+        mP_rotation.reset(rotation.clone());
+        registerChild(mP_rotation.get());
+        applyTransformationToSubParticles(rotation);
+        return;
+    }
+    deregisterChild(mP_rotation.get());
+    boost::scoped_ptr<IRotation> P_inverse_rotation(mP_rotation->createInverse());
+    applyTransformationToSubParticles(*P_inverse_rotation);
+    mP_rotation.reset(rotation.clone());
+    registerChild(mP_rotation.get());
+    applyTransformationToSubParticles(rotation);
+}
+
+void IParticle::applyRotation(const IRotation &rotation)
+{
+    if (mP_rotation.get()) {
+        deregisterChild(mP_rotation.get());
+        mP_rotation.reset(CreateProduct(rotation, *mP_rotation));
+    } else {
+        mP_rotation.reset(rotation.clone());
+    }
+    m_position = rotation.getTransform3D().transformed(m_position);
+    registerChild(mP_rotation.get());
+    applyTransformationToSubParticles(rotation);
+}
+
+IFormFactor *IParticle::createTransformedFormFactor(const IFormFactor &bare_ff) const
+{
+    IFormFactor *p_bare_clone = bare_ff.clone();
+    IFormFactor *p_intermediate;
+    if (mP_rotation.get()) {
+        p_intermediate = new FormFactorDecoratorRotation(p_bare_clone, *mP_rotation);
+    } else {
+        p_intermediate = p_bare_clone;
+    }
+    IFormFactor *p_result;
+    if (m_position != kvector_t()) {
+        p_result = new FormFactorDecoratorPositionFactor(*p_intermediate, m_position);
+        delete p_intermediate;
+    } else {
+        p_result = p_intermediate;
+    }
+    return p_result;
+}
diff --git a/Core/Samples/src/ISampleVisitor.cpp b/Core/Samples/src/ISampleVisitor.cpp
index 308540ba9cc546a5c5e8aed2323a897450babe65..340017d5be238cfaceaebd044982b14a1f548947 100644
--- a/Core/Samples/src/ISampleVisitor.cpp
+++ b/Core/Samples/src/ISampleVisitor.cpp
@@ -377,9 +377,9 @@ void ISampleVisitor::visit(const FormFactorDecoratorPositionFactor *)
                                   "*) -> Error. Not implemented.");
 }
 
-void ISampleVisitor::visit(const FormFactorDecoratorTransformation *)
+void ISampleVisitor::visit(const FormFactorDecoratorRotation *)
 {
-    throw NotImplementedException("ISampleVisitor::visit(const FormFactorDecoratorTransformation "
+    throw NotImplementedException("ISampleVisitor::visit(const FormFactorDecoratorRotation "
                                   "*) -> Error. Not implemented.");
 }
 
diff --git a/Core/Samples/src/Lattice.cpp b/Core/Samples/src/Lattice.cpp
index 62f036383582b628ce909c4ff147ba670d347672..49f834e2c8a93311deb14d982749d75ed5fdfbc8 100644
--- a/Core/Samples/src/Lattice.cpp
+++ b/Core/Samples/src/Lattice.cpp
@@ -61,7 +61,9 @@ Lattice Lattice::createTransformedLattice(const IRotation& rotation) const
     kvector_t a1 = transform.transformed(m_a1);
     kvector_t a2 = transform.transformed(m_a2);
     kvector_t a3 = transform.transformed(m_a3);
-    return Lattice(a1, a2, a3);
+    Lattice result = Lattice(a1, a2, a3);
+    if (mp_selection_rule) result.setSelectionRule(*mp_selection_rule);
+    return result;
 }
 
 void Lattice::initialize() const
diff --git a/Core/Samples/src/MesoCrystal.cpp b/Core/Samples/src/MesoCrystal.cpp
index f147d804de4a6c1ab283daece4ae0ea3d7a0dbea..e299abf423f3dc021d01b352a9db093cd3759388 100644
--- a/Core/Samples/src/MesoCrystal.cpp
+++ b/Core/Samples/src/MesoCrystal.cpp
@@ -14,6 +14,7 @@
 // ************************************************************************** //
 
 #include "MesoCrystal.h"
+#include "FormFactorDecoratorPositionFactor.h"
 
 MesoCrystal::MesoCrystal(IClusteredParticles* p_particle_structure,
         IFormFactor* p_form_factor)
@@ -21,6 +22,9 @@ MesoCrystal::MesoCrystal(IClusteredParticles* p_particle_structure,
     , mp_meso_form_factor(p_form_factor)
 {
     setName("MesoCrystal");
+    registerParameter("position_x", &m_position[0]);
+    registerParameter("position_y", &m_position[1]);
+    registerParameter("position_z", &m_position[2]);
     registerChild(mp_particle_structure);
     registerChild(mp_meso_form_factor);
 }
@@ -31,6 +35,9 @@ MesoCrystal::MesoCrystal(const IClusteredParticles& particle_structure,
     , mp_meso_form_factor(form_factor.clone())
 {
     setName("MesoCrystal");
+    registerParameter("position_x", &m_position[0]);
+    registerParameter("position_y", &m_position[1]);
+    registerParameter("position_z", &m_position[2]);
     registerChild(mp_particle_structure);
     registerChild(mp_meso_form_factor);
 }
@@ -48,6 +55,7 @@ MesoCrystal* MesoCrystal::clone() const
     if (mP_rotation.get()) {
         p_result->mP_rotation.reset(mP_rotation->clone());
     }
+    p_result->setPosition(m_position);
     return p_result;
 }
 
@@ -58,6 +66,7 @@ MesoCrystal* MesoCrystal::cloneInvertB() const
     if (mP_rotation.get()) {
         p_result->mP_rotation.reset(mP_rotation->clone());
     }
+    p_result->setPosition(m_position);
     return p_result;
 }
 
@@ -75,12 +84,11 @@ const IMaterial *MesoCrystal::getAmbientMaterial() const
 IFormFactor* MesoCrystal::createFormFactor(
         complex_t wavevector_scattering_factor) const
 {
-    return mp_particle_structure->createTotalFormFactor(
-            *mp_meso_form_factor, *getAmbientMaterial(),
-            wavevector_scattering_factor);
+    boost::scoped_ptr<IFormFactor> P_simple_ff(mp_particle_structure->createTotalFormFactor(
+                *mp_meso_form_factor, *getAmbientMaterial(), wavevector_scattering_factor) );
+    return createTransformedFormFactor(*P_simple_ff);
 }
 
-void MesoCrystal::applyTransformationToSubParticles(const IRotation& rotation)
+void MesoCrystal::applyTransformationToSubParticles(const IRotation&)
 {
-    mp_particle_structure->applyTransformation(rotation);
 }
diff --git a/Core/Samples/src/Particle.cpp b/Core/Samples/src/Particle.cpp
index 008fcbd7f4661f4ffd6ada80e5a487b297d6fe96..27b09a35ba4f2b0fc7392f54d990183394d1b542 100644
--- a/Core/Samples/src/Particle.cpp
+++ b/Core/Samples/src/Particle.cpp
@@ -14,33 +14,47 @@
 // ************************************************************************** //
 
 #include "Particle.h"
-#include "ParticleInfo.h"
 #include "Materials.h"
 #include <boost/scoped_ptr.hpp>
 
 Particle::Particle()
 {
     setName("Particle");
+    registerParameter("position_x", &m_position[0]);
+    registerParameter("position_y", &m_position[1]);
+    registerParameter("position_z", &m_position[2]);
 }
 
-Particle::Particle(const IMaterial &p_material) : mP_material(p_material.clone())
+Particle::Particle(const IMaterial &p_material)
+    : mP_material(p_material.clone())
 {
     setName("Particle");
+    registerParameter("position_x", &m_position[0]);
+    registerParameter("position_y", &m_position[1]);
+    registerParameter("position_z", &m_position[2]);
 }
 
 Particle::Particle(const IMaterial &p_material, const IFormFactor &form_factor)
-    : mP_material(p_material.clone()), mP_form_factor(form_factor.clone())
+    : mP_material(p_material.clone())
+    , mP_form_factor(form_factor.clone())
 {
     setName("Particle");
+    registerParameter("position_x", &m_position[0]);
+    registerParameter("position_y", &m_position[1]);
+    registerParameter("position_z", &m_position[2]);
     registerChild(mP_form_factor.get());
 }
 
 Particle::Particle(const IMaterial &p_material, const IFormFactor &form_factor,
                    const IRotation &rotation)
-    : mP_material(p_material.clone()), mP_form_factor(form_factor.clone())
+    : mP_material(p_material.clone())
+    , mP_form_factor(form_factor.clone())
 {
     setName("Particle");
-    mP_rotation.reset(rotation.clone());
+    registerParameter("position_x", &m_position[0]);
+    registerParameter("position_y", &m_position[1]);
+    registerParameter("position_z", &m_position[2]);
+    setRotation(rotation);
     registerChild(mP_form_factor.get());
 }
 
@@ -50,43 +64,47 @@ Particle::~Particle()
 
 Particle *Particle::clone() const
 {
-    Particle *result = new Particle();
+    Particle *p_result = new Particle();
 
     if (mP_form_factor.get())
-        result->setFormFactor(*mP_form_factor);
+        p_result->setFormFactor(*mP_form_factor);
     if (mP_material.get())
-        result->setMaterial(*mP_material);
+        p_result->setMaterial(*mP_material);
     if (mP_ambient_material.get())
-        result->setAmbientMaterial(*mP_ambient_material);
+        p_result->setAmbientMaterial(*mP_ambient_material);
     if (mP_rotation.get())
-        result->setTransformation(*mP_rotation);
-    result->setName(getName());
+        p_result->setRotation(*mP_rotation);
+    p_result->setPosition(m_position);
+    p_result->setName(getName());
 
-    return result;
+    return p_result;
 }
 
 Particle *Particle::cloneInvertB() const
 {
-    Particle *result = new Particle();
+    Particle *p_result = new Particle();
     if (mP_form_factor.get())
-        result->setFormFactor(*mP_form_factor);
+        p_result->setFormFactor(*mP_form_factor);
 
     if (mP_material.get())
-        result->mP_material.reset(Materials::createInvertedMaterial(mP_material.get()));
+        p_result->mP_material.reset(Materials::createInvertedMaterial(mP_material.get()));
     if (mP_ambient_material.get())
-        result->mP_ambient_material.reset(
+        p_result->mP_ambient_material.reset(
             Materials::createInvertedMaterial(mP_ambient_material.get()));
 
     if (mP_rotation.get())
-        result->mP_rotation.reset(mP_rotation->clone());
+        p_result->mP_rotation.reset(mP_rotation->clone());
+    p_result->setPosition(m_position);
 
-    result->setName(getName() + "_inv");
-    return result;
+    p_result->setName(getName() + "_inv");
+    return p_result;
 }
 
 IFormFactor *Particle::createFormFactor(complex_t wavevector_scattering_factor) const
 {
-    IFormFactor *p_transformed_ff = createTransformedFormFactor();
+    if (!mP_form_factor.get())
+        return 0;
+    IFormFactor *p_transformed_ff = createTransformedFormFactor(*mP_form_factor);
     if (!p_transformed_ff) {
         return 0;
     }
@@ -114,19 +132,6 @@ void Particle::setFormFactor(const IFormFactor &form_factor)
     }
 }
 
-IFormFactor *Particle::createTransformedFormFactor() const
-{
-    if (!mP_form_factor.get())
-        return 0;
-    IFormFactor *p_result;
-    if (mP_rotation.get()) {
-        p_result = new FormFactorDecoratorTransformation(mP_form_factor->clone(), *mP_rotation);
-    } else {
-        p_result = mP_form_factor->clone();
-    }
-    return p_result;
-}
-
 void Particle::applyTransformationToSubParticles(const IRotation &rotation)
 {
     (void)rotation;
diff --git a/Core/Samples/src/ParticleComposition.cpp b/Core/Samples/src/ParticleComposition.cpp
index 41fcb76a2bf109ca7fd5d757b48e8736ef3383bc..287f167b021772692d11a9fa38758583f9a37b30 100644
--- a/Core/Samples/src/ParticleComposition.cpp
+++ b/Core/Samples/src/ParticleComposition.cpp
@@ -21,17 +21,26 @@
 ParticleComposition::ParticleComposition()
 {
     setName("ParticleComposition");
+    registerParameter("position_x", &m_position[0]);
+    registerParameter("position_y", &m_position[1]);
+    registerParameter("position_z", &m_position[2]);
 }
 
 ParticleComposition::ParticleComposition(const IParticle& particle)
 {
     setName("ParticleComposition");
+    registerParameter("position_x", &m_position[0]);
+    registerParameter("position_y", &m_position[1]);
+    registerParameter("position_z", &m_position[2]);
     addParticle( particle, kvector_t(0.0, 0.0, 0.0) );
 }
 
 ParticleComposition::ParticleComposition(const IParticle &particle, kvector_t position)
 {
     setName("ParticleComposition");
+    registerParameter("position_x", &m_position[0]);
+    registerParameter("position_y", &m_position[1]);
+    registerParameter("position_z", &m_position[2]);
     addParticle(particle, position);
 }
 
@@ -39,6 +48,9 @@ ParticleComposition::ParticleComposition(const IParticle& particle,
         std::vector<kvector_t> positions)
 {
     setName("ParticleComposition");
+    registerParameter("position_x", &m_position[0]);
+    registerParameter("position_y", &m_position[1]);
+    registerParameter("position_z", &m_position[2]);
     addParticles(particle, positions);
 }
 
@@ -53,7 +65,7 @@ ParticleComposition* ParticleComposition::clone() const
 {
     ParticleComposition *p_new = new ParticleComposition();
     for (size_t index=0; index<m_particles.size(); ++index) {
-        p_new->addParticle(*m_particles[index], m_position_vector[index]);
+        p_new->addParticleNoPosition(*m_particles[index]);
     }
     p_new->setName(getName());
     p_new->setAmbientMaterial(*getAmbientMaterial());
@@ -67,8 +79,7 @@ ParticleComposition* ParticleComposition::cloneInvertB() const
 {
     ParticleComposition *p_new = new ParticleComposition();
     for (size_t index=0; index<m_particles.size(); ++index) {
-        p_new->addParticlePointer(m_particles[index]->cloneInvertB(),
-                m_position_vector[index]);
+        p_new->addParticlePointer(m_particles[index]->cloneInvertB());
     }
     p_new->setName(getName() + "_inv");
 
@@ -85,9 +96,9 @@ ParticleComposition* ParticleComposition::cloneInvertB() const
 void ParticleComposition::addParticle(const IParticle &particle, kvector_t position)
 {
     IParticle *np = particle.clone();
+    np->setPosition(position);
     registerChild(np);
     m_particles.push_back(np);
-    m_position_vector.push_back(position);
 }
 
 void ParticleComposition::addParticles(const IParticle& particle,
@@ -119,8 +130,7 @@ IFormFactor* ParticleComposition::createFormFactor(
         boost::scoped_ptr<IFormFactor> P_particle_ff(
                 m_particles[index]->createFormFactor(
                                       wavevector_scattering_factor));
-        FormFactorDecoratorPositionFactor pos_ff(*P_particle_ff, m_position_vector[index]);
-        p_ff->addFormFactor(pos_ff);
+        p_ff->addFormFactor(*P_particle_ff);
     }
     p_ff->setAmbientMaterial(*getAmbientMaterial());
     return p_ff;
@@ -131,20 +141,20 @@ void ParticleComposition::applyTransformationToSubParticles(const IRotation& rot
     for (std::vector<IParticle *>::iterator it = m_particles.begin();
             it != m_particles.end(); ++it)
     {
-        (*it)->applyTransformation(rotation);
-    }
-    Geometry::Transform3D transform = rotation.getTransform3D();
-    for (std::vector<kvector_t>::iterator it_vec =
-            m_position_vector.begin(); it_vec != m_position_vector.end();
-            ++it_vec) {
-            *it_vec = transform.transformed(*it_vec);
+        (*it)->applyRotation(rotation);
     }
 }
 
-void ParticleComposition::addParticlePointer(IParticle* p_particle, kvector_t position)
+void ParticleComposition::addParticlePointer(IParticle* p_particle)
 {
     registerChild(p_particle);
     m_particles.push_back(p_particle);
-    m_position_vector.push_back(position);
+}
+
+void ParticleComposition::addParticleNoPosition(const IParticle &particle)
+{
+    IParticle *np = particle.clone();
+    registerChild(np);
+    m_particles.push_back(np);
 }
 
diff --git a/Core/Samples/src/ParticleCoreShell.cpp b/Core/Samples/src/ParticleCoreShell.cpp
index 4a3f3dab404e1e2200d9e5917dce9021897d8f25..29c52a51a0af4f8e0a042c1d504858f138a8ef2c 100644
--- a/Core/Samples/src/ParticleCoreShell.cpp
+++ b/Core/Samples/src/ParticleCoreShell.cpp
@@ -26,8 +26,14 @@ ParticleCoreShell::ParticleCoreShell(const Particle& shell,
     , m_relative_core_position(relative_core_position)
 {
     setName("ParticleCoreShell");
+    registerParameter("position_x", &m_position[0]);
+    registerParameter("position_y", &m_position[1]);
+    registerParameter("position_z", &m_position[2]);
     addAndRegisterCore(core);
     addAndRegisterShell(shell);
+    registerParameter("rel_position_x", &m_relative_core_position[0]);
+    registerParameter("rel_position_y", &m_relative_core_position[1]);
+    registerParameter("rel_position_z", &m_relative_core_position[2]);
 }
 
 ParticleCoreShell::~ParticleCoreShell()
@@ -125,10 +131,10 @@ ParticleCoreShell::ParticleCoreShell(kvector_t relative_core_position)
 void ParticleCoreShell::applyTransformationToSubParticles(const IRotation& rotation)
 {
     if (mp_core) {
-        mp_core->applyTransformation(rotation);
+        mp_core->applyRotation(rotation);
     }
     if (mp_shell) {
-        mp_shell->applyTransformation(rotation);
+        mp_shell->applyRotation(rotation);
     }
     Geometry::Transform3D transform = rotation.getTransform3D();
     m_relative_core_position = transform.transformed(m_relative_core_position);
@@ -142,7 +148,7 @@ FormFactorDecoratorMaterial *ParticleCoreShell::getTransformedFormFactor(
     const IRotation *p_rotation = p_particle->getRotation();
     IFormFactor *p_transf_ff = 0;
     if (p_rotation) {
-        p_transf_ff = new FormFactorDecoratorTransformation(
+        p_transf_ff = new FormFactorDecoratorRotation(
                     p_particle->getFormFactor()->clone(), *p_rotation);
     } else {
         p_transf_ff = p_particle->getFormFactor()->clone();
diff --git a/Core/Samples/src/ParticleDistribution.cpp b/Core/Samples/src/ParticleDistribution.cpp
index 6fffdde0f5e02d188695c547fed9da6ce18196b3..31099b964ba935e4028b963ac3e823d87a691d59 100644
--- a/Core/Samples/src/ParticleDistribution.cpp
+++ b/Core/Samples/src/ParticleDistribution.cpp
@@ -20,27 +20,28 @@
 
 ParticleDistribution::ParticleDistribution(const IParticle &prototype,
                                            const ParameterDistribution &par_distr)
-    : m_particle(prototype), m_par_distribution(par_distr)
+    : m_par_distribution(par_distr)
 {
     setName("ParticleDistribution");
-    registerChild(&m_particle);
+    mP_particle.reset(prototype.clone());
+    registerChild(mP_particle.get());
 }
 
 ParticleDistribution::ParticleDistribution(const IParticle &prototype,
                                            const ParameterDistribution &par_distr,
                                            kvector_t position)
-    : m_particle(prototype, position), m_par_distribution(par_distr)
+    : m_par_distribution(par_distr)
 {
-
     setName("ParticleDistribution");
-    registerChild(&m_particle);
+    mP_particle.reset(prototype.clone());
+    mP_particle->setPosition(position);
+    registerChild(mP_particle.get());
 }
 
 ParticleDistribution *ParticleDistribution::clone() const
 {
-    kvector_t position = m_particle.getPosition();
     ParticleDistribution *p_result
-        = new ParticleDistribution(*m_particle.getParticle(), m_par_distribution, position);
+        = new ParticleDistribution(*mP_particle, m_par_distribution);
     return p_result;
 }
 
@@ -57,8 +58,7 @@ IFormFactor *ParticleDistribution::createFormFactor(complex_t wavevector_scatter
                                               "createFormFactor: should never be called");
 }
 
-std::vector<ParticleInfo *> ParticleDistribution::generateParticleInfos(kvector_t position,
-                                                                        double abundance) const
+std::vector<ParticleInfo *> ParticleDistribution::generateParticleInfos(double abundance) const
 {
     std::vector<ParticleInfo *> result;
     boost::scoped_ptr<ParameterPool> P_pool(createDistributedParameterPool() );
@@ -92,10 +92,10 @@ std::vector<ParticleInfo *> ParticleDistribution::generateParticleInfos(kvector_
     for (size_t i = 0; i < main_par_samples.size(); ++i) {
         ParameterSample main_sample = main_par_samples[i];
         double particle_abundance = abundance * main_sample.weight;
-        ParticleInfo *p_particle_info = m_particle.clone();
-        p_particle_info->setPosition(position);
+        ParticleInfo *p_particle_info = new ParticleInfo(*mP_particle);
         p_particle_info->setAbundance(particle_abundance);
-        boost::scoped_ptr<ParameterPool> P_new_pool(p_particle_info->createParameterTree() );
+        boost::scoped_ptr<ParameterPool> P_new_pool(
+                    p_particle_info->getParticle()->createParameterTree() );
         int changed = P_new_pool->setMatchedParametersValue(main_par_name, main_sample.value);
         if (changed != 1) {
             throw Exceptions::RuntimeErrorException(
@@ -121,6 +121,6 @@ std::vector<ParticleInfo *> ParticleDistribution::generateParticleInfos(kvector_
 
 void ParticleDistribution::applyTransformationToSubParticles(const IRotation& rotation)
 {
-    m_particle.applyTransformation(rotation);
+    mP_particle->applyRotation(rotation);
     return;
 }
diff --git a/Core/Samples/src/ParticleInfo.cpp b/Core/Samples/src/ParticleInfo.cpp
index 358e9fd92f792fa43cd45fd087d043ec4d96468a..a07b0158a0122e04b03dcabdd3a9e4662684f634 100644
--- a/Core/Samples/src/ParticleInfo.cpp
+++ b/Core/Samples/src/ParticleInfo.cpp
@@ -16,25 +16,8 @@
 #include "ParticleInfo.h"
 
 
-ParticleInfo::ParticleInfo(const IParticle& p_particle, double depth,
-                           double abundance)
+ParticleInfo::ParticleInfo(const IParticle& p_particle, double abundance)
     : mP_particle(p_particle.clone())
-    , m_x(0.0)
-    , m_y(0.0)
-    , m_depth(depth)
-    , m_abundance(abundance)
-{
-    setName("ParticleInfo");
-    registerChild(mP_particle.get());
-    init_parameters();
-}
-
-ParticleInfo::ParticleInfo(const IParticle &p_particle, kvector_t position,
-                           double abundance)
-    : mP_particle(p_particle.clone())
-    , m_x(position.x())
-    , m_y(position.y())
-    , m_depth(-position.z())
     , m_abundance(abundance)
 {
     setName("ParticleInfo");
@@ -44,42 +27,31 @@ ParticleInfo::ParticleInfo(const IParticle &p_particle, kvector_t position,
 
 ParticleInfo *ParticleInfo::clone() const
 {
-    return new ParticleInfo(*mP_particle, getPosition(), m_abundance);
+    return new ParticleInfo(*mP_particle, m_abundance);
 }
 
 ParticleInfo *ParticleInfo::cloneInvertB() const
 {
     boost::scoped_ptr<IParticle> P_inverted_particle(
                 mP_particle->cloneInvertB());
-    return new ParticleInfo(*P_inverted_particle, getPosition(), m_abundance);
+    return new ParticleInfo(*P_inverted_particle, m_abundance);
 }
 
 void ParticleInfo::setPosition(kvector_t position)
 {
-    m_x = position.x();
-    m_y = position.y();
-    m_depth = -position.z();
-}
-
-void ParticleInfo::applyTransformation(const IRotation &rotation)
-{
-    mP_particle->applyTransformation(rotation);
+    mP_particle->setPosition(position);
 }
 
 void ParticleInfo::init_parameters()
 {
     clearParameterPool();
-    registerParameter("x_position", &m_x);
-    registerParameter("y_position", &m_y);
-    registerParameter("depth", &m_depth);
     registerParameter("abundance", &m_abundance);
 }
 
 void ParticleInfo::print(std::ostream& ostr) const
 {
     ostr << "ParticleInfo:" << getName() << "<" << this << "> : {" <<
-        " depth=" << m_depth <<
-        ", abundance=" << m_abundance;
+        "abundance=" << m_abundance;
     ostr << " }";
 }
 
diff --git a/Core/Samples/src/ParticleLayout.cpp b/Core/Samples/src/ParticleLayout.cpp
index e45afec219ce24e8df6e566c6e1d6ffc9af31493..23c1d11f0cacf288160acaa185a2fea5efd722b9 100644
--- a/Core/Samples/src/ParticleLayout.cpp
+++ b/Core/Samples/src/ParticleLayout.cpp
@@ -78,17 +78,16 @@ ParticleLayout* ParticleLayout::cloneInvertB() const
 
 //! Adds generic particle, &-version.
 void ParticleLayout::addParticle(
-    const IParticle& p_particle, const IRotation& rotation,
+    const IParticle& particle, const IRotation& rotation,
     double depth, double abundance)
 {
-    if(!abundance) {
-        throw LogicErrorException("ParticleLayout::addParticle() ->"
-                " Error! Abundance can't be equal to 0.0");
-    }
-    boost::scoped_ptr<IParticle> P_particle_clone(p_particle.clone());
-    P_particle_clone->setTransformation(rotation);
+    boost::scoped_ptr<IParticle> P_particle_clone(particle.clone());
+    P_particle_clone->setRotation(rotation);
+    kvector_t position = particle.getPosition();
+    position.setZ(position.z()-depth);
+    P_particle_clone->setPosition(position);
     addAndRegisterParticleInfo(
-        new ParticleInfo(*P_particle_clone, depth, abundance));
+        new ParticleInfo(*P_particle_clone, abundance));
 }
 
 //! Adds particle without rotation, &-version.
@@ -96,29 +95,27 @@ void ParticleLayout::addParticle(
     const IParticle& particle,
     double depth, double abundance)
 {
+    boost::scoped_ptr<IParticle> P_particle_clone(particle.clone());
+    kvector_t position = particle.getPosition();
+    position.setZ(position.z()-depth);
+    P_particle_clone->setPosition(position);
     addAndRegisterParticleInfo(
-        new ParticleInfo(particle, depth, abundance));
-}
-
-//! Adds particle info.
-void ParticleLayout::addParticleInfo(const ParticleInfo& info)
-{
-    addAndRegisterParticleInfo( info.clone() );
+        new ParticleInfo(*P_particle_clone, abundance));
 }
 
 //! Returns particle info
-const ParticleInfo* ParticleLayout::getParticleInfo(size_t index) const
+const IParticle* ParticleLayout::getParticle(size_t index) const
 {
     if (index<m_particles.size())
-        return m_particles[index];
+        return m_particles[index]->getParticle();
     throw OutOfBoundsException(
-        "ParticleLayout::getParticleInfo() -> "
+        "ParticleLayout::getParticle() -> "
         "Error! Not so many particles in this decoration.");
 }
 
 double ParticleLayout::getAbundanceOfParticle(size_t index) const
 {
-    return getParticleInfo(index)->getAbundance();
+    return m_particles[index]->getAbundance();
 }
 
 //! Adds interference functions
@@ -179,8 +176,7 @@ void ParticleLayout::replaceParticleDistribution(size_t index)
                     dynamic_cast<const ParticleDistribution *>(
                         p_particle_info->getParticle());
     std::vector<ParticleInfo *> particles =
-        p_particle_coll->generateParticleInfos(
-            p_particle_info->getPosition(), p_particle_info->getAbundance());
+        p_particle_coll->generateParticleInfos(p_particle_info->getAbundance());
     for (size_t i=0; i<particles.size(); ++i) {
         addAndRegisterParticleInfo(particles[i]);
     }
diff --git a/Core/StandardSamples/CylindersBuilder.cpp b/Core/StandardSamples/CylindersBuilder.cpp
index 1018889e4e6aa656ef85e4d64da33f462ca71fd2..b9430c1ee0bf2c77d1fc5231919c3bdb5bbb1a16 100644
--- a/Core/StandardSamples/CylindersBuilder.cpp
+++ b/Core/StandardSamples/CylindersBuilder.cpp
@@ -148,7 +148,7 @@ ISample *CylindersWithSizeDistributionBuilder::buildSample() const
     // to get radius_min = average - 2.0*FWHM:
     double n_sigma = 2.0*2.0*std::sqrt(2.0*std::log(2.0));
     DistributionGaussian gauss(m_radius, sigma);
-    ParameterDistribution par_distr("/ParticleInfo/Particle/FormFactorCylinder/radius", gauss, n_samples, n_sigma);
+    ParameterDistribution par_distr("/Particle/FormFactorCylinder/radius", gauss, n_samples, n_sigma);
     ParticleDistribution particle_collection(nano_particle, par_distr);
     particle_layout.addParticle(particle_collection);
     particle_layout.addInterferenceFunction(new InterferenceFunctionNone());
diff --git a/Core/StandardSamples/IsGISAXS06Builder.cpp b/Core/StandardSamples/IsGISAXS06Builder.cpp
index ee315e8b61fada836f02f9be52e6cd4b5fc00710..3594d2981e74967730c230ccfa1c44cf4230e537 100644
--- a/Core/StandardSamples/IsGISAXS06Builder.cpp
+++ b/Core/StandardSamples/IsGISAXS06Builder.cpp
@@ -135,8 +135,8 @@ ISample *IsGISAXS06Lattice3Builder::buildSample() const
     FormFactorCylinder ff_cyl(5.0*Units::nanometer, 5.0*Units::nanometer);
     kvector_t position(0.0, 0.0, 0.0);
     Particle p(particle_material, ff_cyl);
-    ParticleInfo particle_info(p, position, 1.0);
-    particle_layout.addParticleInfo(particle_info);
+    p.setPosition(position);
+    particle_layout.addParticle(p);
     particle_layout.addInterferenceFunction(p_interference_function);
 
     air_layer.addLayout(particle_layout);
@@ -187,9 +187,9 @@ ISample *IsGISAXS06Lattice4Builder::buildSample() const
     kvector_t position(0.0, 0.0, 0.0);
 
     Particle cylinder(particle_material, ff_cyl);
+    cylinder.setPosition(position);
 
-    ParticleInfo particle_info(cylinder, position, 1.0);
-    particle_layout.addParticleInfo(particle_info);
+    particle_layout.addParticle(cylinder);
 
     particle_layout.addInterferenceFunction(p_interference_function);
 
diff --git a/Core/StandardSamples/IsGISAXS07Builder.cpp b/Core/StandardSamples/IsGISAXS07Builder.cpp
index 501749f50a2f1bdfdd26a4088445abdb4e2ca62b..039b610e3623e36e3b5b793eb5c5128fef101614 100644
--- a/Core/StandardSamples/IsGISAXS07Builder.cpp
+++ b/Core/StandardSamples/IsGISAXS07Builder.cpp
@@ -47,80 +47,80 @@ ISample *IsGISAXS07Builder::buildSample() const
             1.0*Units::nanometer);
     kvector_t pos1(0.0*Units::nanometer, 0.0*Units::nanometer, 0.0);
     Particle p1(particle_material, ff1);
-    ParticleInfo particle_info1(p1, pos1, 0.5);
-    particle_layout.addParticleInfo(particle_info1);
+    p1.setPosition(pos1);
+    particle_layout.addParticle(p1, 0.0, 0.5);
     // add particle number 2:
     FormFactorBox ff2(2.0*Units::nanometer, 4.0*Units::nanometer,
             1.0*Units::nanometer);
     kvector_t pos2(5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
     RotationZ m2(10*Units::degree);
     Particle p2(particle_material, ff2, m2);
-    ParticleInfo particle_info2(p2, pos2, 0.5);
-    particle_layout.addParticleInfo(particle_info2);
+    p2.setPosition(pos2);
+    particle_layout.addParticle(p2, 0.0, 0.5);
     // add particle number 3:
     FormFactorBox ff3(2.0*Units::nanometer, 6.0*Units::nanometer,
             1.0*Units::nanometer);
     kvector_t pos3(-5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
     RotationZ m3(20*Units::degree);
     Particle p3(particle_material, ff3, m3);
-    ParticleInfo particle_info3(p3, pos3, 0.5);
-    particle_layout.addParticleInfo(particle_info3);
+    p3.setPosition(pos3);
+    particle_layout.addParticle(p3, 0.0, 0.5);
     // add particle number 4:
     FormFactorBox ff4(2.0*Units::nanometer, 8.0*Units::nanometer,
             1.0*Units::nanometer);
     kvector_t pos4(5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
     RotationZ m4(30*Units::degree);
     Particle p4(particle_material, ff4, m4);
-    ParticleInfo particle_info4(p4, pos4, 0.5);
-    particle_layout.addParticleInfo(particle_info4);
+    p4.setPosition(pos4);
+    particle_layout.addParticle(p4, 0.0, 0.5);
     // add particle number 5:
     FormFactorBox ff5(2.0*Units::nanometer, 10.0*Units::nanometer,
             1.0*Units::nanometer);
     kvector_t pos5(-5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
     RotationZ m5(40*Units::degree);
     Particle p5(particle_material, ff5, m5);
-    ParticleInfo particle_info5(p5, pos5, 0.5);
-    particle_layout.addParticleInfo(particle_info5);
+    p5.setPosition(pos5);
+    particle_layout.addParticle(p5, 0.0, 0.5);
     // add particle number 6:
     FormFactorBox ff6(2.0*Units::nanometer, 2.0*Units::nanometer,
             1.0*Units::nanometer);
     kvector_t pos6(0.0*Units::nanometer, 0.0*Units::nanometer, 0.0);
     RotationZ m6(50*Units::degree);
     Particle p6(particle_material, ff6, m6);
-    ParticleInfo particle_info6(p6, pos6, 0.5);
-    particle_layout.addParticleInfo(particle_info6);
+    p6.setPosition(pos6);
+    particle_layout.addParticle(p6, 0.0, 0.5);
     // add particle number 7:
     FormFactorBox ff7(2.0*Units::nanometer, 4.0*Units::nanometer,
             1.0*Units::nanometer);
     kvector_t pos7(5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
     RotationZ m7(60*Units::degree);
     Particle p7(particle_material, ff7, m7);
-    ParticleInfo particle_info7(p7, pos7, 0.5);
-    particle_layout.addParticleInfo(particle_info7);
+    p7.setPosition(pos7);
+    particle_layout.addParticle(p7, 0.0, 0.5);
     // add particle number 8:
     FormFactorBox ff8(2.0*Units::nanometer, 6.0*Units::nanometer,
             1.0*Units::nanometer);
     kvector_t pos8(-5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
     RotationZ m8(70*Units::degree);
     Particle p8(particle_material, ff8, m8);
-    ParticleInfo particle_info8(p8, pos8, 0.5);
-    particle_layout.addParticleInfo(particle_info8);
+    p8.setPosition(pos8);
+    particle_layout.addParticle(p8, 0.0, 0.5);
     // add particle number 9:
     FormFactorBox ff9(2.0*Units::nanometer, 8.0*Units::nanometer,
             1.0*Units::nanometer);
     kvector_t pos9(5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
     RotationZ m9(80*Units::degree);
     Particle p9(particle_material, ff9, m9);
-    ParticleInfo particle_info9(p9, pos9, 0.5);
-    particle_layout.addParticleInfo(particle_info9);
+    p9.setPosition(pos9);
+    particle_layout.addParticle(p9, 0.0, 0.5);
     // add particle number 10:
     FormFactorBox ff10(2.0*Units::nanometer, 10.0*Units::nanometer,
             1.0*Units::nanometer);
     kvector_t pos10(-5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
     RotationZ m10(90*Units::degree);
     Particle p10(particle_material, ff10, m10);
-    ParticleInfo particle_info10(p10, pos10, 0.5);
-    particle_layout.addParticleInfo(particle_info10);
+    p10.setPosition(pos10);
+    particle_layout.addParticle(p10, 0.0, 0.5);
     particle_layout.setApproximation(ILayout::ISGISAXSMOR);
 
     air_layer.addLayout(particle_layout);
diff --git a/Core/Tools/inc/SampleMaterialVisitor.h b/Core/Tools/inc/SampleMaterialVisitor.h
index 851485be5c068d4a250e7bdb7abfe654772d08bf..ec07d9c3a06ff5a95c2f1ce1164755ecf2102782 100644
--- a/Core/Tools/inc/SampleMaterialVisitor.h
+++ b/Core/Tools/inc/SampleMaterialVisitor.h
@@ -103,7 +103,7 @@ public:
     void visit(const FormFactorDecoratorMaterial *sample);
     void visit(const FormFactorDecoratorMultiPositionFactor *sample);
     void visit(const FormFactorDecoratorPositionFactor *sample);
-    void visit(const FormFactorDecoratorTransformation *sample);
+    void visit(const FormFactorDecoratorRotation *sample);
 
     void visit(const IInterferenceFunction *sample);
     void visit(const InterferenceFunction1DLattice *sample);
diff --git a/Core/Tools/inc/SamplePrintVisitor.h b/Core/Tools/inc/SamplePrintVisitor.h
index 03ea2314eef42ec838e8148163ef7f030c6115c9..ec2fd4cc4267ff2e8e3ffa20105be67b04573995 100644
--- a/Core/Tools/inc/SamplePrintVisitor.h
+++ b/Core/Tools/inc/SamplePrintVisitor.h
@@ -100,7 +100,7 @@ public:
     void visit(const FormFactorDecoratorMaterial *sample);
     void visit(const FormFactorDecoratorMultiPositionFactor *sample);
     void visit(const FormFactorDecoratorPositionFactor *sample);
-    void visit(const FormFactorDecoratorTransformation *sample);
+    void visit(const FormFactorDecoratorRotation *sample);
 
     void visit(const IInterferenceFunction *sample);
     void visit(const InterferenceFunction1DLattice *sample);
diff --git a/Core/Tools/src/PyGenVisitor.cpp b/Core/Tools/src/PyGenVisitor.cpp
index 95a9e0f75082727d2b49b78ecd0ceb2d2048713e..09aed75324e8412d8a3f34d3761c05d055e4e6db 100644
--- a/Core/Tools/src/PyGenVisitor.cpp
+++ b/Core/Tools/src/PyGenVisitor.cpp
@@ -1172,26 +1172,27 @@ std::string PyGenVisitor::defineParticleLayouts() const
             size_t particleIndex = 0;
 
             while (particleIndex != numberOfParticles) {
-                const ParticleInfo *particleInfo = particleLayout->getParticleInfo(particleIndex);
-                kvector_t pos = particleInfo->getPosition();
+                const IParticle *p_particle = particleLayout->getParticle(particleIndex);
+                double abundance = particleLayout->getAbundanceOfParticle(particleIndex);
+                kvector_t pos = p_particle->getPosition();
                 if (pos.x() != 0.0 || pos.y() != 0.0) {
-                    result << indent() << m_label->getLabel(particleInfo->getParticle())
+                    result << indent() << m_label->getLabel(p_particle)
                            << "_position = kvector_t(" << pos.x() << "*nanometer, " << pos.y()
                            << "*nanometer, " << pos.z() << "*nanometer)\n";
 
-                    result << indent() << m_label->getLabel(particleInfo->getParticle())
+                    result << indent() << m_label->getLabel(p_particle)
                            << "_positionInfo = ParticleInfo("
-                           << m_label->getLabel(particleInfo->getParticle()) << ", "
-                           << m_label->getLabel(particleInfo->getParticle()) << "_position, "
-                           << PyGenTools::printDouble(particleInfo->getAbundance()) << ")\n";
+                           << m_label->getLabel(p_particle) << ", "
+                           << m_label->getLabel(p_particle) << "_position, "
+                           << PyGenTools::printDouble(abundance) << ")\n";
 
                     result << indent() << it->second << ".addParticleInfo("
-                           << m_label->getLabel(particleInfo->getParticle()) << "_positionInfo)\n";
+                           << m_label->getLabel(p_particle) << "_positionInfo)\n";
                 } else {
                     result << indent() << it->second << ".addParticle("
-                           << m_label->getLabel(particleInfo->getParticle()) << ", "
-                           << PyGenTools::printDouble(particleInfo->getDepth()) << ", "
-                           << PyGenTools::printDouble(particleInfo->getAbundance()) << ")\n";
+                           << m_label->getLabel(p_particle) << ", "
+                           << PyGenTools::printDouble(-pos.z()) << ", "
+                           << PyGenTools::printDouble(abundance) << ")\n";
                 }
                 particleIndex++;
             }
diff --git a/Core/Tools/src/SampleMaterialVisitor.cpp b/Core/Tools/src/SampleMaterialVisitor.cpp
index c939473acc5d1cdac3420f5043a7e78ee233c8b8..7f85f6255add5c792fef090abd1cceccdc5987a9 100644
--- a/Core/Tools/src/SampleMaterialVisitor.cpp
+++ b/Core/Tools/src/SampleMaterialVisitor.cpp
@@ -276,7 +276,7 @@ void SampleMaterialVisitor::visit(const FormFactorDecoratorPositionFactor *)
 {
 }
 
-void SampleMaterialVisitor::visit(const FormFactorDecoratorTransformation *)
+void SampleMaterialVisitor::visit(const FormFactorDecoratorRotation *)
 {
 }
 
diff --git a/Core/Tools/src/SamplePrintVisitor.cpp b/Core/Tools/src/SamplePrintVisitor.cpp
index ebcc48e883864b93b89f90a80e6bd719f0c362f8..390b4983f9005f9a4bf45d480a1adda7dbc16227 100644
--- a/Core/Tools/src/SamplePrintVisitor.cpp
+++ b/Core/Tools/src/SamplePrintVisitor.cpp
@@ -379,10 +379,10 @@ void SamplePrintVisitor::visit(const FormFactorDecoratorPositionFactor *)
 }
 
 
-void SamplePrintVisitor::visit(const FormFactorDecoratorTransformation *)
+void SamplePrintVisitor::visit(const FormFactorDecoratorRotation *)
 {
     throw NotImplementedException("SamplePrintVisitor::"
-        "visit(const FormFactorDecoratorTransformation *) -> "
+        "visit(const FormFactorDecoratorRotation *) -> "
         "Error. Not implemented.");
 }
 
diff --git a/Examples/Demos/simul_demo_lattice1.py b/Examples/Demos/simul_demo_lattice1.py
index 7b90f34bf7cb9c913eb136327f0bd30843cdf4c7..a30580ff1599fd3f62095c49a64cb3994a00d693 100644
--- a/Examples/Demos/simul_demo_lattice1.py
+++ b/Examples/Demos/simul_demo_lattice1.py
@@ -21,9 +21,9 @@ def RunSimulation():
     cylinder_ff = FormFactorCylinder(5*nanometer, 5*nanometer)
     cylinder = Particle(mParticle, cylinder_ff.clone())
     position = kvector_t(0.0, 0.0, 0.0)
-    particle_info =  ParticleInfo(cylinder, position, 1.0)
+    cylinder.setPosition(position)
     particle_layout = ParticleLayout()
-    particle_layout.addParticleInfo(particle_info)
+    particle_layout.addParticle(cylinder, 0.0, 1.0)
 
     # interference function
     interference = InterferenceFunction2DLattice.createSquare(10.0*nanometer)
diff --git a/Examples/Demos/simul_demo_lattice2.py b/Examples/Demos/simul_demo_lattice2.py
index ad333ed28894bc8872525512da5db984525357b0..121df2a0efc3c9120d273bb8cb0d529a36d9f7cf 100644
--- a/Examples/Demos/simul_demo_lattice2.py
+++ b/Examples/Demos/simul_demo_lattice2.py
@@ -21,14 +21,14 @@ def RunSimulation():
     cylinder_ff = FormFactorCylinder(5*nanometer, 5*nanometer)
     cylinder = Particle(mParticle, cylinder_ff)
     position = kvector_t(0.0, 0.0, 0.0)
-    particle_info = ParticleInfo(cylinder, position, 1.0)
+    cylinder.setPosition(position)
     particle_layout1 = ParticleLayout()
-    particle_layout1.addParticleInfo(particle_info)
+    particle_layout1.addParticle(cylinder, 0.0, 1.0)
     # particle 2
     position_2 = kvector_t(5.0*nanometer, 5.0*nanometer, 0.0)
-    particle_info.setPosition(position_2)
+    cylinder.setPosition(position_2)
     particle_layout2 = ParticleLayout()
-    particle_layout2.addParticleInfo(particle_info)
+    particle_layout2.addParticle(cylinder, 0.0, 1.0)
 
     # interference function
     interference = InterferenceFunction2DLattice.createSquare(10.0*nanometer)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DLaticeSumOfRotated.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DLatticeSumOfRotated.py
similarity index 96%
rename from Examples/python/simulation/ex03_InterferenceFunctions/Interference2DLaticeSumOfRotated.py
rename to Examples/python/simulation/ex03_InterferenceFunctions/Interference2DLatticeSumOfRotated.py
index ed6500d27a873019ee0517798335215cfee52a36..136a5e6dc9aa471a16ce37fbc90b3347070818b0 100644
--- a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DLaticeSumOfRotated.py
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DLatticeSumOfRotated.py
@@ -28,8 +28,8 @@ def get_sample(xi_value):
     ff_cyl = FormFactorCylinder(3.0*nanometer, 3.0*nanometer)
     position = kvector_t(0.0, 0.0, 0.0)
     cylinder = Particle(m_particle, ff_cyl.clone())
-    particle_info = ParticleInfo(cylinder, position, 1.0)
-    particle_layout.addParticleInfo(particle_info)
+    cylinder.setPosition(position)
+    particle_layout.addParticle(cylinder, 0.0, 1.0)
     particle_layout.addInterferenceFunction(p_interference_function)
 
     air_layer.addLayout(particle_layout)
diff --git a/GUI/coregui/Models/DomainObjectBuilder.cpp b/GUI/coregui/Models/DomainObjectBuilder.cpp
index e235740719a351366abe97a0a344037960dcf0da..f5c781f376990f5064a392b6419cf5635d7b87d1 100644
--- a/GUI/coregui/Models/DomainObjectBuilder.cpp
+++ b/GUI/coregui/Models/DomainObjectBuilder.cpp
@@ -86,11 +86,12 @@ ParticleLayout *DomainObjectBuilder::buildParticleLayout(const ParameterizedItem
             ParameterizedItem *particle_item = children[i];
             boost::scoped_ptr<Particle> P_particle(buildParticle(*particle_item, depth, abundance));
             if (P_particle.get()) {
-                addParticleToLayout(result, particle_item, depth, abundance, *P_particle);
+                result->addParticle(*P_particle, depth, abundance);
             }
         } else if (children[i]->modelType() == Constants::ParticleCoreShellType) {
+            ParameterizedItem *coreshell_item = children[i];
             boost::scoped_ptr<ParticleCoreShell> P_coreshell(
-                buildParticleCoreShell(*children[i], depth, abundance));
+                buildParticleCoreShell(*coreshell_item, depth, abundance));
             if (P_coreshell.get()) {
                 result->addParticle(*P_coreshell, depth, abundance);
             }
@@ -114,11 +115,12 @@ ParticleLayout *DomainObjectBuilder::buildParticleLayout(const ParameterizedItem
                     boost::scoped_ptr<Particle> P_particle(
                         buildParticle(*particle_item, depth, abundance));
                     if (P_particle.get()) {
-                        addParticleToLayout(result, particle_item, depth, abundance, *P_particle);
+                        result->addParticle(*P_particle, depth, abundance);
                     }
                 } else if (grandchildren[0]->modelType() == Constants::ParticleCoreShellType) {
+                    ParameterizedItem *coreshell_item = grandchildren[0];
                     boost::scoped_ptr<ParticleCoreShell> P_coreshell(
-                        buildParticleCoreShell(*grandchildren[0], depth, abundance));
+                        buildParticleCoreShell(*coreshell_item, depth, abundance));
                     if (P_coreshell.get()) {
                         result->addParticle(*P_coreshell, depth, abundance);
                     }
@@ -132,9 +134,9 @@ ParticleLayout *DomainObjectBuilder::buildParticleLayout(const ParameterizedItem
             }
         } else if (children[i]->modelType() == Constants::ParticleCompositionType) {
             boost::scoped_ptr<ParticleComposition> P_part_coll(
-                buildParticleComposition(*children[i], abundance));
+                buildParticleComposition(*children[i], depth, abundance));
             if (P_part_coll.get()) {
-                result->addParticle(*P_part_coll, 0.0, abundance);
+                result->addParticle(*P_part_coll, depth, abundance);
             }
         } else if (children[i]->modelType().startsWith("InterferenceFunction")) {
             boost::scoped_ptr<IInterferenceFunction> P_interference(
@@ -150,15 +152,10 @@ ParticleLayout *DomainObjectBuilder::buildParticleLayout(const ParameterizedItem
     return result;
 }
 
-Particle *DomainObjectBuilder::buildParticle(const ParameterizedItem &item, double &depth,
-                                             double &abundance) const
+void DomainObjectBuilder::setTransformationInfo(IParticle *result, double &depth,
+                                                const ParameterizedItem &item) const
 {
-    Particle *result = TransformToDomain::createParticle(item, depth, abundance);
     QList<ParameterizedItem *> children = item.childItems();
-    if (children.size() > 1) {
-        throw GUIHelpers::Error("DomainObjectBuilder::buildParticle() "
-                                "-> Error! ParticleItem has too many child items.");
-    }
     for (int i = 0; i < children.size(); ++i) {
         if (children[i]->modelType() == Constants::TransformationType) {
             RotationItem *rot_item = dynamic_cast<RotationItem *>(
@@ -170,14 +167,29 @@ Particle *DomainObjectBuilder::buildParticle(const ParameterizedItem &item, doub
             }
             boost::scoped_ptr<IRotation> P_rotation(rot_item->createRotation());
             if (P_rotation.get()) {
-                result->setTransformation(*P_rotation);
+                result->setRotation(*P_rotation);
             }
-        } else {
-            throw GUIHelpers::Error("DomainObjectBuilder::buildParticle() "
-                                    "-> Error! Not implemented");
+            ParameterizedItem *pos_item
+                = children[i]->getSubItems()[TransformationItem::P_POS];
+            double pos_x = pos_item->getRegisteredProperty(VectorItem::P_X).toDouble();
+            double pos_y = pos_item->getRegisteredProperty(VectorItem::P_Y).toDouble();
+            double pos_z = pos_item->getRegisteredProperty(VectorItem::P_Z).toDouble();
+            if (pos_x != 0.0 || pos_y != 0.0) {
+                kvector_t position(pos_x, pos_y, pos_z - depth);
+                result->setPosition(position);
+                depth = 0.0;
+            }
+            break;
         }
     }
-    return result;
+}
+
+Particle *DomainObjectBuilder::buildParticle(const ParameterizedItem &item, double &depth,
+                                             double &abundance) const
+{
+    Particle *p_result = TransformToDomain::createParticle(item, depth, abundance);
+    setTransformationInfo(p_result, depth, item);
+    return p_result;
 }
 
 ParticleCoreShell *DomainObjectBuilder::buildParticleCoreShell(const ParameterizedItem &item,
@@ -203,18 +215,19 @@ ParticleCoreShell *DomainObjectBuilder::buildParticleCoreShell(const Parameteriz
         throw GUIHelpers::Error("DomainObjectBuilder::buildParticleCoreShell() -> Error. Either "
                                 "core or shell particle is undefined.");
 
-    ParticleCoreShell *result = TransformToDomain::createParticleCoreShell(
+    ParticleCoreShell *p_result = TransformToDomain::createParticleCoreShell(
         item, *coreParticle, *shellParticle, depth, abundance);
+    setTransformationInfo(p_result, depth, item);
     delete coreParticle;
     delete shellParticle;
-    return result;
+    return p_result;
 }
 
 ParticleComposition *DomainObjectBuilder::buildParticleComposition(const ParameterizedItem &item,
-                                                                   double &abundance) const
+    double &depth, double &abundance) const
 {
-    ParticleComposition *result
-        = TransformToDomain::createParticleComposition(item, abundance);
+    ParticleComposition *p_result
+        = TransformToDomain::createParticleComposition(item, depth, abundance);
     QList<ParameterizedItem *> children = item.childItems();
     for (int i = 0; i < children.size(); ++i) {
         double tmp_depth(0.0), tmp_abundance(0.0);
@@ -223,21 +236,22 @@ ParticleComposition *DomainObjectBuilder::buildParticleComposition(const Paramet
             boost::scoped_ptr<Particle> P_particle(
                 buildParticle(*particle_item, tmp_depth, tmp_abundance));
             if (P_particle.get()) {
-                addParticleToParticleComposition(result, particle_item, *P_particle); //TODO: add depth
+                addParticleToParticleComposition(p_result, particle_item, tmp_depth, *P_particle);
             }
         } else if (children[i]->modelType() == Constants::ParticleCoreShellType) {
             ParameterizedItem *particle_item = children[i];
             boost::scoped_ptr<ParticleCoreShell> P_coreshell(
                 buildParticleCoreShell(*children[i], tmp_depth, tmp_abundance));
             if (P_coreshell.get()) {
-                addParticleToParticleComposition(result, particle_item, *P_coreshell);
+                addParticleToParticleComposition(p_result, particle_item, tmp_depth, *P_coreshell);
             }
         } else {
             throw GUIHelpers::Error("DomainObjectBuilder::buildParticleComposition()"
                                     " -> Error! Not implemented");
         }
     }
-    return result;
+    setTransformationInfo(p_result, depth, item);
+    return p_result;
 }
 
 //! Creates ParticleDistribution from parameterized item. If catch_errors=true, then
@@ -252,18 +266,20 @@ ParticleDistribution *DomainObjectBuilder::buildParticleDistribution(const Param
     if (children.size() == 0) {
         return p_result;
     }
-    if (children.size() > 1) {
-        throw GUIHelpers::Error("DomainObjectBuilder::buildParticleDistribution()"
-                                " -> Error! Too many particles defined");
-    }
     boost::scoped_ptr<IParticle> P_particle;
-    if (children[0]->modelType() == Constants::ParticleType) {
-        ParameterizedItem *particle_item = children[0];
-        P_particle.reset(buildParticle(*particle_item, depth, abundance));
-    } else if (children[0]->modelType() == Constants::ParticleCoreShellType) {
-        ParameterizedItem *particle_item = children[0];
-        P_particle.reset(buildParticleCoreShell(*particle_item, depth, abundance));
+    for(int i=0; i<children.size(); ++i) {
+        ParameterizedItem *p_child = children[i];
+        if (p_child->modelType() == Constants::ParticleType) {
+            P_particle.reset(buildParticle(*p_child, depth, abundance));
+            if (depth!=0) P_particle->setPosition(kvector_t(0.0, 0.0, -depth));
+            break;
+        } else if (p_child->modelType() == Constants::ParticleCoreShellType) {
+            P_particle.reset(buildParticleCoreShell(*p_child, depth, abundance));
+            if (depth!=0) P_particle->setPosition(kvector_t(0.0, 0.0, -depth));
+            break;
+        }
     }
+
     if (!P_particle.get()) {
         throw GUIHelpers::Error("DomainObjectBuilder::buildParticleDistribution()"
                                 " -> Error! No correct particle defined");
@@ -295,6 +311,7 @@ ParticleDistribution *DomainObjectBuilder::buildParticleDistribution(const Param
     ParameterDistribution par_distr(par_name.toStdString(), *distr, nbr_samples, sigma_factor);
     delete distr;
     p_result = new ParticleDistribution(*P_particle, par_distr);
+    setTransformationInfo(p_result, depth, item);
     return p_result;
 }
 
@@ -331,42 +348,11 @@ Beam *DomainObjectBuilder::buildBeam(const ParameterizedItem &item) const
     return result;
 }
 
-void DomainObjectBuilder::addParticleToLayout(ParticleLayout *result,
-                                              ParameterizedItem *particle_item, double depth,
-                                              double abundance, const Particle &particle) const
-{
-    QList<ParameterizedItem *> particle_children = particle_item->childItems();
-    if (particle_children.size() > 1) {
-        throw GUIHelpers::Error("DomainObjectBuilder::addParticleToLayout() "
-                                "-> Error! ParticleItem has too many child items.");
-    } else if (particle_children.size() == 0) {
-        result->addParticle(particle, depth, abundance);
-    } else {
-        if (particle_children[0]->modelType() == Constants::TransformationType) {
-            ParameterizedItem *pos_item
-                = particle_children[0]->getSubItems()[TransformationItem::P_POS];
-            double pos_x = pos_item->getRegisteredProperty(VectorItem::P_X).toDouble();
-            double pos_y = pos_item->getRegisteredProperty(VectorItem::P_Y).toDouble();
-            double pos_z = pos_item->getRegisteredProperty(VectorItem::P_Z).toDouble();
-            if (pos_x != 0.0 || pos_y != 0.0 || pos_z != 0.0) {
-                kvector_t position(pos_x, pos_y, pos_z);
-                ParticleInfo particle_info(particle, position, abundance);
-                result->addParticleInfo(particle_info);
-            } else {
-                result->addParticle(particle, depth, abundance);
-            }
-        } else {
-            throw GUIHelpers::Error("DomainObjectBuilder::addParticleToLayout() "
-                                    "-> Error! Not implemented");
-        }
-    }
-}
-
 void DomainObjectBuilder::addParticleToParticleComposition(ParticleComposition *result,
                                                            ParameterizedItem *particle_item,
+                                                           double depth,
                                                            const IParticle &particle) const
 {
-    double depth = particle_item->getRegisteredProperty(ParticleItem::P_DEPTH).toDouble();
     QList<ParameterizedItem *> particle_children = particle_item->childItems();
     kvector_t position;
     if (particle_children.size() == 1
diff --git a/GUI/coregui/Models/DomainObjectBuilder.h b/GUI/coregui/Models/DomainObjectBuilder.h
index f768170d70a0007bd09f2c11bc0868d493d40f7e..8b85e49a2b8a2995eaa6f41537613f4291dd40fe 100644
--- a/GUI/coregui/Models/DomainObjectBuilder.h
+++ b/GUI/coregui/Models/DomainObjectBuilder.h
@@ -51,7 +51,7 @@ public:
     ParticleCoreShell *buildParticleCoreShell(const ParameterizedItem &item, double &depth,
                                               double &abundance) const;
     ParticleComposition *buildParticleComposition(const ParameterizedItem &item,
-                                                  double &abundance) const;
+                                                  double &depth, double &abundance) const;
     ParticleDistribution *buildParticleDistribution(const ParameterizedItem &item, double &depth,
                                                     double &abundance,
                                                     bool catch_errors=false) const;
@@ -59,10 +59,9 @@ public:
     Beam *buildBeam(const ParameterizedItem &item) const;
 
 private:
-    void addParticleToLayout(ParticleLayout *result, ParameterizedItem *particle_item, double depth,
-                             double abundance, const Particle &particle) const;
+    void setTransformationInfo(IParticle *result, double &depth, const ParameterizedItem &item) const;
     void addParticleToParticleComposition(ParticleComposition *result,
-                                          ParameterizedItem *particle_item,
+                                          ParameterizedItem *particle_item, double depth,
                                           const IParticle &particle) const;
 };
 
diff --git a/GUI/coregui/Models/GUIObjectBuilder.cpp b/GUI/coregui/Models/GUIObjectBuilder.cpp
index f09ca7c7b196cdf10dd92419ac28f99af73dcdeb..11c1e363a306333fc60ce7133b736b1c282cddbd 100644
--- a/GUI/coregui/Models/GUIObjectBuilder.cpp
+++ b/GUI/coregui/Models/GUIObjectBuilder.cpp
@@ -213,93 +213,27 @@ void GUIObjectBuilder::visit(const Particle *sample)
             particleItem = m_sampleModel->insertNewItem(Constants::ParticleType,
                 m_sampleModel->indexOfItem(parent), -1,
                 ParameterizedItem::PortInfo::PORT_0);
-            const IRotation *p_rotation = sample->getRotation();
-            if (p_rotation) {
-                m_sampleModel->insertNewItem(Constants::TransformationType,
-                                             m_sampleModel->indexOfItem(particleItem));
-            }
         }
         else if(sample == coreshell->getShellParticle()) {
             particleItem = m_sampleModel->insertNewItem(Constants::ParticleType,
                 m_sampleModel->indexOfItem(parent), -1,
                 ParameterizedItem::PortInfo::PORT_1);
-            const IRotation *p_rotation = sample->getRotation();
-            if (p_rotation) {
-                m_sampleModel->insertNewItem(Constants::TransformationType,
-                                             m_sampleModel->indexOfItem(particleItem));
-            }
         } else {
             throw GUIHelpers::Error("GUIObjectBuilder::visit"
              "(const Particle *sample) -> Error. Logically should not be here");
         }
-    }
-    else if(parent->modelType() == Constants::ParticleCompositionType){
-        const ParticleComposition *particle_composition =
-                dynamic_cast<const ParticleComposition *>(m_itemToSample[parent]);
-        Q_ASSERT(particle_composition);
-        size_t index = 0;
-        for (size_t i=0; i<particle_composition->getNbrParticles(); ++i) {
-            if (sample == particle_composition->getParticle(i)) {
-                index = i;
-            }
-        }
-        if (index == 0 && sample != particle_composition->getParticle(0)) {
-            throw GUIHelpers::Error("GUIObjectBuilder::visit"
-             "(const Particle *sample) -> Error. Particle is not part of"
-             " ParticleComposition");
-        }
-        kvector_t position = particle_composition->getParticlePosition(index);
-        particleItem = m_sampleModel->insertNewItem(Constants::ParticleType,
-                                                    m_sampleModel->indexOfItem(parent) );
-        ParameterizedItem *transformation_item =
-                m_sampleModel->insertNewItem(Constants::TransformationType,
-                                             m_sampleModel->indexOfItem(particleItem));
-        ParameterizedItem *p_position_item =
-                transformation_item->getSubItems()[TransformationItem::P_POS];
-        p_position_item->setRegisteredProperty(VectorItem::P_X, position.x());
-        p_position_item->setRegisteredProperty(VectorItem::P_Y, position.y());
-        p_position_item->setRegisteredProperty(VectorItem::P_Z, position.z());
-    }
-    else if(parent->modelType() == Constants::ParticleLayoutType
+    } else if(parent->modelType() == Constants::ParticleCompositionType
+         || parent->modelType() == Constants::ParticleLayoutType
          || parent->modelType() == Constants::ParticleDistributionType) {
         particleItem = m_sampleModel->insertNewItem(Constants::ParticleType,
                                       m_sampleModel->indexOfItem(parent));
-        bool has_position_info = m_sample_encountered[
-                Constants::TransformationType];
-        const IRotation *p_rotation = sample->getRotation();
-        if (has_position_info || p_rotation) {
-            ParameterizedItem *transformation_item =
-                m_sampleModel->insertNewItem(Constants::TransformationType,
-                    m_sampleModel->indexOfItem(particleItem));
-            if (has_position_info) {
-                ParameterizedItem *p_position_item =
-                  transformation_item->getSubItems()[TransformationItem::P_POS];
-                p_position_item->setRegisteredProperty(VectorItem::P_X,
-                     m_propertyToValue[VectorItem::P_X]);
-                p_position_item->setRegisteredProperty(VectorItem::P_Y,
-                     m_propertyToValue[VectorItem::P_Y]);
-                p_position_item->setRegisteredProperty(VectorItem::P_Z,
-                     m_propertyToValue[VectorItem::P_Z]);
-                m_sample_encountered[Constants::TransformationType] = false;
-            }
-        }
-    }
-    else {
+    } else {
         throw GUIHelpers::Error("GUIObjectBuilder::visit"
           "(const Particle *sample) -> Logic error.");
     }
 
-    if(!m_propertyToValue.contains(ParticleItem::P_DEPTH))
-        throw GUIHelpers::Error("GUIObjectBuilder::visit"
-          "(const Particle *sample) -> Error. No depth property.");
-    if(!m_propertyToValue.contains(ParticleItem::P_ABUNDANCE))
-        throw GUIHelpers::Error("GUIObjectBuilder::visit"
-          "(const Particle *sample) -> Error. No abundance property.");
+    buildTransformationInfo(particleItem, sample);
 
-    particleItem->setRegisteredProperty(ParticleItem::P_DEPTH,
-        m_propertyToValue[ParticleItem::P_DEPTH]);
-    particleItem->setRegisteredProperty(ParticleItem::P_ABUNDANCE,
-        m_propertyToValue[ParticleItem::P_ABUNDANCE]);
     particleItem->setItemName(sample->getName().c_str());
     particleItem->setRegisteredProperty(ParticleItem::P_MATERIAL,
         createMaterialFromDomain(sample->getMaterial()).getVariant());
@@ -317,6 +251,8 @@ void GUIObjectBuilder::visit(const ParticleDistribution *sample)
             m_sampleModel->insertNewItem(Constants::ParticleDistributionType,
                                         m_sampleModel->indexOfItem(layoutItem));
     Q_ASSERT(item);
+    buildTransformationInfo(item, sample);
+
     TransformFromDomain::setItemFromSample(item, sample);
     m_levelToParentItem[getLevel()] = item;
     m_itemToSample[item] = sample;
@@ -333,18 +269,8 @@ void GUIObjectBuilder::visit(const ParticleCoreShell *sample)
     ParameterizedItem *coreshellItem =
             m_sampleModel->insertNewItem(Constants::ParticleCoreShellType,
                                          m_sampleModel->indexOfItem(parent));
+    buildTransformationInfo(coreshellItem, sample);
 
-    if(!m_propertyToValue.contains(ParticleItem::P_DEPTH))
-        throw GUIHelpers::Error("GUIObjectBuilder::visit"
-          "(const ParticleCoreShell *sample) -> Error. No depth property.");
-    if(!m_propertyToValue.contains(ParticleItem::P_ABUNDANCE))
-        throw GUIHelpers::Error("GUIObjectBuilder::visit"
-          "(const ParticleCoreShell *sample) -> Error. No abundance property.");
-
-    coreshellItem->setRegisteredProperty(ParticleItem::P_DEPTH,
-                       m_propertyToValue[ParticleItem::P_DEPTH]);
-    coreshellItem->setRegisteredProperty(ParticleItem::P_ABUNDANCE,
-                       m_propertyToValue[ParticleItem::P_ABUNDANCE]);
     coreshellItem->setItemName(sample->getName().c_str());
     kvector_t pos = sample->getRelativeCorePosition();
 
@@ -362,21 +288,17 @@ void GUIObjectBuilder::visit(const ParticleCoreShell *sample)
 void GUIObjectBuilder::visit(const ParticleComposition *sample)
 {
     qDebug() << "GUIObjectBuilder::visit(const ParticleComposition *)"  << getLevel();
+
     ParameterizedItem *parent = m_levelToParentItem[getLevel()-1];
-    ParameterizedItem *item(0);
-    if(parent) {
-        item = m_sampleModel->insertNewItem(Constants::ParticleCompositionType,
+    Q_ASSERT(parent);
+    ParameterizedItem *particle_composition_item = m_sampleModel->insertNewItem(
+                                         Constants::ParticleCompositionType,
                                          m_sampleModel->indexOfItem(parent));
-    } else {
-        item = m_sampleModel->insertNewItem(Constants::ParticleCompositionType);
-    }
-    item->setItemName(sample->getName().c_str());
+    buildTransformationInfo(particle_composition_item, sample);
 
-    item->setRegisteredProperty(ParticleItem::P_ABUNDANCE,
-                                m_propertyToValue[ParticleItem::P_ABUNDANCE]);
-
-    m_levelToParentItem[getLevel()] = item;
-    m_itemToSample[item] = sample;
+    particle_composition_item->setItemName(sample->getName().c_str());
+    m_levelToParentItem[getLevel()] = particle_composition_item;
+    m_itemToSample[particle_composition_item] = sample;
 }
 
 void GUIObjectBuilder::visit(const ParticleInfo *sample)
@@ -385,16 +307,6 @@ void GUIObjectBuilder::visit(const ParticleInfo *sample)
     ParameterizedItem *parent = m_levelToParentItem[getLevel()-1];
     Q_ASSERT(parent);
     m_propertyToValue[ParticleItem::P_ABUNDANCE] = sample->getAbundance();
-    kvector_t position = sample->getPosition();
-    if (position.x()!=0.0 || position.y()!=0.0) {
-        m_sample_encountered[Constants::TransformationType] = true;
-        m_propertyToValue[VectorItem::P_X] = position.x();
-        m_propertyToValue[VectorItem::P_Y] = position.y();
-        m_propertyToValue[VectorItem::P_Z] = position.z();
-        m_propertyToValue[ParticleItem::P_DEPTH] = 0.0;
-    } else {
-        m_propertyToValue[ParticleItem::P_DEPTH] = sample->getDepth();
-    }
     m_levelToParentItem[getLevel()] = parent;
 }
 
@@ -746,6 +658,44 @@ void GUIObjectBuilder::visit(const RotationEuler *sample)
     m_levelToParentItem[getLevel()] = transformation_item;
 }
 
+void GUIObjectBuilder::buildTransformationInfo(ParameterizedItem *particleItem,
+                                               const IParticle *sample)
+{
+    kvector_t position = sample->getPosition();
+    bool has_position_info = (position.x()!=0.0 || position.y()!=0.0);
+    const IRotation *p_rotation = sample->getRotation();
+    if (has_position_info || p_rotation) {
+        ParameterizedItem *transformation_item =
+                m_sampleModel->insertNewItem(Constants::TransformationType,
+                                             m_sampleModel->indexOfItem(particleItem));
+        if (has_position_info) {
+            ParameterizedItem *p_position_item =
+                    transformation_item->getSubItems()[TransformationItem::P_POS];
+            p_position_item->setRegisteredProperty(VectorItem::P_X,
+                                                   sample->getPosition().x());
+            p_position_item->setRegisteredProperty(VectorItem::P_Y,
+                                                   sample->getPosition().y());
+            p_position_item->setRegisteredProperty(VectorItem::P_Z,
+                                                   sample->getPosition().z());
+        }
+    }
+    if (has_position_info) {
+        particleItem->setRegisteredProperty(ParticleItem::P_DEPTH, 0.0);
+    } else {
+        particleItem->setRegisteredProperty(ParticleItem::P_DEPTH, sample->getDepth());
+    }
+    ParameterizedItem *parent = m_levelToParentItem[getLevel()-1];
+    Q_ASSERT(parent);
+    if(parent->modelType() == Constants::ParticleLayoutType) {
+        if(!m_propertyToValue.contains(ParticleItem::P_ABUNDANCE))
+            throw GUIHelpers::Error("GUIObjectBuilder::buildTransformationInfo: "
+              "Error. No abundance property and parent is Layout");
+
+        particleItem->setRegisteredProperty(ParticleItem::P_ABUNDANCE,
+            m_propertyToValue[ParticleItem::P_ABUNDANCE]);
+    }
+}
+
 MaterialProperty GUIObjectBuilder::createMaterialFromDomain(
         const IMaterial *material)
 {
diff --git a/GUI/coregui/Models/GUIObjectBuilder.h b/GUI/coregui/Models/GUIObjectBuilder.h
index f81705502c846df39ab7c72051864fa7129cb623..515796e1a5ad7eda1f815ed71ec464f61b86da32 100644
--- a/GUI/coregui/Models/GUIObjectBuilder.h
+++ b/GUI/coregui/Models/GUIObjectBuilder.h
@@ -96,6 +96,7 @@ public:
     void visit(const RotationEuler *);
 
 private:
+    void buildTransformationInfo(ParameterizedItem *particleItem, const IParticle *sample);
     MaterialProperty createMaterialFromDomain(const IMaterial *);
 
     SampleModel *m_sampleModel;
diff --git a/GUI/coregui/Models/ParticleCompositionItem.cpp b/GUI/coregui/Models/ParticleCompositionItem.cpp
index 92f58407d257057ccb793012b9e9805595868904..377355fccf0d109d6d430b3ffef96a966975e681 100644
--- a/GUI/coregui/Models/ParticleCompositionItem.cpp
+++ b/GUI/coregui/Models/ParticleCompositionItem.cpp
@@ -22,6 +22,8 @@ ParticleCompositionItem::ParticleCompositionItem(ParameterizedItem *parent)
     setItemName(Constants::ParticleCompositionType);
     setItemPort(ParameterizedItem::PortInfo::PORT_0);
 
+    registerProperty(ParticleItem::P_DEPTH, 0.0,
+                     PropertyAttribute(AttLimits::limited(-10000.0, 10000.0), 2));
     registerProperty(ParticleItem::P_ABUNDANCE, 1.0,
                      PropertyAttribute(AttLimits::limited(0.0, 1.0),3));
 
diff --git a/GUI/coregui/Models/ParticleCoreShellItem.cpp b/GUI/coregui/Models/ParticleCoreShellItem.cpp
index 39d996aa09ca21e38495b279d16e4f12c1cac5b0..6654fa7cebe8c5328801f3efe1b690cd0acc5f4e 100644
--- a/GUI/coregui/Models/ParticleCoreShellItem.cpp
+++ b/GUI/coregui/Models/ParticleCoreShellItem.cpp
@@ -26,7 +26,8 @@ ParticleCoreShellItem::ParticleCoreShellItem(ParameterizedItem *parent)
 {
     setItemName(Constants::ParticleCoreShellType);
     setItemPort(ParameterizedItem::PortInfo::PORT_0);
-    registerProperty(ParticleItem::P_DEPTH, 0.0);
+    registerProperty(ParticleItem::P_DEPTH, 0.0,
+                     PropertyAttribute(AttLimits::limited(-10000.0, 10000.0), 2));
     registerProperty(ParticleItem::P_ABUNDANCE, 1.0,
                      PropertyAttribute(AttLimits::limited(0.0, 1.0),3));
 
diff --git a/GUI/coregui/Models/ParticleDistributionItem.cpp b/GUI/coregui/Models/ParticleDistributionItem.cpp
index 82ad2b7728b2bcc61133b28b43855f98b371f16e..944fa0a0051ed4ebfc7a05d21bbf0634be782be4 100644
--- a/GUI/coregui/Models/ParticleDistributionItem.cpp
+++ b/GUI/coregui/Models/ParticleDistributionItem.cpp
@@ -34,6 +34,8 @@ ParticleDistributionItem::ParticleDistributionItem(ParameterizedItem *parent)
     setItemName(Constants::ParticleDistributionType);
     setItemPort(ParameterizedItem::PortInfo::PORT_0);
 
+    registerProperty(ParticleItem::P_DEPTH, 0.0,
+                     PropertyAttribute(AttLimits::limited(-10000.0, 10000.0), 2));
     registerProperty(ParticleItem::P_ABUNDANCE, 1.0,
                      PropertyAttribute(AttLimits::limited(0.0, 1.0), 3));
 
diff --git a/GUI/coregui/Models/TransformToDomain.cpp b/GUI/coregui/Models/TransformToDomain.cpp
index 17a306905f9e1eeb68d417e986830743f1581afd..fa9cdd60ca04070356b9549f5df7f414f5523cab 100644
--- a/GUI/coregui/Models/TransformToDomain.cpp
+++ b/GUI/coregui/Models/TransformToDomain.cpp
@@ -376,8 +376,9 @@ ParticleCoreShell *TransformToDomain::createParticleCoreShell(const Parameterize
 
 
 ParticleComposition *TransformToDomain::createParticleComposition(const ParameterizedItem &item,
-                                                                  double &abundance)
+    double &depth, double &abundance)
 {
+    depth = item.getRegisteredProperty(ParticleItem::P_DEPTH).toDouble();
     abundance = item.getRegisteredProperty(ParticleItem::P_ABUNDANCE).toDouble();
     ParticleComposition *result = new ParticleComposition();
     return result;
diff --git a/GUI/coregui/Models/TransformToDomain.h b/GUI/coregui/Models/TransformToDomain.h
index d1f79cf7715b505f6282e9a693701680b0392ccd..024ae274a1cde84e101f424ec4bfc1374a836ed2 100644
--- a/GUI/coregui/Models/TransformToDomain.h
+++ b/GUI/coregui/Models/TransformToDomain.h
@@ -32,7 +32,7 @@ BA_CORE_API_ Particle *createParticle(const ParameterizedItem &item,
 BA_CORE_API_ ParticleCoreShell *createParticleCoreShell(const ParameterizedItem &item,
         const Particle &core, const Particle &shell, double &depth, double &abundance);
 BA_CORE_API_ ParticleComposition *createParticleComposition(const ParameterizedItem &item,
-                                                            double &abundance);
+                                                            double &depth, double &abundance);
 BA_CORE_API_ IFormFactor *createFormFactor(const ParameterizedItem &item);
 BA_CORE_API_ IDistribution1D * createDistribution(
         const ParameterizedItem &item);
diff --git a/Tests/FunctionalTests/TestPyCore/isgisaxs06.py b/Tests/FunctionalTests/TestPyCore/isgisaxs06.py
index 6ec57aa2eaad4471aa2f6ea720d21ff0d11ff0b0..5a0c6e4c149489562effec626941b2ea510c26bd 100644
--- a/Tests/FunctionalTests/TestPyCore/isgisaxs06.py
+++ b/Tests/FunctionalTests/TestPyCore/isgisaxs06.py
@@ -178,8 +178,8 @@ def build_sample(xi_value):
     ff_cyl = FormFactorCylinder(5.0*nanometer, 5.0*nanometer)
     position = kvector_t(0.0, 0.0, 0.0)
     cylinder = Particle(mParticle, ff_cyl.clone())
-    particle_info = ParticleInfo( cylinder, position, 1.0)
-    particle_layout.addParticleInfo(particle_info)
+    cylinder.setPosition(position)
+    particle_layout.addParticle(cylinder)
     particle_layout.addInterferenceFunction(p_interference_function)
 
     air_layer.addLayout(particle_layout)
diff --git a/Tests/FunctionalTests/TestPyCore/isgisaxs07.py b/Tests/FunctionalTests/TestPyCore/isgisaxs07.py
index ba02d1ea3e177f00f247aff7385994d4e3a64a5a..0c7490d353e4ca2ff998a3e4c308f2deac7360c9 100644
--- a/Tests/FunctionalTests/TestPyCore/isgisaxs07.py
+++ b/Tests/FunctionalTests/TestPyCore/isgisaxs07.py
@@ -24,74 +24,74 @@ def RunSimulation():
     particle_layout = ParticleLayout()
 
     # add particle number 1:
-    ff1 = FormFactorBox(2.0*nanometer, 2.0*nanometer,1.0*nanometer)
+    ff1 = FormFactorBox(2.0*nanometer, 2.0*nanometer, 1.0*nanometer)
     pos1 = kvector_t(0.0*nanometer, 0.0*nanometer, 0.0)
     particle1 = Particle(mParticle, ff1)
-    particle_info1 = ParticleInfo(particle1, pos1, 0.5)
-    particle_layout.addParticleInfo(particle_info1)
+    particle1.setPosition(pos1)
+    particle_layout.addParticle(particle1, 0.0, 0.5)
     #add particle number 2:
-    ff2 = FormFactorBox(2.0*nanometer, 4.0*nanometer,1.0*nanometer)
+    ff2 = FormFactorBox(2.0*nanometer, 4.0*nanometer, 1.0*nanometer)
     pos2 = kvector_t(5.0*nanometer, 5.0*nanometer, 0.0)
     p_rot2 = RotationZ(10*degree)
     particle2 = Particle(mParticle, ff2, p_rot2)   
-    particle_info2 = ParticleInfo(particle2, pos2, 0.5)
-    particle_layout.addParticleInfo(particle_info2)
+    particle2.setPosition(pos2)
+    particle_layout.addParticle(particle2, 0.0, 0.5)
     #add particle number 3:
-    ff3 = FormFactorBox(2.0*nanometer, 6.0*nanometer,1.0*nanometer)
+    ff3 = FormFactorBox(2.0*nanometer, 6.0*nanometer, 1.0*nanometer)
     pos3 = kvector_t(-5.0*nanometer, -5.0*nanometer, 0.0)
     p_rot3 = RotationZ(20*degree)
     particle3 = Particle(mParticle, ff3, p_rot3)
-    particle_info3 = ParticleInfo(particle3, pos3, 0.5)
-    particle_layout.addParticleInfo(particle_info3)
+    particle3.setPosition(pos3)
+    particle_layout.addParticle(particle3, 0.0, 0.5)
     #add particle number 4:
-    ff4 = FormFactorBox(2.0*nanometer, 8.0*nanometer,1.0*nanometer)
+    ff4 = FormFactorBox(2.0*nanometer, 8.0*nanometer, 1.0*nanometer)
     pos4 = kvector_t(5.0*nanometer, -5.0*nanometer, 0.0)
     p_rot4 = RotationZ(30*degree)
     particle4 = Particle(mParticle, ff4, p_rot4)   
-    particle_info4 = ParticleInfo(particle4, pos4, 0.5)
-    particle_layout.addParticleInfo(particle_info4)
+    particle4.setPosition(pos4)
+    particle_layout.addParticle(particle4, 0.0, 0.5)
     #add particle number 5:
-    ff5 = FormFactorBox(2.0*nanometer, 10.0*nanometer,1.0*nanometer)
+    ff5 = FormFactorBox(2.0*nanometer, 10.0*nanometer, 1.0*nanometer)
     pos5 = kvector_t(-5.0*nanometer, 5.0*nanometer, 0.0)
     p_rot5 = RotationZ(40*degree)
     particle5 = Particle(mParticle, ff5, p_rot5)   
-    particle_info5 = ParticleInfo(particle5, pos5, 0.5)
-    particle_layout.addParticleInfo(particle_info5)
+    particle5.setPosition(pos5)
+    particle_layout.addParticle(particle5, 0.0, 0.5)
     #add particle number 6:
-    ff6 = FormFactorBox(2.0*nanometer, 2.0*nanometer,1.0*nanometer)
+    ff6 = FormFactorBox(2.0*nanometer, 2.0*nanometer, 1.0*nanometer)
     pos6 = kvector_t(0.0*nanometer, 0.0*nanometer, 0.0)
     p_rot6 = RotationZ(50*degree)
     particle6 = Particle(mParticle, ff6, p_rot6)   
-    particle_info6 = ParticleInfo(particle6, pos6, 0.5)
-    particle_layout.addParticleInfo(particle_info6)
+    particle6.setPosition(pos6)
+    particle_layout.addParticle(particle6, 0.0, 0.5)
     #add particle number 7:
-    ff7 = FormFactorBox(2.0*nanometer, 4.0*nanometer,1.0*nanometer)
+    ff7 = FormFactorBox(2.0*nanometer, 4.0*nanometer, 1.0*nanometer)
     pos7 = kvector_t(5.0*nanometer, 5.0*nanometer, 0.0)
     p_rot7 = RotationZ(60*degree)
     particle7 = Particle(mParticle, ff7, p_rot7)
-    particle_info7 = ParticleInfo(particle7, pos7, 0.5)
-    particle_layout.addParticleInfo(particle_info7)
+    particle7.setPosition(pos7)
+    particle_layout.addParticle(particle7, 0.0, 0.5)
     #add particle number 8:
-    ff8 = FormFactorBox(2.0*nanometer, 6.0*nanometer,1.0*nanometer)
+    ff8 = FormFactorBox(2.0*nanometer, 6.0*nanometer, 1.0*nanometer)
     pos8 = kvector_t(-5.0*nanometer, -5.0*nanometer, 0.0)
     p_rot8 = RotationZ(70*degree)
     particle8 = Particle(mParticle, ff8, p_rot8)    
-    particle_info8 = ParticleInfo(particle8 , pos8, 0.5)
-    particle_layout.addParticleInfo(particle_info8)
+    particle8.setPosition(pos8)
+    particle_layout.addParticle(particle8, 0.0, 0.5)
     #add particle number 9:
-    ff9 = FormFactorBox(2.0*nanometer, 8.0*nanometer,1.0*nanometer)
+    ff9 = FormFactorBox(2.0*nanometer, 8.0*nanometer, 1.0*nanometer)
     pos9 = kvector_t(5.0*nanometer, -5.0*nanometer, 0.0)
     p_rot9 = RotationZ(80*degree)
     particle9 = Particle(mParticle, ff9, p_rot9)     
-    particle_info9 = ParticleInfo(particle9, pos9, 0.5)
-    particle_layout.addParticleInfo(particle_info9)
+    particle9.setPosition(pos9)
+    particle_layout.addParticle(particle9, 0.0, 0.5)
     #add particle number 10:
-    ff10 = FormFactorBox(2.0*nanometer, 10.0*nanometer,1.0*nanometer)
+    ff10 = FormFactorBox(2.0*nanometer, 10.0*nanometer, 1.0*nanometer)
     pos10 = kvector_t(-5.0*nanometer, 5.0*nanometer, 0.0)
     p_rot10 = RotationZ(90*degree)
     particle10 = Particle(mParticle, ff10, p_rot10)
-    particle_info10 = ParticleInfo(particle10, pos10, 0.5)
-    particle_layout.addParticleInfo(particle_info10)
+    particle10.setPosition(pos10)
+    particle_layout.addParticle(particle10, 0.0, 0.5)
 
     particle_layout.setApproximation(ILayout.ISGISAXSMOR)
 
diff --git a/Tests/FunctionalTests/TestPyCore/mesocrystal1.py b/Tests/FunctionalTests/TestPyCore/mesocrystal1.py
index 795233ad018484c4c07c67ea635a3d95c00355bb..b625c6d7c08fd324ac99bd8625241630be1b2c96 100644
--- a/Tests/FunctionalTests/TestPyCore/mesocrystal1.py
+++ b/Tests/FunctionalTests/TestPyCore/mesocrystal1.py
@@ -118,8 +118,6 @@ class MySampleBuilder(ISampleBuilder):
         ff_sphere = FormFactorSphereGaussianRadius(self.nanoparticle_radius.value, self.sigma_nanoparticle_radius.value)
         particle = Particle(mParticle, ff_sphere )
         position_0 = kvector_t(0.0, 0.0, 0.0)
-        position_1 = kvector_t(0.0, 0.0, 0.0)
-        position_2 = kvector_t(0.0, 0.0, 0.0)        
         position_1 = 1.0/3.0*(2.0*bas_a + bas_b + bas_c)
         position_2 = 1.0/3.0*(bas_a + 2.0*bas_b + 2.0*bas_c)
         positions = [ position_0, position_1, position_2 ]
diff --git a/Tests/UnitTests/TestCore/ParticleCoreShellTest.h b/Tests/UnitTests/TestCore/ParticleCoreShellTest.h
index e5f703b0a1255994e1f47629fe55675ba6b590fd..47edc373b2a7da8096a31c06095f3d41598f23ae 100644
--- a/Tests/UnitTests/TestCore/ParticleCoreShellTest.h
+++ b/Tests/UnitTests/TestCore/ParticleCoreShellTest.h
@@ -75,7 +75,7 @@ TEST_F(ParticleCoreShellTest, Transform)
 {
     kvector_t zero_vector;
     RotationZ transform(1.0);
-    mp_coreshell->setTransformation(transform);
+    mp_coreshell->setRotation(transform);
     EXPECT_EQ(NULL, mp_coreshell->getAmbientMaterial());
     EXPECT_EQ(NULL, mp_coreshell->createFormFactor(1.0));
     Geometry::Transform3D transform_2 = mp_coreshell->getRotation()->getTransform3D();
diff --git a/Tests/UnitTests/TestCore/ParticleInfoTest.h b/Tests/UnitTests/TestCore/ParticleInfoTest.h
index 9449de8a5e79918e9e1e5519488e6e907ce623c7..33c36ac4b2ae535a6c3d914f4978f78bcef9aa03 100644
--- a/Tests/UnitTests/TestCore/ParticleInfoTest.h
+++ b/Tests/UnitTests/TestCore/ParticleInfoTest.h
@@ -30,12 +30,6 @@ TEST_F(ParticleInfoTest , ParticleInfoInitialState)
     particleInfo.setAbundance(2.0);
     EXPECT_EQ(position, particleInfo.getPosition());
     EXPECT_EQ(2.0, particleInfo.getAbundance());
-
-    ParticleInfo particleInfo2(particle,2.0,3.0);
-
-    EXPECT_EQ(-2.0, particleInfo2.getPosition().z());
-    EXPECT_EQ(3.0, particleInfo2.getAbundance());
-    EXPECT_EQ("ParticleInfo", particleInfo2.getName());
 }
 
 
@@ -46,10 +40,8 @@ TEST_F(ParticleInfoTest , ParticleInfoTestPool)
 
     ParticleInfo particleInfo(particle);
 
-    particleInfo.setParameterValue("/ParticleInfo/depth",4.1);
     particleInfo.setParameterValue("/ParticleInfo/abundance",4.2);
 
-    EXPECT_EQ(4.1, particleInfo.getDepth());
     EXPECT_EQ(4.2, particleInfo.getAbundance());
     EXPECT_EQ("ParticleInfo", particleInfo.getName());
 }
@@ -62,10 +54,9 @@ TEST_F(ParticleInfoTest , ParticleInfoInitialStateClonedParticle)
     Particle particle;
     Particle *pClone = particle.clone();
 
-    ParticleInfo particleInfo(*pClone,2.0,3.0);
+    ParticleInfo particleInfo(*pClone,3.0);
     delete pClone;
 
-    EXPECT_EQ(2.0, particleInfo.getDepth());
     EXPECT_EQ(3.0, particleInfo.getAbundance());
     EXPECT_EQ("ParticleInfo", particleInfo.getName());
 }
@@ -76,7 +67,7 @@ TEST_F(ParticleInfoTest , ParticleInfoClone)
     //test with default parameter
     Particle particle;
 
-    ParticleInfo original(particle, 1.0,2.0);
+    ParticleInfo original(particle, 2.0);
     ParticleInfo *clone = original.clone();
 
     EXPECT_EQ(clone->getDepth(), original.getDepth());
@@ -92,7 +83,7 @@ TEST_F(ParticleInfoTest , ParticleInfoCloneInvertB)
 {
     HomogeneousMaterial mat("Air",0,0);
     Particle particle2(mat);
-    ParticleInfo particle_info2(particle2, 1.0,2.0);
+    ParticleInfo particle_info2(particle2, 2.0);
     ParticleInfo *clone = particle_info2.cloneInvertB();
     EXPECT_EQ(clone->getDepth(), particle_info2.getDepth());
     EXPECT_EQ(clone->getAbundance(), particle_info2.getAbundance());
diff --git a/Tests/UnitTests/TestCore/ParticleLayoutTest.h b/Tests/UnitTests/TestCore/ParticleLayoutTest.h
index 8564d06ddd01038f517597ea3c9356b94438bb59..6486244c4fc5b554c13bdd17c156ab4f08728e56 100644
--- a/Tests/UnitTests/TestCore/ParticleLayoutTest.h
+++ b/Tests/UnitTests/TestCore/ParticleLayoutTest.h
@@ -34,10 +34,10 @@ TEST_F(ParticleLayoutTest, ParticleLayoutInitByValue)
     EXPECT_EQ(size_t(0), particleDecoration.getNumberOfInterferenceFunctions());
 
 
-    const ParticleInfo * pInfo = particleDecoration.getParticleInfo(size_t(0));
-    EXPECT_TRUE(NULL!=pInfo);
-    EXPECT_EQ(1.0, pInfo->getDepth());
-    EXPECT_EQ(2.0, pInfo->getAbundance());
+    const IParticle * p_particle = particleDecoration.getParticle(size_t(0));
+    EXPECT_TRUE(NULL!=p_particle);
+    EXPECT_EQ(1.0, p_particle->getDepth());
+    EXPECT_EQ(2.0, particleDecoration.getAbundanceOfParticle(size_t(0)));
 
     EXPECT_EQ(size_t(0), particleDecoration.getNumberOfInterferenceFunctions());
 
@@ -55,10 +55,10 @@ TEST_F(ParticleLayoutTest, ParticleLayoutInitByRef)
     EXPECT_EQ(size_t(0), particleDecoration.getNumberOfInterferenceFunctions());
 
 
-    const ParticleInfo * pInfo = particleDecoration.getParticleInfo(size_t(0));
-    EXPECT_TRUE(NULL!=pInfo);
-    EXPECT_EQ(3.0, pInfo->getDepth());
-    EXPECT_EQ(-2.0, pInfo->getAbundance());
+    const IParticle * p_particle = particleDecoration.getParticle(size_t(0));
+    EXPECT_TRUE(NULL!=p_particle);
+    EXPECT_EQ(3.0, p_particle->getDepth());
+    EXPECT_EQ(-2.0, particleDecoration.getAbundanceOfParticle(size_t(0)));
 }
 
 
@@ -67,26 +67,24 @@ TEST_F(ParticleLayoutTest, ParticleLayoutAddParticleInfo)
     ParticleLayout particleDecoration;
 
     Particle particle;
-    ParticleInfo particleInfo(particle, 0.1,-2.0);
-    particleDecoration.addParticleInfo(particleInfo);
+    particleDecoration.addParticle(particle, 0.1, -2.0);
 
     EXPECT_EQ(size_t(1), particleDecoration.getNumberOfParticles());
 
     Particle particle2;
-    ParticleInfo particleInfo2(particle2, 5.0,0.1);
-    particleDecoration.addParticleInfo(particleInfo2);
+    particleDecoration.addParticle(particle2, 5.0,0.1);
 
     EXPECT_EQ(size_t(2), particleDecoration.getNumberOfParticles());
 
-    const ParticleInfo * pInfo = particleDecoration.getParticleInfo(size_t(0));
-    EXPECT_TRUE(NULL!=pInfo);
-    EXPECT_EQ(0.1, pInfo->getDepth());
-    EXPECT_EQ(-2.0, pInfo->getAbundance());
+    const IParticle * p_particle = particleDecoration.getParticle(size_t(0));
+    EXPECT_TRUE(NULL!=p_particle);
+    EXPECT_EQ(0.1, p_particle->getDepth());
+    EXPECT_EQ(-2.0, particleDecoration.getAbundanceOfParticle(size_t(0)));
 
-    const ParticleInfo * pInfo2 = particleDecoration.getParticleInfo(size_t(1));
-    EXPECT_TRUE(NULL!=pInfo2);
-    EXPECT_EQ(5.0, pInfo2->getDepth());
-    EXPECT_EQ(0.1, pInfo2->getAbundance());
+    const IParticle * p_particle2 = particleDecoration.getParticle(size_t(1));
+    EXPECT_TRUE(NULL!=p_particle2);
+    EXPECT_EQ(5.0, p_particle2->getDepth());
+    EXPECT_EQ(0.1, particleDecoration.getAbundanceOfParticle(size_t(1)));
 }
 
 
@@ -109,29 +107,29 @@ TEST_F(ParticleLayoutTest, ParticleLayoutAddParticle)
 
     EXPECT_EQ(size_t(4), particleDecoration.getNumberOfParticles());
 
-    const ParticleInfo * pInfo1 = particleDecoration.getParticleInfo(size_t(0));
-    EXPECT_TRUE(NULL!=pInfo1);
-    EXPECT_EQ(0.0, pInfo1->getDepth());
-    EXPECT_EQ(1.0, pInfo1->getAbundance());
-    EXPECT_TRUE(NULL == pInfo1->getParticle()->getRotation());
-
-    const ParticleInfo * pInfo2 = particleDecoration.getParticleInfo(size_t(1));
-    EXPECT_TRUE(NULL!=pInfo2);
-    EXPECT_EQ(2.1, pInfo2->getDepth());
-    EXPECT_EQ(2.2, pInfo2->getAbundance());
-    EXPECT_TRUE(NULL == pInfo2->getParticle()->getRotation());
-
-    const ParticleInfo * pInfo3 = particleDecoration.getParticleInfo(size_t(2));
-    EXPECT_TRUE(NULL!=pInfo3);
-    EXPECT_EQ(0.0, pInfo3->getDepth());
-    EXPECT_EQ(1.0, pInfo3->getAbundance());
-    EXPECT_TRUE(NULL != pInfo3->getParticle()->getRotation());
-
-    const ParticleInfo * pInfo4 = particleDecoration.getParticleInfo(size_t(3));
-    EXPECT_TRUE(NULL!=pInfo4);
-    EXPECT_EQ(4.1, pInfo4->getDepth());
-    EXPECT_EQ(-4.2, pInfo4->getAbundance());
-    EXPECT_TRUE(NULL != pInfo4->getParticle()->getRotation());
+    const IParticle * p_particle1 = particleDecoration.getParticle(size_t(0));
+    EXPECT_TRUE(NULL!=p_particle1);
+    EXPECT_EQ(0.0, p_particle1->getDepth());
+    EXPECT_EQ(1.0, particleDecoration.getAbundanceOfParticle(size_t(0)));
+    EXPECT_TRUE(NULL == p_particle1->getRotation());
+
+    const IParticle * p_particle2 = particleDecoration.getParticle(size_t(1));
+    EXPECT_TRUE(NULL!=p_particle2);
+    EXPECT_EQ(2.1, p_particle2->getDepth());
+    EXPECT_EQ(2.2, particleDecoration.getAbundanceOfParticle(size_t(1)));
+    EXPECT_TRUE(NULL == p_particle2->getRotation());
+
+    const IParticle * p_particle3 = particleDecoration.getParticle(size_t(2));
+    EXPECT_TRUE(NULL!=p_particle3);
+    EXPECT_EQ(0.0, p_particle3->getDepth());
+    EXPECT_EQ(1.0, particleDecoration.getAbundanceOfParticle(size_t(2)));
+    EXPECT_TRUE(NULL != p_particle3->getRotation());
+
+    const IParticle * p_particle4 = particleDecoration.getParticle(size_t(3));
+    EXPECT_TRUE(NULL!=p_particle4);
+    EXPECT_EQ(4.1, p_particle4->getDepth());
+    EXPECT_EQ(-4.2, particleDecoration.getAbundanceOfParticle(size_t(3)));
+    EXPECT_TRUE(NULL != p_particle4->getRotation());
 }
 
 
@@ -180,8 +178,7 @@ TEST_F(ParticleLayoutTest, ParticleLayoutClone)
 
     HomogeneousMaterial mat5("core", 0, 0);
     Particle particle5(mat5);
-    ParticleInfo particleInfo5(particle5, 0.0, 0.0);
-    particleDecoration.addParticleInfo(particleInfo5);
+    particleDecoration.addParticle(particle5, 0.0, 0.0);
 
     particleDecoration.addInterferenceFunction(new InterferenceFunctionNone());
     particleDecoration.addInterferenceFunction(new InterferenceFunctionNone());
@@ -191,41 +188,35 @@ TEST_F(ParticleLayoutTest, ParticleLayoutClone)
 
     EXPECT_EQ("ParticleLayout", clone->getName());
 
-    const ParticleInfo * pInfo1 = clone->getParticleInfo(size_t(0));
-    EXPECT_TRUE(NULL!=pInfo1);
-    EXPECT_EQ(0.0, pInfo1->getDepth());
-    EXPECT_EQ(1.0, pInfo1->getAbundance());
-    EXPECT_TRUE(NULL == pInfo1->getParticle()->getRotation());
-
-    const ParticleInfo * pInfo2 = clone->getParticleInfo(size_t(1));
-    EXPECT_TRUE(NULL!=pInfo2);
-    EXPECT_EQ(2.1, pInfo2->getDepth());
-    EXPECT_EQ(2.0, pInfo2->getAbundance());
-    EXPECT_TRUE(NULL == pInfo2->getParticle()->getRotation());
-
-    const ParticleInfo * pInfo3 = clone->getParticleInfo(size_t(2));
-    EXPECT_TRUE(NULL!=pInfo3);
-    EXPECT_EQ(0.0, pInfo3->getDepth());
-    EXPECT_EQ(1.0, pInfo3->getAbundance());
-    EXPECT_TRUE(NULL != pInfo3->getParticle()->getRotation());
-
-    const ParticleInfo * pInfo4 = clone->getParticleInfo(size_t(3));
-    EXPECT_TRUE(NULL!=pInfo4);
-    EXPECT_EQ(4.1, pInfo4->getDepth());
-    EXPECT_EQ(4.0, pInfo4->getAbundance());
-    EXPECT_TRUE(NULL != pInfo4->getParticle()->getRotation());
-
-    const ParticleInfo * pInfo5 = clone->getParticleInfo(size_t(4));
-    EXPECT_TRUE(NULL!=pInfo5);
-    EXPECT_EQ(0.0, pInfo5->getDepth());
-    EXPECT_EQ(0.0, pInfo5->getAbundance());
-    EXPECT_TRUE(NULL == pInfo2->getParticle()->getRotation());
-
-    EXPECT_EQ(1.0, clone->getAbundanceOfParticle(size_t(0)));
-    EXPECT_EQ(2.0, clone->getAbundanceOfParticle(size_t(1)));
-    EXPECT_EQ(1.0, clone->getAbundanceOfParticle(size_t(2)));
-    EXPECT_EQ(4.0, clone->getAbundanceOfParticle(size_t(3)));
-    EXPECT_EQ(0.0, clone->getAbundanceOfParticle(size_t(4)));
+    const IParticle * p_particle1 = clone->getParticle(size_t(0));
+    EXPECT_TRUE(NULL!=p_particle1);
+    EXPECT_EQ(0.0, p_particle1->getDepth());
+    EXPECT_EQ(1.0, particleDecoration.getAbundanceOfParticle(size_t(0)));
+    EXPECT_TRUE(NULL == p_particle1->getRotation());
+
+    const IParticle * p_particle2 = clone->getParticle(size_t(1));
+    EXPECT_TRUE(NULL!=p_particle2);
+    EXPECT_EQ(2.1, p_particle2->getDepth());
+    EXPECT_EQ(2.0, particleDecoration.getAbundanceOfParticle(size_t(1)));
+    EXPECT_TRUE(NULL == p_particle2->getRotation());
+
+    const IParticle * p_particle3 = clone->getParticle(size_t(2));
+    EXPECT_TRUE(NULL!=p_particle3);
+    EXPECT_EQ(0.0, p_particle3->getDepth());
+    EXPECT_EQ(1.0, particleDecoration.getAbundanceOfParticle(size_t(2)));
+    EXPECT_TRUE(NULL != p_particle3->getRotation());
+
+    const IParticle * p_particle4 = clone->getParticle(size_t(3));
+    EXPECT_TRUE(NULL!=p_particle4);
+    EXPECT_EQ(4.1, p_particle4->getDepth());
+    EXPECT_EQ(4.0, particleDecoration.getAbundanceOfParticle(size_t(3)));
+    EXPECT_TRUE(NULL != p_particle4->getRotation());
+
+    const IParticle * p_particle5 = clone->getParticle(size_t(4));
+    EXPECT_TRUE(NULL!=p_particle5);
+    EXPECT_EQ(0.0, p_particle5->getDepth());
+    EXPECT_EQ(0.0, particleDecoration.getAbundanceOfParticle(size_t(4)));
+    EXPECT_TRUE(NULL == p_particle5->getRotation());
 
     EXPECT_EQ(size_t(3), clone->getNumberOfInterferenceFunctions());
     EXPECT_EQ(size_t(3), clone->getInterferenceFunctions().size());
@@ -262,8 +253,7 @@ TEST_F(ParticleLayoutTest, ParticleLayoutCloneInvertB)
 
     HomogeneousMaterial mat5("core",0,0);
     Particle particle5(mat5);
-    ParticleInfo particleInfo5(particle5, 0.0,0.0);
-    particleDecoration.addParticleInfo(particleInfo5);
+    particleDecoration.addParticle(particle5, 0.0,0.0);
 
     particleDecoration.addInterferenceFunction(new InterferenceFunctionNone());
     particleDecoration.addInterferenceFunction(new InterferenceFunctionNone());
@@ -273,42 +263,35 @@ TEST_F(ParticleLayoutTest, ParticleLayoutCloneInvertB)
 
     EXPECT_EQ("ParticleLayout_inv", clone->getName());
 
-    const ParticleInfo * pInfo1 = clone->getParticleInfo(size_t(0));
-    EXPECT_TRUE(NULL!=pInfo1);
-    EXPECT_EQ(0.0, pInfo1->getDepth());
-    EXPECT_EQ(1.0, pInfo1->getAbundance());
-    EXPECT_TRUE(NULL == pInfo1->getParticle()->getRotation());
-
-    const ParticleInfo * pInfo2 = clone->getParticleInfo(size_t(1));
-    EXPECT_TRUE(NULL!=pInfo2);
-    EXPECT_EQ(2.1, pInfo2->getDepth());
-    EXPECT_EQ(2.0, pInfo2->getAbundance());
-    EXPECT_TRUE(NULL == pInfo2->getParticle()->getRotation());
-
-    const ParticleInfo * pInfo3 = clone->getParticleInfo(size_t(2));
-    EXPECT_TRUE(NULL!=pInfo3);
-    EXPECT_EQ(0.0, pInfo3->getDepth());
-    EXPECT_EQ(1.0, pInfo3->getAbundance());
-    EXPECT_TRUE(NULL != pInfo3->getParticle()->getRotation());
-
-    const ParticleInfo * pInfo4 = clone->getParticleInfo(size_t(3));
-    EXPECT_TRUE(NULL!=pInfo4);
-    EXPECT_EQ(4.1, pInfo4->getDepth());
-    EXPECT_EQ(4.0, pInfo4->getAbundance());
-    EXPECT_TRUE(NULL != pInfo4->getParticle()->getRotation());
-
-
-    const ParticleInfo * pInfo5 = clone->getParticleInfo(size_t(4));
-    EXPECT_TRUE(NULL!=pInfo5);
-    EXPECT_EQ(0.0, pInfo5->getDepth());
-    EXPECT_EQ(0.0, pInfo5->getAbundance());
-    EXPECT_TRUE(NULL == pInfo2->getParticle()->getRotation());
-
-    EXPECT_EQ(1.0, clone->getAbundanceOfParticle(size_t(0)));
-    EXPECT_EQ(2.0, clone->getAbundanceOfParticle(size_t(1)));
-    EXPECT_EQ(1.0, clone->getAbundanceOfParticle(size_t(2)));
-    EXPECT_EQ(4.0, clone->getAbundanceOfParticle(size_t(3)));
-    EXPECT_EQ(0.0, clone->getAbundanceOfParticle(size_t(4)));
+    const IParticle * p_particle1 = clone->getParticle(size_t(0));
+    EXPECT_TRUE(NULL!=p_particle1);
+    EXPECT_EQ(0.0, p_particle1->getDepth());
+    EXPECT_EQ(1.0, particleDecoration.getAbundanceOfParticle(size_t(0)));
+    EXPECT_TRUE(NULL == p_particle1->getRotation());
+
+    const IParticle * p_particle2 = clone->getParticle(size_t(1));
+    EXPECT_TRUE(NULL!=p_particle2);
+    EXPECT_EQ(2.1, p_particle2->getDepth());
+    EXPECT_EQ(2.0, particleDecoration.getAbundanceOfParticle(size_t(1)));
+    EXPECT_TRUE(NULL == p_particle2->getRotation());
+
+    const IParticle * p_particle3 = clone->getParticle(size_t(2));
+    EXPECT_TRUE(NULL!=p_particle3);
+    EXPECT_EQ(0.0, p_particle3->getDepth());
+    EXPECT_EQ(1.0, particleDecoration.getAbundanceOfParticle(size_t(2)));
+    EXPECT_TRUE(NULL != p_particle3->getRotation());
+
+    const IParticle * p_particle4 = clone->getParticle(size_t(3));
+    EXPECT_TRUE(NULL!=p_particle4);
+    EXPECT_EQ(4.1, p_particle4->getDepth());
+    EXPECT_EQ(4.0, particleDecoration.getAbundanceOfParticle(size_t(3)));
+    EXPECT_TRUE(NULL != p_particle4->getRotation());
+
+    const IParticle * p_particle5 = clone->getParticle(size_t(4));
+    EXPECT_TRUE(NULL!=p_particle5);
+    EXPECT_EQ(0.0, p_particle5->getDepth());
+    EXPECT_EQ(0.0, particleDecoration.getAbundanceOfParticle(size_t(4)));
+    EXPECT_TRUE(NULL == p_particle5->getRotation());
 
     EXPECT_EQ(size_t(3), clone->getNumberOfInterferenceFunctions());
     EXPECT_EQ(size_t(3), clone->getInterferenceFunctions().size());
diff --git a/Tests/UnitTests/TestCore/ParticleTest.h b/Tests/UnitTests/TestCore/ParticleTest.h
index 98c787693e94b645e416085e859512dae5b7835b..26757930b9b30e087ac5b78b7ec62c0ed34338c5 100644
--- a/Tests/UnitTests/TestCore/ParticleTest.h
+++ b/Tests/UnitTests/TestCore/ParticleTest.h
@@ -120,7 +120,7 @@ TEST_F(ParticleTest, SetParam)
     EXPECT_EQ("FormFactorFullSphere", particle.getFormFactor()->getName());
     EXPECT_EQ(2.1, particle.getFormFactor()->getRadius());
 
-    particle.setTransformation(transform);
+    particle.setRotation(transform);
     EXPECT_TRUE(NULL != particle.getRotation());
     Particle *particle2 = particle.clone();
     EXPECT_EQ("Particle", particle2->getName());
diff --git a/cmake/modules/SearchInstalledSoftware.cmake b/cmake/modules/SearchInstalledSoftware.cmake
index d0853a022bcc0d8313d81bff54c89b83fa47b752..b347ee78c551e9c6e34df9e1f15eab4fb594582a 100644
--- a/cmake/modules/SearchInstalledSoftware.cmake
+++ b/cmake/modules/SearchInstalledSoftware.cmake
@@ -85,6 +85,6 @@ endif()
 
 
 # --- ROOT ---
-if(ROOT_SUPPORT)
+if(ROOT_SUPPORT OR BORNAGAIN_APP)
     find_package(ROOT)
 endif()
diff --git a/dev-tools/python-bindings/settings_core.py b/dev-tools/python-bindings/settings_core.py
index 3666206fad4d3352a94c6b3865295866773e2cec..06c1939421915ef229955ccd4601b5ab222dc5aa 100644
--- a/dev-tools/python-bindings/settings_core.py
+++ b/dev-tools/python-bindings/settings_core.py
@@ -160,7 +160,6 @@ include_classes = [
     "ParticleDistribution",
     "ParticleCoreShell",
     "ParticleLayout",
-    "ParticleInfo",
     "RealParameterWrapper",
     "ResolutionFunction2DGaussian",
     "RotationX",
@@ -242,6 +241,8 @@ def ManualClassTunings(mb):
         if 'SetLevel' in ff.name:
             ff.alias = 'SetMessageLevel'
             ff.include()
+        if 'CreateProduct' in ff.name:
+            ff.include()
     #
     cl = mb.class_("BasicVector3D<double>")
     cl.add_code("def( bp::self - bp::self )")