diff --git a/App/src/DrawHelper.cpp b/App/src/DrawHelper.cpp
index ea36f6361f43db10051de5dda0800c31478dd585..b13868479b90457e2c9683af5791aeef9f9ab239 100644
--- a/App/src/DrawHelper.cpp
+++ b/App/src/DrawHelper.cpp
@@ -20,7 +20,7 @@
 #include "Lattice.h"
 #include "MesoCrystal.h"
 #include "Crystal.h"
-#include "LatticeBasis.h"
+#include "ParticleComposition.h"
 #include "Units.h"
 #include "FormFactorFullSphere.h"
 
@@ -405,7 +405,7 @@ void DrawHelper::DrawMesoCrystal(const MultiLayer *sample)
 //    const Crystal *crystal = dynamic_cast<const Crystal *>(meso->getClusteredParticles());
 //    if( !crystal ) throw RuntimeErrorException("DrawHelper::DrawMesoCrystal() -> nano_crystal panic");
 //    Lattice lattice = crystal->getLattice();
-//    const LatticeBasis *lattice_basis = crystal->getLatticeBasis();
+//    const ParticleComposition *lattice_basis = crystal->getLatticeBasis();
 //    if( !meso ) throw RuntimeErrorException("DrawHelper::DrawMesoCrystal() -> lattice_basis panic");
 
 //    if( !ff_sphere) throw RuntimeErrorException("DrawHelper::DrawMesoCrystal() -> ff_sphere panic");
diff --git a/App/src/StandardSamples.cpp b/App/src/StandardSamples.cpp
index 186bc4e4d772c17410915dc670882e90cca079c0..bcf13fa0824a00e7aaaf0ce7a68ba6670437b7e7 100644
--- a/App/src/StandardSamples.cpp
+++ b/App/src/StandardSamples.cpp
@@ -22,7 +22,7 @@
 #include "ParticleLayout.h"
 #include "InterferenceFunctionNone.h"
 #include "Lattice.h"
-#include "LatticeBasis.h"
+#include "ParticleComposition.h"
 #include "Crystal.h"
 #include "MesoCrystal.h"
 #include "InterferenceFunctions.h"
diff --git a/App/src/TestMiscellaneous.cpp b/App/src/TestMiscellaneous.cpp
index 285d8b1307fa2b75ee7f6ea0a9d50ff48149a4c6..7e1149525bf154552de57f8486c8acc1cc331edf 100644
--- a/App/src/TestMiscellaneous.cpp
+++ b/App/src/TestMiscellaneous.cpp
@@ -25,7 +25,7 @@
 #include "Lattice.h"
 #include "MesoCrystal.h"
 #include "Crystal.h"
-#include "LatticeBasis.h"
+#include "ParticleComposition.h"
 #include "MathFunctions.h"
 #include "IntensityDataIOFactory.h"
 #include "Utils.h"
diff --git a/App/src/TestPolarizedMeso.cpp b/App/src/TestPolarizedMeso.cpp
index a76d8dabc19aaa0c9aa40847e2669ff58bb55513..3e9216a5a859e4ac65abb30a5d2311d124576ade 100644
--- a/App/src/TestPolarizedMeso.cpp
+++ b/App/src/TestPolarizedMeso.cpp
@@ -144,7 +144,7 @@ MesoCrystal* TestPolarizedMeso::createMeso(double a, double c,
     std::vector<kvector_t> pos_vector;
     pos_vector.push_back(position_0);
     pos_vector.push_back(position_1);
-    LatticeBasis basis(particle, pos_vector);
+    ParticleComposition basis(particle, pos_vector);
 
     Crystal npc(basis, *p_lat);
     delete p_lat;
diff --git a/Core/FormFactors/inc/FormFactorCrystal.h b/Core/FormFactors/inc/FormFactorCrystal.h
index 1235b5620b0561dd7ea0ed3190a083224dea8e37..d00d7a412cc344d47e31cb2e51240f588590958a 100644
--- a/Core/FormFactors/inc/FormFactorCrystal.h
+++ b/Core/FormFactors/inc/FormFactorCrystal.h
@@ -55,7 +55,7 @@ private:
 
     Lattice m_lattice;
     complex_t m_wavevector_scattering_factor;
-    LatticeBasis *mp_lattice_basis;
+    ParticleComposition *mp_lattice_basis;
     IFormFactor *mp_basis_form_factor;
     IFormFactor *mp_meso_form_factor;
     IMaterial *mp_ambient_material;
diff --git a/Core/PythonAPI/inc/LatticeBasis.pypp.h b/Core/PythonAPI/inc/LatticeBasis.pypp.h
deleted file mode 100644
index 38f28d9ddfdbef8abbef3ba7693e9a34c28dc0c7..0000000000000000000000000000000000000000
--- a/Core/PythonAPI/inc/LatticeBasis.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 LatticeBasis_hpp__pyplusplus_wrapper
-#define LatticeBasis_hpp__pyplusplus_wrapper
-
-void register_LatticeBasis_class();
-
-#endif//LatticeBasis_hpp__pyplusplus_wrapper
diff --git a/Core/PythonAPI/inc/PythonCoreList.h b/Core/PythonAPI/inc/PythonCoreList.h
index 8769a9dc38be15bad1dcb59c61591b44846b10c9..9006280d84c973ceb3e644f90aafa534ce8c7e37 100644
--- a/Core/PythonAPI/inc/PythonCoreList.h
+++ b/Core/PythonAPI/inc/PythonCoreList.h
@@ -72,7 +72,7 @@
 #include "Lattice.h"
 #include "Lattice1DIFParameters.h"
 #include "Lattice2DIFParameters.h"
-#include "LatticeBasis.h"
+#include "ParticleComposition.h"
 #include "Layer.h"
 #include "LayerRoughness.h"
 #include "MathFunctions.h"
diff --git a/Core/PythonAPI/inc/PythonModule.h b/Core/PythonAPI/inc/PythonModule.h
index 6f89bf92ddfcdd59f8e8034fe97fcf5fd3c939aa..c7f37a6207b3244bfda2293f59238f9ad4fd275a 100644
--- a/Core/PythonAPI/inc/PythonModule.h
+++ b/Core/PythonAPI/inc/PythonModule.h
@@ -44,7 +44,7 @@
 //#include "ISelectionRule.h"
 //#include "ISingleton.h"
 //#include "Lattice.h"
-//#include "LatticeBasis.h"
+//#include "ParticleComposition.h"
 //#include "Layer.h"
 //#include "LayerDecorator.h"
 //#include "LayerRoughness.h"
diff --git a/Core/PythonAPI/src/Crystal.pypp.cpp b/Core/PythonAPI/src/Crystal.pypp.cpp
index 9c6ec7ef3e41bb4edc294cb73e38eeb9ab931550..c0837b26eb6bb225e439320bd4df9ca8f0427951 100644
--- a/Core/PythonAPI/src/Crystal.pypp.cpp
+++ b/Core/PythonAPI/src/Crystal.pypp.cpp
@@ -30,7 +30,7 @@ namespace bp = boost::python;
 
 struct Crystal_wrapper : Crystal, bp::wrapper< Crystal > {
 
-    Crystal_wrapper(::LatticeBasis const & lattice_basis, ::Lattice const & lattice )
+    Crystal_wrapper(::ParticleComposition const & lattice_basis, ::Lattice const & lattice )
     : Crystal( boost::ref(lattice_basis), boost::ref(lattice) )
       , bp::wrapper< Crystal >(){
         // constructor
@@ -316,7 +316,7 @@ void register_Crystal_class(){
 
     { //::Crystal
         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", bp::init< LatticeBasis const &, Lattice const & >(( bp::arg("lattice_basis"), bp::arg("lattice") )) );
+        Crystal_exposer_t Crystal_exposer = Crystal_exposer_t( "Crystal", bp::init< ParticleComposition const &, Lattice const & >(( bp::arg("lattice_basis"), bp::arg("lattice") )) );
         bp::scope Crystal_scope( Crystal_exposer );
         { //::Crystal::applyTransformation
         
@@ -381,7 +381,7 @@ void register_Crystal_class(){
         }
         { //::Crystal::getLatticeBasis
         
-            typedef ::LatticeBasis const * ( ::Crystal::*getLatticeBasis_function_type)(  ) const;
+            typedef ::ParticleComposition const * ( ::Crystal::*getLatticeBasis_function_type)(  ) const;
             
             Crystal_exposer.def( 
                 "getLatticeBasis"
diff --git a/Core/PythonAPI/src/LatticeBasis.pypp.cpp b/Core/PythonAPI/src/LatticeBasis.pypp.cpp
deleted file mode 100644
index 0d519da4fc456f98f3b131a650716e44a944d43e..0000000000000000000000000000000000000000
--- a/Core/PythonAPI/src/LatticeBasis.pypp.cpp
+++ /dev/null
@@ -1,406 +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 "LatticeBasis.pypp.h"
-
-namespace bp = boost::python;
-
-struct LatticeBasis_wrapper : LatticeBasis, bp::wrapper< LatticeBasis > {
-
-    LatticeBasis_wrapper( )
-    : LatticeBasis( )
-      , bp::wrapper< LatticeBasis >(){
-        // null constructor
-    m_pyobj = 0;
-    }
-
-    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 ) {
-        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 );
-        }
-        else{
-            IParameterized::registerParameter( name, parpointer );
-        }
-    }
-    
-    static void default_registerParameter( ::IParameterized & inst, ::std::string const & name, long unsigned int parpointer ){
-        if( dynamic_cast< LatticeBasis_wrapper * >( boost::addressof( inst ) ) ){
-            inst.::IParameterized::registerParameter(name, reinterpret_cast< double * >( parpointer ));
-        }
-        else{
-            inst.registerParameter(name, reinterpret_cast< double * >( parpointer ));
-        }
-    }
-
-    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_LatticeBasis_class(){
-
-    { //::LatticeBasis
-        typedef bp::class_< LatticeBasis_wrapper, bp::bases< IParticle >, std::auto_ptr< LatticeBasis_wrapper >, boost::noncopyable > LatticeBasis_exposer_t;
-        LatticeBasis_exposer_t LatticeBasis_exposer = LatticeBasis_exposer_t( "LatticeBasis", bp::init< >() );
-        bp::scope LatticeBasis_scope( LatticeBasis_exposer );
-        { //::LatticeBasis::addParticle
-        
-            typedef void ( ::LatticeBasis::*addParticle_function_type)( ::IParticle const &,::std::vector< Geometry::BasicVector3D<double> > ) ;
-            
-            LatticeBasis_exposer.def( 
-                "addParticle"
-                , addParticle_function_type( &::LatticeBasis::addParticle )
-                , ( bp::arg("particle"), bp::arg("positions") ) );
-        
-        }
-        { //::IParameterized::areParametersChanged
-        
-            typedef bool ( ::IParameterized::*areParametersChanged_function_type)(  ) ;
-            typedef bool ( LatticeBasis_wrapper::*default_areParametersChanged_function_type)(  ) ;
-            
-            LatticeBasis_exposer.def( 
-                "areParametersChanged"
-                , areParametersChanged_function_type(&::IParameterized::areParametersChanged)
-                , default_areParametersChanged_function_type(&LatticeBasis_wrapper::default_areParametersChanged) );
-        
-        }
-        { //::IParameterized::clearParameterPool
-        
-            typedef void ( ::IParameterized::*clearParameterPool_function_type)(  ) ;
-            typedef void ( LatticeBasis_wrapper::*default_clearParameterPool_function_type)(  ) ;
-            
-            LatticeBasis_exposer.def( 
-                "clearParameterPool"
-                , clearParameterPool_function_type(&::IParameterized::clearParameterPool)
-                , default_clearParameterPool_function_type(&LatticeBasis_wrapper::default_clearParameterPool) );
-        
-        }
-        { //::ISample::containsMagneticMaterial
-        
-            typedef bool ( ::ISample::*containsMagneticMaterial_function_type)(  ) const;
-            typedef bool ( LatticeBasis_wrapper::*default_containsMagneticMaterial_function_type)(  ) const;
-            
-            LatticeBasis_exposer.def( 
-                "containsMagneticMaterial"
-                , containsMagneticMaterial_function_type(&::ISample::containsMagneticMaterial)
-                , default_containsMagneticMaterial_function_type(&LatticeBasis_wrapper::default_containsMagneticMaterial) );
-        
-        }
-        { //::IParameterized::createParameterTree
-        
-            typedef ::ParameterPool * ( ::IParameterized::*createParameterTree_function_type)(  ) const;
-            typedef ::ParameterPool * ( LatticeBasis_wrapper::*default_createParameterTree_function_type)(  ) const;
-            
-            LatticeBasis_exposer.def( 
-                "createParameterTree"
-                , createParameterTree_function_type(&::IParameterized::createParameterTree)
-                , default_createParameterTree_function_type(&LatticeBasis_wrapper::default_createParameterTree)
-                , bp::return_value_policy< bp::manage_new_object >() );
-        
-        }
-        { //::ICompositeSample::getCompositeSample
-        
-            typedef ::ICompositeSample * ( ::ICompositeSample::*getCompositeSample_function_type)(  ) ;
-            typedef ::ICompositeSample * ( LatticeBasis_wrapper::*default_getCompositeSample_function_type)(  ) ;
-            
-            LatticeBasis_exposer.def( 
-                "getCompositeSample"
-                , getCompositeSample_function_type(&::ICompositeSample::getCompositeSample)
-                , default_getCompositeSample_function_type(&LatticeBasis_wrapper::default_getCompositeSample)
-                , bp::return_value_policy< bp::reference_existing_object >() );
-        
-        }
-        { //::ICompositeSample::getCompositeSample
-        
-            typedef ::ICompositeSample const * ( ::ICompositeSample::*getCompositeSample_function_type)(  ) const;
-            typedef ::ICompositeSample const * ( LatticeBasis_wrapper::*default_getCompositeSample_function_type)(  ) const;
-            
-            LatticeBasis_exposer.def( 
-                "getCompositeSample"
-                , getCompositeSample_function_type(&::ICompositeSample::getCompositeSample)
-                , default_getCompositeSample_function_type(&LatticeBasis_wrapper::default_getCompositeSample)
-                , bp::return_value_policy< bp::reference_existing_object >() );
-        
-        }
-        { //::ISample::preprocess
-        
-            typedef bool ( ::ISample::*preprocess_function_type)(  ) ;
-            typedef bool ( LatticeBasis_wrapper::*default_preprocess_function_type)(  ) ;
-            
-            LatticeBasis_exposer.def( 
-                "preprocess"
-                , preprocess_function_type(&::ISample::preprocess)
-                , default_preprocess_function_type(&LatticeBasis_wrapper::default_preprocess) );
-        
-        }
-        { //::IParameterized::printParameters
-        
-            typedef void ( ::IParameterized::*printParameters_function_type)(  ) const;
-            typedef void ( LatticeBasis_wrapper::*default_printParameters_function_type)(  ) const;
-            
-            LatticeBasis_exposer.def( 
-                "printParameters"
-                , printParameters_function_type(&::IParameterized::printParameters)
-                , default_printParameters_function_type(&LatticeBasis_wrapper::default_printParameters) );
-        
-        }
-        { //::ISample::printSampleTree
-        
-            typedef void ( ::ISample::*printSampleTree_function_type)(  ) ;
-            typedef void ( LatticeBasis_wrapper::*default_printSampleTree_function_type)(  ) ;
-            
-            LatticeBasis_exposer.def( 
-                "printSampleTree"
-                , printSampleTree_function_type(&::ISample::printSampleTree)
-                , default_printSampleTree_function_type(&LatticeBasis_wrapper::default_printSampleTree) );
-        
-        }
-        { //::IParameterized::registerParameter
-        
-            typedef void ( *default_registerParameter_function_type )( ::IParameterized &,::std::string const &,long unsigned int );
-            
-            LatticeBasis_exposer.def( 
-                "registerParameter"
-                , default_registerParameter_function_type( &LatticeBasis_wrapper::default_registerParameter )
-                , ( bp::arg("inst"), bp::arg("name"), bp::arg("parpointer") ) );
-        
-        }
-        { //::IParameterized::setParameterValue
-        
-            typedef bool ( ::IParameterized::*setParameterValue_function_type)( ::std::string const &,double ) ;
-            typedef bool ( LatticeBasis_wrapper::*default_setParameterValue_function_type)( ::std::string const &,double ) ;
-            
-            LatticeBasis_exposer.def( 
-                "setParameterValue"
-                , setParameterValue_function_type(&::IParameterized::setParameterValue)
-                , default_setParameterValue_function_type(&LatticeBasis_wrapper::default_setParameterValue)
-                , ( bp::arg("name"), bp::arg("value") ) );
-        
-        }
-        { //::IParameterized::setParametersAreChanged
-        
-            typedef void ( ::IParameterized::*setParametersAreChanged_function_type)(  ) ;
-            typedef void ( LatticeBasis_wrapper::*default_setParametersAreChanged_function_type)(  ) ;
-            
-            LatticeBasis_exposer.def( 
-                "setParametersAreChanged"
-                , setParametersAreChanged_function_type(&::IParameterized::setParametersAreChanged)
-                , default_setParametersAreChanged_function_type(&LatticeBasis_wrapper::default_setParametersAreChanged) );
-        
-        }
-        { //::ICompositeSample::size
-        
-            typedef ::std::size_t ( ::ICompositeSample::*size_function_type)(  ) const;
-            typedef ::std::size_t ( LatticeBasis_wrapper::*default_size_function_type)(  ) const;
-            
-            LatticeBasis_exposer.def( 
-                "size"
-                , size_function_type(&::ICompositeSample::size)
-                , default_size_function_type(&LatticeBasis_wrapper::default_size) );
-        
-        }
-        { //::ICloneable::transferToCPP
-        
-            typedef void ( ::ICloneable::*transferToCPP_function_type)(  ) ;
-            typedef void ( LatticeBasis_wrapper::*default_transferToCPP_function_type)(  ) ;
-            
-            LatticeBasis_exposer.def( 
-                "transferToCPP"
-                , transferToCPP_function_type(&::ICloneable::transferToCPP)
-                , default_transferToCPP_function_type(&LatticeBasis_wrapper::default_transferToCPP) );
-        
-        }
-    }
-
-}
diff --git a/Core/PythonAPI/src/PythonModule.cpp b/Core/PythonAPI/src/PythonModule.cpp
index 8d83d72bcb2b4499be605a8f5b9a526903989cad..e8631827aac07f9a57ae1627744582ee2cf3ced9 100644
--- a/Core/PythonAPI/src/PythonModule.cpp
+++ b/Core/PythonAPI/src/PythonModule.cpp
@@ -10,128 +10,128 @@ GCC_DIAG_ON(missing-field-initializers)
 #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
 #define PY_ARRAY_UNIQUE_SYMBOL BORNAGAIN_PYTHONAPI_ARRAY
 #include "numpy/arrayobject.h"
-#include "FormFactorFullSphere.pypp.h"
-#include "Lattice.pypp.h"
-#include "FormFactorInfLongBox.pypp.h"
-#include "Layer.pypp.h"
-#include "FormFactorHemiEllipsoid.pypp.h"
-#include "FormFactorPrism3.pypp.h"
+#include "FormFactorFullSpheroid.pypp.h"
+#include "DistributionGate.pypp.h"
+#include "SimpleSelectionRule.pypp.h"
+#include "RealParameterWrapper.pypp.h"
+#include "vdouble1d_t.pypp.h"
 #include "SimulationParameters.pypp.h"
-#include "FormFactorInfLongRipple1.pypp.h"
-#include "FTDistribution1DVoigt.pypp.h"
-#include "FormFactorRipple1.pypp.h"
-#include "ParticleInfo.pypp.h"
-#include "ICompositeSample.pypp.h"
-#include "OffSpecSimulation.pypp.h"
-#include "IResolutionFunction2D.pypp.h"
-#include "vector_kvector_t.pypp.h"
-#include "FTDistribution1DGate.pypp.h"
-#include "LatticeBasis.pypp.h"
-#include "FormFactorRipple2.pypp.h"
-#include "FTDistribution2DVoigt.pypp.h"
-#include "IFormFactorBorn.pypp.h"
-#include "FormFactorPyramid.pypp.h"
-#include "ISample.pypp.h"
+#include "Transform3D.pypp.h"
+#include "ThreadInfo.pypp.h"
+#include "InterferenceFunction2DLattice.pypp.h"
+#include "LayerInterface.pypp.h"
 #include "ILayout.pypp.h"
+#include "FormFactorCone6.pypp.h"
 #include "FormFactorTetrahedron.pypp.h"
-#include "Simulation.pypp.h"
-#include "ParticleLayout.pypp.h"
-#include "FTDistribution2DCone.pypp.h"
-#include "FormFactorEllipsoidalCylinder.pypp.h"
-#include "FTDistribution1DGauss.pypp.h"
-#include "HomogeneousMaterial.pypp.h"
-#include "cvector_t.pypp.h"
-#include "FTDistribution2DGauss.pypp.h"
-#include "IObservable.pypp.h"
-#include "FormFactorBox.pypp.h"
-#include "DistributionLogNormal.pypp.h"
-#include "FormFactorCylinder.pypp.h"
-#include "Detector.pypp.h"
-#include "IObserver.pypp.h"
-#include "ResolutionFunction2DGaussian.pypp.h"
-#include "IParameterized.pypp.h"
-#include "FormFactorGauss.pypp.h"
-#include "FormFactorDecoratorDebyeWaller.pypp.h"
-#include "IDetectorResolution.pypp.h"
+#include "FTDistribution1DCosine.pypp.h"
+#include "FTDistribution1DTriangle.pypp.h"
 #include "FormFactorWeighted.pypp.h"
-#include "InterferenceFunction2DLattice.pypp.h"
-#include "RealParameterWrapper.pypp.h"
-#include "LayerInterface.pypp.h"
-#include "ParticleCoreShell.pypp.h"
-#include "InterferenceFunction1DLattice.pypp.h"
-#include "FormFactorCrystal.pypp.h"
-#include "Instrument.pypp.h"
-#include "PythonInterface_global_variables.pypp.h"
-#include "ParticleDistribution.pypp.h"
-#include "IFTDistribution1D.pypp.h"
-#include "FormFactorTrivial.pypp.h"
+#include "InterferenceFunctionRadialParaCrystal.pypp.h"
 #include "DistributionGaussian.pypp.h"
-#include "Lattice1DIFParameters.pypp.h"
-#include "DistributionCosine.pypp.h"
-#include "IClusteredParticles.pypp.h"
-#include "FormFactorLorentz.pypp.h"
-#include "Bin1DCVector.pypp.h"
+#include "IDetectorResolution.pypp.h"
+#include "FormFactorCylinder.pypp.h"
+#include "Crystal.pypp.h"
+#include "FTDistribution1DCauchy.pypp.h"
+#include "IFormFactorBorn.pypp.h"
+#include "FormFactorEllipsoidalCylinder.pypp.h"
 #include "InterferenceFunctionNone.pypp.h"
-#include "IFormFactorDecorator.pypp.h"
-#include "Bin1D.pypp.h"
-#include "ISampleBuilder.pypp.h"
-#include "IntensityDataIOFactory.pypp.h"
 #include "FTDistribution2DGate.pypp.h"
-#include "FormFactorInfLongRipple2.pypp.h"
-#include "IMaterial.pypp.h"
-#include "InterferenceFunction2DParaCrystal.pypp.h"
-#include "Particle.pypp.h"
+#include "vector_kvector_t.pypp.h"
 #include "FormFactorTruncatedSpheroid.pypp.h"
-#include "MesoCrystal.pypp.h"
+#include "Particle.pypp.h"
+#include "FormFactorTrivial.pypp.h"
+#include "ConstKBinAxis.pypp.h"
 #include "FTDistribution2DCauchy.pypp.h"
-#include "IInterferenceFunction.pypp.h"
-#include "FTDistribution1DCosine.pypp.h"
-#include "IParticle.pypp.h"
-#include "FTDistribution1DTriangle.pypp.h"
+#include "FormFactorCrystal.pypp.h"
+#include "ParticleDistribution.pypp.h"
+#include "vector_longinteger_t.pypp.h"
+#include "ResolutionFunction2DGaussian.pypp.h"
+#include "FTDistribution1DGauss.pypp.h"
+#include "FTDistribution1DGate.pypp.h"
+#include "FormFactorAnisoPyramid.pypp.h"
+#include "FixedBinAxis.pypp.h"
+#include "MultiLayer.pypp.h"
+#include "IFormFactor.pypp.h"
+#include "kvector_t.pypp.h"
+#include "FormFactorSphereUniformRadius.pypp.h"
+#include "OffSpecSimulation.pypp.h"
+#include "FormFactorRipple1.pypp.h"
+#include "Simulation.pypp.h"
+#include "IObservable.pypp.h"
+#include "FormFactorLorentz.pypp.h"
+#include "SpecularSimulation.pypp.h"
+#include "ISelectionRule.pypp.h"
+#include "FormFactorRipple2.pypp.h"
+#include "LayerRoughness.pypp.h"
+#include "Bin1DCVector.pypp.h"
+#include "FormFactorSphereGaussianRadius.pypp.h"
+#include "ParameterPool.pypp.h"
+#include "FormFactorPrism3.pypp.h"
+#include "IMaterial.pypp.h"
+#include "FTDistribution1DVoigt.pypp.h"
+#include "IntensityDataFunctions.pypp.h"
 #include "FormFactorPrism6.pypp.h"
-#include "HomogeneousMagneticMaterial.pypp.h"
-#include "FormFactorFullSpheroid.pypp.h"
-#include "Transform3D.pypp.h"
-#include "IntensityData.pypp.h"
-#include "DistributionGate.pypp.h"
-#include "ThreadInfo.pypp.h"
+#include "IClusteredParticles.pypp.h"
+#include "VariableBinAxis.pypp.h"
+#include "IParticle.pypp.h"
+#include "DistributionCosine.pypp.h"
+#include "FormFactorHemiEllipsoid.pypp.h"
 #include "IAxis.pypp.h"
+#include "vector_integer_t.pypp.h"
+#include "IntensityDataIOFactory.pypp.h"
+#include "ParameterDistribution.pypp.h"
+#include "Layer.pypp.h"
+#include "FormFactorPyramid.pypp.h"
 #include "CustomBinAxis.pypp.h"
-#include "FormFactorCone6.pypp.h"
-#include "ICloneable.pypp.h"
+#include "FTDistribution2DCone.pypp.h"
+#include "IFTDistribution1D.pypp.h"
+#include "DistributionLorentz.pypp.h"
+#include "IDistribution1D.pypp.h"
+#include "HomogeneousMagneticMaterial.pypp.h"
+#include "FormFactorCuboctahedron.pypp.h"
+#include "cvector_t.pypp.h"
 #include "PythonInterface_free_functions.pypp.h"
-#include "vector_longinteger_t.pypp.h"
 #include "FormFactorSphereLogNormalRadius.pypp.h"
-#include "FormFactorSphereGaussianRadius.pypp.h"
+#include "FormFactorInfLongRipple1.pypp.h"
+#include "IResolutionFunction2D.pypp.h"
+#include "FormFactorFullSphere.pypp.h"
+#include "ParticleLayout.pypp.h"
+#include "FormFactorBox.pypp.h"
+#include "IParameterized.pypp.h"
+#include "Lattice2DIFParameters.pypp.h"
+#include "IFormFactorDecorator.pypp.h"
+#include "InterferenceFunction1DLattice.pypp.h"
+#include "ISample.pypp.h"
+#include "ISampleBuilder.pypp.h"
+#include "PythonInterface_global_variables.pypp.h"
+#include "Beam.pypp.h"
+#include "HomogeneousMaterial.pypp.h"
+#include "ICloneable.pypp.h"
+#include "ParticleCoreShell.pypp.h"
+#include "FormFactorDecoratorDebyeWaller.pypp.h"
+#include "MesoCrystal.pypp.h"
+#include "Lattice1DIFParameters.pypp.h"
+#include "IObserver.pypp.h"
+#include "IntensityData.pypp.h"
+#include "Lattice.pypp.h"
+#include "IInterferenceFunction.pypp.h"
+#include "ParticleInfo.pypp.h"
+#include "Instrument.pypp.h"
+#include "FormFactorInfLongBox.pypp.h"
+#include "FormFactorCone.pypp.h"
+#include "ParticleComposition.pypp.h"
+#include "FTDistribution2DGauss.pypp.h"
 #include "FormFactorTruncatedSphere.pypp.h"
-#include "IntensityDataFunctions.pypp.h"
-#include "DistributionLorentz.pypp.h"
-#include "ConstKBinAxis.pypp.h"
-#include "ParameterDistribution.pypp.h"
-#include "ParameterPool.pypp.h"
+#include "FTDistribution2DVoigt.pypp.h"
+#include "FormFactorGauss.pypp.h"
+#include "InterferenceFunction2DParaCrystal.pypp.h"
+#include "Detector.pypp.h"
+#include "FormFactorInfLongRipple2.pypp.h"
+#include "ICompositeSample.pypp.h"
+#include "Bin1D.pypp.h"
 #include "vector_complex_t.pypp.h"
-#include "SpecularSimulation.pypp.h"
-#include "FormFactorAnisoPyramid.pypp.h"
-#include "FormFactorCuboctahedron.pypp.h"
-#include "MultiLayer.pypp.h"
-#include "FormFactorCone.pypp.h"
-#include "IDistribution1D.pypp.h"
-#include "LayerRoughness.pypp.h"
-#include "VariableBinAxis.pypp.h"
-#include "SimpleSelectionRule.pypp.h"
-#include "FixedBinAxis.pypp.h"
-#include "InterferenceFunctionRadialParaCrystal.pypp.h"
-#include "Lattice2DIFParameters.pypp.h"
-#include "IFormFactor.pypp.h"
-#include "vdouble1d_t.pypp.h"
+#include "DistributionLogNormal.pypp.h"
 #include "IFTDistribution2D.pypp.h"
-#include "Beam.pypp.h"
-#include "FormFactorSphereUniformRadius.pypp.h"
-#include "FTDistribution1DCauchy.pypp.h"
-#include "kvector_t.pypp.h"
-#include "Crystal.pypp.h"
-#include "ISelectionRule.pypp.h"
-#include "vector_integer_t.pypp.h"
 #include "__call_policies.pypp.hpp"
 #include "__convenience.pypp.hpp"
 #include "__call_policies.pypp.hpp"
@@ -240,7 +240,6 @@ BOOST_PYTHON_MODULE(libBornAgainCore){
     register_Lattice_class();
     register_Lattice1DIFParameters_class();
     register_Lattice2DIFParameters_class();
-    register_LatticeBasis_class();
     register_Layer_class();
     register_LayerInterface_class();
     register_LayerRoughness_class();
@@ -251,6 +250,7 @@ BOOST_PYTHON_MODULE(libBornAgainCore){
     register_ParameterDistribution_class();
     register_ParameterPool_class();
     register_Particle_class();
+    register_ParticleComposition_class();
     register_ParticleCoreShell_class();
     register_ParticleDistribution_class();
     register_ParticleInfo_class();
diff --git a/Core/Samples/inc/Crystal.h b/Core/Samples/inc/Crystal.h
index 27a4b4281c6460ed77dc2f5408048de0aac209e4..6d0d9dfe48d287c89934dc5a4be990a0bc9b5db0 100644
--- a/Core/Samples/inc/Crystal.h
+++ b/Core/Samples/inc/Crystal.h
@@ -19,7 +19,7 @@
 #include "IClusteredParticles.h"
 #include "Particle.h"
 #include "Lattice.h"
-#include "LatticeBasis.h"
+#include "ParticleComposition.h"
 
 
 //! @class Crystal
@@ -29,7 +29,7 @@
 class BA_CORE_API_ Crystal : public IClusteredParticles
 {
 public:
-    Crystal(const LatticeBasis& lattice_basis, const Lattice& lattice);
+    Crystal(const ParticleComposition& lattice_basis, const Lattice& lattice);
     ~Crystal();
 
     virtual Crystal *clone() const;
@@ -55,7 +55,7 @@ public:
 
     Lattice getTransformedLattice() const;
 
-    const LatticeBasis *getLatticeBasis() const { return mp_lattice_basis; }
+    const ParticleComposition *getLatticeBasis() const { return mp_lattice_basis; }
 
     void setDWFactor(double dw_factor) { m_dw_factor = dw_factor; }
 
@@ -70,7 +70,7 @@ public:
 
 private:
     //! Private constructor
-    Crystal(LatticeBasis *p_lattice_basis, const Lattice& lattice);
+    Crystal(ParticleComposition *p_lattice_basis, const Lattice& lattice);
 
     //! Propagates a transformation to child particles
     virtual void applyTransformationToSubParticles(
@@ -78,7 +78,7 @@ private:
 
     Lattice m_lattice;
     std::auto_ptr<Geometry::Transform3D> mP_transform;
-    LatticeBasis *mp_lattice_basis;
+    ParticleComposition *mp_lattice_basis;
     double m_dw_factor;
 };
 
diff --git a/Core/Samples/inc/ISampleVisitor.h b/Core/Samples/inc/ISampleVisitor.h
index 5ce76bccfd947624ecab6379da91d6211d5fc317..d1d5cda4346314b063ad08ff9a589319f8bffdb7 100644
--- a/Core/Samples/inc/ISampleVisitor.h
+++ b/Core/Samples/inc/ISampleVisitor.h
@@ -37,7 +37,7 @@ class MultiLayer;
 class IParticle;
 class Particle;
 class ParticleDistribution;
-class LatticeBasis;
+class ParticleComposition;
 class MesoCrystal;
 class ParticleCoreShell;
 // -
@@ -133,7 +133,7 @@ public:
     virtual void visit(const IParticle *);
     virtual void visit(const Particle *);
     virtual void visit(const ParticleDistribution *);
-    virtual void visit(const LatticeBasis *);
+    virtual void visit(const ParticleComposition *);
     virtual void visit(const MesoCrystal *);
     virtual void visit(const ParticleCoreShell *);
 
diff --git a/Core/Samples/inc/LatticeBasis.h b/Core/Samples/inc/LatticeBasis.h
deleted file mode 100644
index 8be2d4817ede122626775d28c501c6de1ad5f632..0000000000000000000000000000000000000000
--- a/Core/Samples/inc/LatticeBasis.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Samples/inc/LatticeBasis.h
-//! @brief     Defines class LatticeBasis.
-//!
-//! @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
-//
-// ************************************************************************** //
-
-#ifndef LATTICEBASIS_H_
-#define LATTICEBASIS_H_
-
-#include "IParticle.h"
-#include "Types.h"
-#include <vector>
-
-//! @class LatticeBasis
-//! @ingroup samples
-//! @brief Basis of the lattice represented by the composition of particles
-
-class BA_CORE_API_ LatticeBasis : public IParticle
-{
-public:
-    LatticeBasis();
-    explicit LatticeBasis(const IParticle& particle);
-    LatticeBasis(const IParticle& particle, std::vector<kvector_t > positions);
-    virtual ~LatticeBasis();
-    virtual LatticeBasis *clone() const;
-
-    //! Returns a clone with inverted magnetic fields
-    virtual LatticeBasis *cloneInvertB() const;
-
-    //! Calls the ISampleVisitor's visit method
-    virtual void accept(ISampleVisitor *visitor) const { visitor->visit(this); }
-
-    void addParticle(const IParticle& particle,
-                     std::vector<kvector_t > positions);
-
-    virtual void setAmbientMaterial(const IMaterial& material);
-    virtual const IMaterial* getAmbientMaterial() const;
-
-    virtual IFormFactor* createFormFactor(
-            complex_t wavevector_scattering_factor) const;
-
-    //! Returns number of different particles
-    size_t getNbrParticles() const {return m_particles.size(); }
-
-    //! Returns number of positions for particle with index
-    size_t getNbrPositionsForParticle(size_t index) const
-    { return m_positions_vector[check_index(index)].size(); }
-
-    //! Returns particle with given index
-    const IParticle *getParticle(size_t index) const {
-        return m_particles[check_index(index)];
-    }
-
-    std::vector<kvector_t> getParticlePositions(size_t index) const
-    { return m_positions_vector[check_index(index)]; }
-
-protected:
-    virtual void applyTransformationToSubParticles(
-            const Geometry::Transform3D& transform);
-
-private:
-    //! Checks index
-    inline size_t check_index(size_t index) const {
-        return index < m_positions_vector.size()
-                ? index
-                : throw OutOfBoundsException("LatticeBasis::check_index()"
-                        "-> Index is out of bounds"); }
-
-    //! For internal use in cloneInvertB():
-    void addParticlePointer(IParticle *p_particle,
-            std::vector<kvector_t > positions);
-
-    std::vector<IParticle *> m_particles;
-    std::vector<std::vector<kvector_t> > m_positions_vector;
-};
-
-#endif /* LATTICEBASIS_H_ */
-
-
diff --git a/Core/Samples/src/Crystal.cpp b/Core/Samples/src/Crystal.cpp
index d450a6aab527879fa1b01859260f5e37f7b88a2e..de5bd87c2d26f396723125b6c9bd2bb949682051 100644
--- a/Core/Samples/src/Crystal.cpp
+++ b/Core/Samples/src/Crystal.cpp
@@ -20,7 +20,7 @@
 
 #include <boost/scoped_ptr.hpp>
 
-Crystal::Crystal(const LatticeBasis& lattice_basis,
+Crystal::Crystal(const ParticleComposition& lattice_basis,
         const Lattice& lattice)
 : m_lattice(lattice)
 , m_dw_factor(0.0)
@@ -89,7 +89,7 @@ void Crystal::applyTransformation(const Geometry::Transform3D& transform)
     applyTransformationToSubParticles(transform);
 }
 
-Crystal::Crystal(LatticeBasis* p_lattice_basis, const Lattice& lattice)
+Crystal::Crystal(ParticleComposition* p_lattice_basis, const Lattice& lattice)
 : m_lattice(lattice)
 , m_dw_factor(0.0)
 {
diff --git a/Core/Samples/src/ISampleVisitor.cpp b/Core/Samples/src/ISampleVisitor.cpp
index 518267e93ac9d84e4379ca02f6e0f94807628c57..fa8e1c79a3a92a04fc19a910f020b5b6c5780bb2 100644
--- a/Core/Samples/src/ISampleVisitor.cpp
+++ b/Core/Samples/src/ISampleVisitor.cpp
@@ -107,9 +107,9 @@ void ISampleVisitor::visit(const ParticleDistribution *)
 }
 
 
-void ISampleVisitor::visit(const LatticeBasis *)
+void ISampleVisitor::visit(const ParticleComposition *)
 {
-    throw NotImplementedException("ISampleVisitor::visit(const LatticeBasis *) -> Error. Not implemented.");
+    throw NotImplementedException("ISampleVisitor::visit(const ParticleComposition *) -> Error. Not implemented.");
 }
 
 
diff --git a/Core/Samples/src/LatticeBasis.cpp b/Core/Samples/src/LatticeBasis.cpp
deleted file mode 100644
index 38d11e07ebc0d4716197a639eedaf106582979a5..0000000000000000000000000000000000000000
--- a/Core/Samples/src/LatticeBasis.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Samples/src/LatticeBasis.cpp
-//! @brief     Implements class LatticeBasis.
-//!
-//! @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 "LatticeBasis.h"
-#include "FormFactors.h"
-#include "Materials.h"
-#include <boost/scoped_ptr.hpp>
-
-LatticeBasis::LatticeBasis()
-{
-    setName("LatticeBasis");
-}
-
-LatticeBasis::LatticeBasis(const IParticle& particle)
-{
-    setName("LatticeBasis");
-    std::vector<kvector_t> positions;
-    positions.push_back(kvector_t(0.0, 0.0, 0.0));
-    addParticle( particle, positions );
-}
-
-LatticeBasis::LatticeBasis(const IParticle& particle,
-        std::vector<kvector_t> positions)
-{
-    setName("LatticeBasis");
-    addParticle(particle, positions);
-}
-
-LatticeBasis::~LatticeBasis()
-{
-    for (size_t index=0; index<m_particles.size(); ++index) {
-        delete m_particles[index];
-    }
-}
-
-LatticeBasis* LatticeBasis::clone() const
-{
-    LatticeBasis *p_new = new LatticeBasis();
-    for (size_t index=0; index<m_particles.size(); ++index) {
-        p_new->addParticle(*m_particles[index], m_positions_vector[index]);
-    }
-    p_new->setName(getName());
-    p_new->setAmbientMaterial(*getAmbientMaterial());
-    if (mP_transform.get()) {
-        p_new->mP_transform.reset(mP_transform->clone());
-    }
-    return p_new;
-}
-
-LatticeBasis* LatticeBasis::cloneInvertB() const
-{
-    LatticeBasis *p_new = new LatticeBasis();
-    for (size_t index=0; index<m_particles.size(); ++index) {
-        p_new->addParticlePointer(m_particles[index]->cloneInvertB(),
-                m_positions_vector[index]);
-    }
-    p_new->setName(getName() + "_inv");
-
-    if(getAmbientMaterial()) {
-        p_new->setAmbientMaterial(*Materials::createInvertedMaterial(getAmbientMaterial()));
-    }
-    if (mP_transform.get()) {
-        p_new->mP_transform.reset(mP_transform->clone());
-    }
-
-    return p_new;
-}
-
-void LatticeBasis::addParticle(const IParticle& particle,
-        std::vector<kvector_t > positions)
-{
-    IParticle *np = particle.clone();
-    registerChild(np);
-    m_particles.push_back(np);
-    m_positions_vector.push_back(positions);
-}
-
-void LatticeBasis::setAmbientMaterial(const IMaterial& material)
-{
-    for (size_t index=0; index<m_particles.size(); ++index) {
-        m_particles[index]->setAmbientMaterial(material);
-    }
-}
-
-const IMaterial *LatticeBasis::getAmbientMaterial() const
-{
-    if (m_particles.size()==0) return 0;
-    return m_particles[0]->getAmbientMaterial();
-}
-
-IFormFactor* LatticeBasis::createFormFactor(
-        complex_t wavevector_scattering_factor) const
-{
-    FormFactorWeighted *p_ff = new FormFactorWeighted();
-    for (size_t index=0; index<m_particles.size(); ++index) {
-        boost::scoped_ptr<IFormFactor> P_particle_ff(
-                m_particles[index]->createFormFactor(
-                                      wavevector_scattering_factor));
-        FormFactorDecoratorMultiPositionFactor pos_ff(*P_particle_ff,
-                m_positions_vector[index]);
-        p_ff->addFormFactor(pos_ff);
-    }
-    p_ff->setAmbientMaterial(*getAmbientMaterial());
-    return p_ff;
-}
-
-void LatticeBasis::applyTransformationToSubParticles(
-        const Geometry::Transform3D& transform)
-{
-    for (std::vector<IParticle *>::iterator it = m_particles.begin();
-            it != m_particles.end(); ++it)
-    {
-        (*it)->applyTransformation(transform);
-    }
-    for (std::vector<std::vector<kvector_t> >::iterator it_vec =
-            m_positions_vector.begin(); it_vec != m_positions_vector.end();
-            ++it_vec) {
-        for (std::vector<kvector_t>::iterator it_vec_el = it_vec->begin();
-                it_vec_el != it_vec->end(); ++it_vec_el) {
-            *it_vec_el = transform.transformed(*it_vec_el);
-        }
-    }
-}
-
-void LatticeBasis::addParticlePointer(IParticle* p_particle,
-        std::vector<kvector_t> positions)
-{
-    registerChild(p_particle);
-    m_particles.push_back(p_particle);
-    m_positions_vector.push_back(positions);
-}
-
diff --git a/Core/StandardSamples/IsGISAXS06Builder.cpp b/Core/StandardSamples/IsGISAXS06Builder.cpp
index 5191c5f481a3bce9257fb16b492c76182748c934..fa4d448ed1e06fd9b4a4d482daef9b0a4431e17d 100644
--- a/Core/StandardSamples/IsGISAXS06Builder.cpp
+++ b/Core/StandardSamples/IsGISAXS06Builder.cpp
@@ -16,6 +16,7 @@
 #include "IsGISAXS06Builder.h"
 #include "MultiLayer.h"
 #include "ParticleLayout.h"
+#include "ParticleComposition.h"
 #include "FormFactorCylinder.h"
 #include "Simulation.h"
 #include "Units.h"
@@ -24,7 +25,7 @@
 #include "IntensityDataIOFactory.h"
 #include "Utils.h"
 
-#include <LatticeBasis.h>
+
 
 
 // -----------------------------------------------------------------------------
@@ -91,7 +92,7 @@ ISample *IsGISAXS06Lattice2Builder::buildSample() const
     kvector_t position_2(5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
     positions.push_back(position_1);
     positions.push_back(position_2);
-    LatticeBasis basis;
+    ParticleComposition basis;
     basis.addParticle(cylinder, positions);
 
     ParticleLayout particle_layout;
diff --git a/Core/StandardSamples/MesoCrystal01Builder.cpp b/Core/StandardSamples/MesoCrystal01Builder.cpp
index 27af114896f0581434714fbbf8de271f7c7a3d2a..fd9ab4024ee863012543b1944d16b322fd7b9da4 100644
--- a/Core/StandardSamples/MesoCrystal01Builder.cpp
+++ b/Core/StandardSamples/MesoCrystal01Builder.cpp
@@ -155,7 +155,7 @@ MesoCrystal* MesoCrystal01Builder::createMesoCrystal(double stacking_radius_a, d
     pos_vector.push_back(position_0);
     pos_vector.push_back(position_1);
     pos_vector.push_back(position_2);
-    LatticeBasis basis(particle, pos_vector);
+    ParticleComposition basis(particle, pos_vector);
 
     Crystal npc(basis, *p_lat);
     delete p_lat;
diff --git a/Core/Tools/inc/LabelSample.h b/Core/Tools/inc/LabelSample.h
index ee4fa729188cc384f7bf6d68b6ce84002c1684b0..c84114eb034dbc10f520b6714e0c9e91bc0fb8d6 100644
--- a/Core/Tools/inc/LabelSample.h
+++ b/Core/Tools/inc/LabelSample.h
@@ -36,7 +36,7 @@ public:
     std::map<const Particle*, std::string>* getParticleMap();
     std::map<const ParticleCoreShell*, std::string>* getParticleCoreShellMap();
     std::map<const ILayout*, std::string>* getParticleLayoutMap();
-    std::map<const LatticeBasis*, std::string>* getLatticeBasisMap();
+    std::map<const ParticleComposition*, std::string>* getParticleCompositionMap();
     std::string getLabel(const IFormFactor *sample);
     std::string getLabel(const IInterferenceFunction *sample);
     std::string getLabel(const IMaterial *sample);
@@ -46,7 +46,7 @@ public:
     std::string getLabel(const IParticle *sample);
     std::string getLabel(const ParticleCoreShell *sample);
     std::string getLabel(const ILayout *sample);
-    std::string getLabel(const LatticeBasis *sample);
+    std::string getLabel(const ParticleComposition *sample);
     void insertMaterial(const IMaterial *sample);
     void setLabel(const IFormFactor *sample);
     void setLabel(const IInterferenceFunction *sample);
@@ -56,7 +56,7 @@ public:
     void setLabel(const MultiLayer *sample);
     void setLabel(const Particle *sample);
     void setLabel(const ParticleCoreShell *sample);
-    void setLabel(const LatticeBasis *sample);
+    void setLabel(const ParticleComposition *sample);
 
 
 private:
@@ -70,7 +70,7 @@ private:
     std::map<const Particle*, std::string> m_ParticleLabel;
     std::map<const ParticleCoreShell*, std::string> m_ParticleCoreShellLabel;
     std::map<const ILayout*, std::string> m_ILayoutLabel;
-    std::map<const LatticeBasis*, std::string> m_LatticeBasisLabel;
+    std::map<const ParticleComposition*, std::string> m_ParticleCompositionLabel;
 };
 
 #endif // LABELSAMPLE_H
diff --git a/Core/Tools/inc/PyGenVisitor.h b/Core/Tools/inc/PyGenVisitor.h
index 9f5c0f1b41aee3303f65e9553d24867ed543f691..2a86a016c688851cd6be6b826a9c44fc46f926df 100644
--- a/Core/Tools/inc/PyGenVisitor.h
+++ b/Core/Tools/inc/PyGenVisitor.h
@@ -64,7 +64,7 @@ public:
     void visit(const LayerInterface *sample){ (void)sample; }
     void visit(const LayerRoughness *sample);
     void visit(const MultiLayer *sample);
-    void visit(const LatticeBasis *sample);
+    void visit(const ParticleComposition *sample);
     void visit(const MesoCrystal *sample);
     void visit(const Particle *sample);
     void visit(const ParticleCoreShell *sample);
@@ -81,7 +81,7 @@ private:
     std::string defineFormFactors() const;
     std::string defineParticles() const;
     std::string defineCoreShellParticles() const;
-    std::string defineLatticeBases() const;
+    std::string defineParticleCompositions() const;
     std::string defineInterferenceFunctions() const;
     std::string defineParticleLayouts() const;
     std::string defineRoughnesses() const;
diff --git a/Core/Tools/inc/SampleMaterialVisitor.h b/Core/Tools/inc/SampleMaterialVisitor.h
index bd1ebfa42509ebf0dd7839a206a937873a2b57ae..c3d721048413c1a72d367d0426895c55e8505e2f 100644
--- a/Core/Tools/inc/SampleMaterialVisitor.h
+++ b/Core/Tools/inc/SampleMaterialVisitor.h
@@ -51,7 +51,7 @@ public:
 
     void visit(const Particle *sample);
     void visit(const ParticleDistribution *sample);
-    void visit(const LatticeBasis *sample);
+    void visit(const ParticleComposition *sample);
     void visit(const MesoCrystal *sample);
     void visit(const ParticleCoreShell *sample);
 
diff --git a/Core/Tools/inc/SamplePrintVisitor.h b/Core/Tools/inc/SamplePrintVisitor.h
index 582e53556ae1b9f5e8e16d5ab7acbc307dd3081d..f68e083ef10aaed0a5d295ff1d1630136ba3e11b 100644
--- a/Core/Tools/inc/SamplePrintVisitor.h
+++ b/Core/Tools/inc/SamplePrintVisitor.h
@@ -48,7 +48,7 @@ public:
 
     void visit(const Particle *sample);
     void visit(const ParticleDistribution *sample);
-    void visit(const LatticeBasis *sample);
+    void visit(const ParticleComposition *sample);
     void visit(const MesoCrystal *sample);
     void visit(const ParticleCoreShell *sample);
 
diff --git a/Core/Tools/src/LabelSample.cpp b/Core/Tools/src/LabelSample.cpp
index 0ee39e1951b4459dc7c8232e5e932cd3c6d1ad25..44e1843fea874f54445f412059e9365577f48bb7 100644
--- a/Core/Tools/src/LabelSample.cpp
+++ b/Core/Tools/src/LabelSample.cpp
@@ -13,10 +13,10 @@
 //
 // ************************************************************************** //
 
-#include <LatticeBasis.h>
 #include <iostream>
 #include "LabelSample.h"
 #include "ParticleCoreShell.h"
+#include "ParticleComposition.h"
 
 LabelSample::LabelSample()
 {
@@ -59,8 +59,8 @@ std::string LabelSample::getLabel(const IParticle *sample)
         return m_ParticleCoreShellLabel[core_shell_particle];
     if (const Particle *particle = dynamic_cast<const Particle*>(sample))
         return m_ParticleLabel[particle];
-    if (const LatticeBasis *lattice_basis = dynamic_cast<const LatticeBasis*>(sample))
-        return m_LatticeBasisLabel[lattice_basis];
+    if (const ParticleComposition *lattice_basis = dynamic_cast<const ParticleComposition*>(sample))
+        return m_ParticleCompositionLabel[lattice_basis];
     throw Exceptions::NotImplementedException("LabelSample::getLabel: called"
                                               " for unknown IParticle type");
 }
@@ -75,9 +75,9 @@ std::string LabelSample::getLabel(const ILayout *sample)
     return m_ILayoutLabel[sample];
 }
 
-std::string LabelSample::getLabel(const LatticeBasis *sample)
+std::string LabelSample::getLabel(const ParticleComposition *sample)
 {
-    return m_LatticeBasisLabel[sample];
+    return m_ParticleCompositionLabel[sample];
 }
 
 std::map<const IFormFactor *,std::string>* LabelSample::getFormFactorMap()
@@ -125,9 +125,9 @@ std::map<const ILayout *,std::string>* LabelSample::getParticleLayoutMap()
     return &m_ILayoutLabel;
 }
 
-std::map<const LatticeBasis *, std::string> *LabelSample::getLatticeBasisMap()
+std::map<const ParticleComposition *, std::string> *LabelSample::getParticleCompositionMap()
 {
-    return &m_LatticeBasisLabel;
+    return &m_ParticleCompositionLabel;
 }
 
 void LabelSample::insertMaterial(const IMaterial *sample)
@@ -210,11 +210,11 @@ void LabelSample::setLabel(const ParticleCoreShell *sample)
     m_ParticleCoreShellLabel[sample] = inter.str();
 }
 
-void LabelSample::setLabel(const LatticeBasis *sample)
+void LabelSample::setLabel(const ParticleComposition *sample)
 {
     std::ostringstream inter;
-    inter << "LatticeBasis_" << m_LatticeBasisLabel.size()+1;
-    m_LatticeBasisLabel[sample] = inter.str();
+    inter << "ParticleComposition_" << m_ParticleCompositionLabel.size()+1;
+    m_ParticleCompositionLabel[sample] = inter.str();
 }
 
 
diff --git a/Core/Tools/src/PyGenVisitor.cpp b/Core/Tools/src/PyGenVisitor.cpp
index 82880adc6d1f0df151ee2377770c88bd69dfd6d8..db0693165ada613d6b250a30544398ab1c389159 100644
--- a/Core/Tools/src/PyGenVisitor.cpp
+++ b/Core/Tools/src/PyGenVisitor.cpp
@@ -211,7 +211,7 @@ void PyGenVisitor::visit(const MultiLayer *sample)
     m_label->setLabel(sample);
 }
 
-void PyGenVisitor::visit(const LatticeBasis *sample)
+void PyGenVisitor::visit(const ParticleComposition *sample)
 {
     m_label->setLabel(sample);
 }
@@ -266,7 +266,7 @@ std::string PyGenVisitor::defineGetSample() const
     result << defineFormFactors();
     result << defineParticles();
     result << defineCoreShellParticles();
-    result << defineLatticeBases();
+    result << defineParticleCompositions();
     result << defineInterferenceFunctions();
     result << defineParticleLayouts();
     result << defineRoughnesses();
@@ -686,18 +686,18 @@ std::string PyGenVisitor::defineCoreShellParticles() const
     return result.str();
 }
 
-std::string PyGenVisitor::defineLatticeBases() const
+std::string PyGenVisitor::defineParticleCompositions() const
 {
-    if (m_label->getLatticeBasisMap()->size() == 0) return "";
+    if (m_label->getParticleCompositionMap()->size() == 0) return "";
     std::ostringstream result;
     result << std::setprecision(12);
     result << "\n\t# Defining collection of particles with specific positions\n";
-    std::map<const LatticeBasis *,std::string>::iterator it =
-            m_label->getLatticeBasisMap()->begin();
+    std::map<const ParticleComposition *,std::string>::iterator it =
+            m_label->getParticleCompositionMap()->begin();
 
-    while (it != m_label->getLatticeBasisMap()->end())
+    while (it != m_label->getParticleCompositionMap()->end())
     {
-        result << "\t" << it->second << " = LatticeBasis()\n";
+        result << "\t" << it->second << " = ParticleComposition()\n";
         for (size_t i=0; i<it->first->getNbrParticles(); ++i) {
             std::vector<kvector_t> position_vector = it->first->getParticlePositions(i);
             for (size_t j=0; j<position_vector.size(); ++j) {
diff --git a/Core/Tools/src/SampleMaterialVisitor.cpp b/Core/Tools/src/SampleMaterialVisitor.cpp
index a13361caa2b5f8b68d0a9d06a9527722d11569ae..5a3357113e916b0b24a8f5ac3b5f8afd271603ef 100644
--- a/Core/Tools/src/SampleMaterialVisitor.cpp
+++ b/Core/Tools/src/SampleMaterialVisitor.cpp
@@ -17,7 +17,7 @@
 #include "IMaterial.h"
 #include "Layer.h"
 #include "Particle.h"
-#include "LatticeBasis.h"
+#include "ParticleComposition.h"
 
 
 void SampleMaterialVisitor::clear()
@@ -100,7 +100,7 @@ void SampleMaterialVisitor::visit(const ParticleDistribution *)
 {
 }
 
-void SampleMaterialVisitor::visit(const LatticeBasis *)
+void SampleMaterialVisitor::visit(const ParticleComposition *)
 {
 }
 
diff --git a/Core/Tools/src/SamplePrintVisitor.cpp b/Core/Tools/src/SamplePrintVisitor.cpp
index bc63687e97c6814cd3aa2100045cd6e6c123335d..35d280d7d3de16424d8f8900470f43f239de57fa 100644
--- a/Core/Tools/src/SamplePrintVisitor.cpp
+++ b/Core/Tools/src/SamplePrintVisitor.cpp
@@ -113,7 +113,7 @@ void SamplePrintVisitor::visit(const ParticleDistribution *sample)
 }
 
 
-void SamplePrintVisitor::visit(const LatticeBasis *sample)
+void SamplePrintVisitor::visit(const ParticleComposition *sample)
 {
     print_default(sample);
 }
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DCenteredSquareLattice.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DCenteredSquareLattice.py
index e9d75c878d31190c92a5100fa0d333bcbf8e0eae..50d9def4326edcd6e0263cb5ce003c2ced1e36cd 100644
--- a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DCenteredSquareLattice.py
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DCenteredSquareLattice.py
@@ -29,7 +29,7 @@ def get_sample():
     position2 = kvector_t(12.5*nanometer, 12.5*nanometer, 0.0)
     cylinder_ff = FormFactorCylinder(3.*nanometer, 3.*nanometer)
     cylinder = Particle(m_particle, cylinder_ff)
-    basis = LatticeBasis()
+    basis = ParticleComposition()
     basis.addParticle(cylinder, [position1, position2])
     particle_layout.addParticle(basis)
     particle_layout.addInterferenceFunction(interference)
diff --git a/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py b/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py
index 47275314dc411a18fe9e1960f7a74b660d954ce6..bc85bc0c021ccacea35282d4ec25977a71a70ae3 100644
--- a/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py
+++ b/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py
@@ -25,7 +25,7 @@ def get_sample():
 
     pos0 = kvector_t(0.0, 0.0, 0.0)
     pos1 = kvector_t(radius, radius, numpy.sqrt(3.0)*radius)
-    basis = LatticeBasis()
+    basis = ParticleComposition()
     basis.addParticle(sphere, [pos0, pos1])
     particle_layout.addParticle(basis)
 
diff --git a/Fit/PythonAPI/src/PythonModule.cpp b/Fit/PythonAPI/src/PythonModule.cpp
index 9e316599b4cf7992d66a9756e63a29a6c5020ac4..ef8312b19c0e5f34a1dd036a15ac8689fdb68a4c 100644
--- a/Fit/PythonAPI/src/PythonModule.cpp
+++ b/Fit/PythonAPI/src/PythonModule.cpp
@@ -5,38 +5,38 @@ GCC_DIAG_OFF(missing-field-initializers)
 #include "boost/python.hpp"
 GCC_DIAG_ON(unused-parameter)
 GCC_DIAG_ON(missing-field-initializers)
-#include "FitObject.pypp.h"
-#include "IntensityFunctionLog.pypp.h"
 #include "IntensityFunctionSqrt.pypp.h"
-#include "FitStrategyDefault.pypp.h"
-#include "IChiSquaredModule.pypp.h"
+#include "MinimizerFactory.pypp.h"
+#include "IMinimizer.pypp.h"
+#include "vector_string_t.pypp.h"
+#include "SquaredFunctionSystematicError.pypp.h"
+#include "IntensityNormalizer.pypp.h"
+#include "IIntensityFunction.pypp.h"
+#include "INamed.pypp.h"
+#include "IntensityFunctionLog.pypp.h"
+#include "FitSuiteParameters.pypp.h"
 #include "AttFitting.pypp.h"
-#include "FitStrategyAdjustParameters.pypp.h"
+#include "FitParameter.pypp.h"
+#include "IntensityScaleAndShiftNormalizer.pypp.h"
+#include "IChiSquaredModule.pypp.h"
 #include "FitStrategyAdjustMinimizer.pypp.h"
-#include "ISquaredFunction.pypp.h"
+#include "IFitStrategy.pypp.h"
+#include "FitStrategyFixParameters.pypp.h"
 #include "SquaredFunctionGaussianError.pypp.h"
-#include "IIntensityFunction.pypp.h"
-#include "IntensityScaleAndShiftNormalizer.pypp.h"
-#include "SquaredFunctionMeanSquaredError.pypp.h"
-#include "FitSuiteParameters.pypp.h"
-#include "IMinimizer.pypp.h"
 #include "IIntensityNormalizer.pypp.h"
-#include "FitParameter.pypp.h"
-#include "INamed.pypp.h"
-#include "FitStrategyReleaseParameters.pypp.h"
 #include "FitSuite.pypp.h"
-#include "IntensityNormalizer.pypp.h"
-#include "FitStrategyFixParameters.pypp.h"
-#include "FitSuiteObjects.pypp.h"
-#include "SquaredFunctionSystematicError.pypp.h"
-#include "MinimizerFactory.pypp.h"
+#include "FitStrategyAdjustParameters.pypp.h"
 #include "ChiSquaredModule.pypp.h"
-#include "SquaredFunctionSimError.pypp.h"
 #include "MinimizerOptions.pypp.h"
-#include "AttLimits.pypp.h"
 #include "SquaredFunctionDefault.pypp.h"
-#include "vector_string_t.pypp.h"
-#include "IFitStrategy.pypp.h"
+#include "SquaredFunctionMeanSquaredError.pypp.h"
+#include "ISquaredFunction.pypp.h"
+#include "FitStrategyDefault.pypp.h"
+#include "AttLimits.pypp.h"
+#include "FitObject.pypp.h"
+#include "FitSuiteObjects.pypp.h"
+#include "SquaredFunctionSimError.pypp.h"
+#include "FitStrategyReleaseParameters.pypp.h"
 
 BOOST_PYTHON_MODULE(libBornAgainFit){
     boost::python::docstring_options doc_options(true, true, false);
diff --git a/GUI/coregui/Models/DomainObjectBuilder.cpp b/GUI/coregui/Models/DomainObjectBuilder.cpp
index 81481fb74dae679ea3053153c04b21bb10b115d1..38ea8cbf5806a5916d52fce743e0f606e1129db3 100644
--- a/GUI/coregui/Models/DomainObjectBuilder.cpp
+++ b/GUI/coregui/Models/DomainObjectBuilder.cpp
@@ -105,7 +105,7 @@ ParticleLayout *DomainObjectBuilder::buildParticleLayout(const ParameterizedItem
                 result->addParticle(*part_distr, depth, abundance);
             }
         } else if (children[i]->modelType() == Constants::ParticleCollectionType) {
-            boost::scoped_ptr<LatticeBasis> part_coll(
+            boost::scoped_ptr<ParticleComposition> part_coll(
                 buildParticleCollection(*children[i], depth, abundance));
             if (part_coll.get()) {
                 result->addParticle(*part_coll, depth, abundance);
@@ -178,10 +178,10 @@ ParticleCoreShell *DomainObjectBuilder::buildParticleCoreShell(const Parameteriz
     return result;
 }
 
-LatticeBasis *DomainObjectBuilder::buildParticleCollection(const ParameterizedItem &item,
+ParticleComposition *DomainObjectBuilder::buildParticleCollection(const ParameterizedItem &item,
                                                            double &depth, double &abundance) const
 {
-    LatticeBasis *result = TransformToDomain::createParticleCollection(item, depth, abundance);
+    ParticleComposition *result = TransformToDomain::createParticleCollection(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);
@@ -308,7 +308,7 @@ void DomainObjectBuilder::addParticleToLayout(ParticleLayout *result,
     }
 }
 
-void DomainObjectBuilder::addParticleToCollection(LatticeBasis *result,
+void DomainObjectBuilder::addParticleToCollection(ParticleComposition *result,
                                                   ParameterizedItem *particle_item,
                                                   const IParticle &particle) const
 {
diff --git a/GUI/coregui/Models/DomainObjectBuilder.h b/GUI/coregui/Models/DomainObjectBuilder.h
index 830f034f6352f7e812c2f35b8b0d76f475825d35..2ad4239b80fdeb687a2e043df7886d7d7834ffd8 100644
--- a/GUI/coregui/Models/DomainObjectBuilder.h
+++ b/GUI/coregui/Models/DomainObjectBuilder.h
@@ -27,7 +27,7 @@ class Particle;
 class IInterferenceFunction;
 class Beam;
 class ParticleCoreShell;
-class LatticeBasis;
+class ParticleComposition;
 class ParticleDistribution;
 class ParameterizedItem;
 class LayerRoughness;
@@ -47,7 +47,7 @@ private:
     Particle *buildParticle(const ParameterizedItem &item, double &depth, double &abundance) const;
     ParticleCoreShell *buildParticleCoreShell(const ParameterizedItem &item,
                                      double &depth, double &abundance) const;
-    LatticeBasis *buildParticleCollection(const ParameterizedItem &item, double &depth,
+    ParticleComposition *buildParticleCollection(const ParameterizedItem &item, double &depth,
                                           double &abundance) const;
     ParticleDistribution *buildParticleDistribution(const ParameterizedItem &item, double &depth,
                                                     double &abundance) const;
@@ -56,7 +56,7 @@ private:
     Beam *buildBeam(const ParameterizedItem &item) const;
     void addParticleToLayout(ParticleLayout *result, ParameterizedItem *particle_item, double depth,
                              double abundance, const Particle& particle) const;
-    void addParticleToCollection(LatticeBasis *result, ParameterizedItem *particle_item,
+    void addParticleToCollection(ParticleComposition *result, ParameterizedItem *particle_item,
                                  const IParticle& particle) const;
 };
 
diff --git a/GUI/coregui/Models/GUIObjectBuilder.cpp b/GUI/coregui/Models/GUIObjectBuilder.cpp
index 5c906d5735c01ed8df8a51938658d0f08f359cec..71b67f5f6a7a737a44dc795621823c9347ecfa55 100644
--- a/GUI/coregui/Models/GUIObjectBuilder.cpp
+++ b/GUI/coregui/Models/GUIObjectBuilder.cpp
@@ -342,9 +342,9 @@ void GUIObjectBuilder::visit(const ParticleCoreShell *sample)
     m_itemToSample[coreshellItem] = sample;
 }
 
-void GUIObjectBuilder::visit(const LatticeBasis *sample)
+void GUIObjectBuilder::visit(const ParticleComposition *sample)
 {
-    qDebug() << "GUIObjectBuilder::visit(const LatticeBasis *)"  << getLevel();
+    qDebug() << "GUIObjectBuilder::visit(const ParticleComposition *)"  << getLevel();
     ParameterizedItem *parent = m_levelToParentItem[getLevel()-1];
     ParameterizedItem *item(0);
     if(parent) {
diff --git a/GUI/coregui/Models/GUIObjectBuilder.h b/GUI/coregui/Models/GUIObjectBuilder.h
index f3de52039a8afa985c013abe1579a4f398fd9bad..a25c5284cc49dc7171d6a4496e7f599eb89c70f2 100644
--- a/GUI/coregui/Models/GUIObjectBuilder.h
+++ b/GUI/coregui/Models/GUIObjectBuilder.h
@@ -59,7 +59,7 @@ public:
     void visit(const Particle *);
     void visit(const ParticleDistribution *);
     void visit(const ParticleCoreShell *);
-    void visit(const LatticeBasis *);
+    void visit(const ParticleComposition *);
 
     void visit(const ParticleInfo *);
 
diff --git a/GUI/coregui/Models/TransformToDomain.cpp b/GUI/coregui/Models/TransformToDomain.cpp
index 853411ed8a2c47a9d87b89db6188e51a63fcd7d7..6110fbb644bca26e8c435199c09381aae2306972 100644
--- a/GUI/coregui/Models/TransformToDomain.cpp
+++ b/GUI/coregui/Models/TransformToDomain.cpp
@@ -372,12 +372,12 @@ ParticleCoreShell *TransformToDomain::createParticleCoreShell(const Parameterize
 }
 
 
-LatticeBasis *TransformToDomain::createParticleCollection(const ParameterizedItem &item,
+ParticleComposition *TransformToDomain::createParticleCollection(const ParameterizedItem &item,
                                                           double &depth, double &abundance)
 {
     depth = item.getRegisteredProperty(ParticleItem::P_DEPTH).toDouble();
     abundance = item.getRegisteredProperty(ParticleItem::P_ABUNDANCE).toDouble();
-    LatticeBasis *result = new LatticeBasis();
+    ParticleComposition *result = new ParticleComposition();
     return result;
 }
 
diff --git a/GUI/coregui/Models/TransformToDomain.h b/GUI/coregui/Models/TransformToDomain.h
index 416f18f833ccbf4b780c5c6e56a13ae2006b14a3..c73dfd44e27a4932ac1bfb9f22087d66c2cbf0b5 100644
--- a/GUI/coregui/Models/TransformToDomain.h
+++ b/GUI/coregui/Models/TransformToDomain.h
@@ -31,7 +31,7 @@ BA_CORE_API_ Particle *createParticle(const ParameterizedItem &item,
                                   double &depth, double &abundance);
 BA_CORE_API_ ParticleCoreShell *createParticleCoreShell(const ParameterizedItem &item,
         const Particle &core, const Particle &shell, double &depth, double &abundance);
-BA_CORE_API_ LatticeBasis *createParticleCollection(const ParameterizedItem &item,
+BA_CORE_API_ ParticleComposition *createParticleCollection(const ParameterizedItem &item,
                                                     double &depth, double &abundance);
 BA_CORE_API_ IFormFactor *createFormFactor(const ParameterizedItem &item);
 BA_CORE_API_ IDistribution1D * createDistribution(
diff --git a/Tests/FunctionalTests/TestPyCore/isgisaxs06.py b/Tests/FunctionalTests/TestPyCore/isgisaxs06.py
index 166dbb80811d0d39ad4c4651d152648d2614ec6f..bbd4959705c74ca0e5f27b9a0284e8523a444fa1 100644
--- a/Tests/FunctionalTests/TestPyCore/isgisaxs06.py
+++ b/Tests/FunctionalTests/TestPyCore/isgisaxs06.py
@@ -67,7 +67,7 @@ def run_simulation_centered():
     cylinder = Particle(mParticle, cylinder_ff)
     position1 = kvector_t(0.0, 0.0, 0.0)
     position2 = kvector_t(5.0*nanometer, 5.0*nanometer, 0.0)
-    basis = LatticeBasis()
+    basis = ParticleComposition()
     basis.addParticle(cylinder, [position1, position2])
 
     particle_layout = ParticleLayout()
diff --git a/Tests/FunctionalTests/TestPyCore/mesocrystal1.py b/Tests/FunctionalTests/TestPyCore/mesocrystal1.py
index 5505f9be3d5d582807780389e541328a0f5094df..b8de8f1dd6fa6b8c6bca8d454ad01ce38588067d 100644
--- a/Tests/FunctionalTests/TestPyCore/mesocrystal1.py
+++ b/Tests/FunctionalTests/TestPyCore/mesocrystal1.py
@@ -123,7 +123,7 @@ class MySampleBuilder(ISampleBuilder):
         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 ]
-        basis = LatticeBasis()
+        basis = ParticleComposition()
         basis.addParticle(particle, positions)
 
         npc = Crystal(basis, p_lat)
diff --git a/Tests/UnitTests/TestCore/LatticeBasisTest.h b/Tests/UnitTests/TestCore/LatticeBasisTest.h
deleted file mode 100644
index 40a15fade8a847e6e9823a4ae9f1bf8d37d65b18..0000000000000000000000000000000000000000
--- a/Tests/UnitTests/TestCore/LatticeBasisTest.h
+++ /dev/null
@@ -1,114 +0,0 @@
-#ifndef LATTICEBASISTEST_H
-#define LATTICEBASISTEST_H
-
-#include "LatticeBasis.h"
-#include "Particle.h"
-#include "Materials.h"
-#include "Units.h"
-#include "HomogeneousMaterial.h"
-#include "ParticleInfo.h"
-#include "FormFactorFullSphere.h"
-#include <iostream>
-
-
-class LatticeBasisTest : public ::testing::Test
-{
-protected:
-    LatticeBasisTest(){}
-    virtual ~LatticeBasisTest(){}
-};
-
-TEST_F(LatticeBasisTest, LatticeBasisDefaultConstructor)
-{
-    LatticeBasis *lb = new LatticeBasis();
-    Particle particle;
-    std::vector<kvector_t > positions;
-    positions.push_back(kvector_t(0.0,0.0,0.0));
-    EXPECT_EQ("LatticeBasis",lb->getName());
-    EXPECT_EQ(0, lb->getAmbientMaterial());
-    EXPECT_EQ(0, lb->getNbrParticles());
-
-    delete lb;
-
-}
-
-TEST_F(LatticeBasisTest, LatticeBasisConstructorWithOneParameter)
-{
-    Particle particle;
-    LatticeBasis *lb = new LatticeBasis(particle);
-    std::vector<kvector_t > positions;
-    positions.push_back(kvector_t(0.0,0.0,0.0));
-    EXPECT_EQ("LatticeBasis",lb->getName());
-    lb->addParticle(particle, positions);
-    EXPECT_EQ(particle.getMaterial(),lb->getParticle(0)->getAmbientMaterial());
-    EXPECT_EQ(particle.getName(),lb->getParticle(0)->getName());
-    EXPECT_EQ(particle.getTransform3D(),lb->getParticle(0)->getTransform3D());
-    EXPECT_EQ(particle.getMaterial(),lb->getParticle(1)->getAmbientMaterial());
-    EXPECT_EQ(particle.getName(),lb->getParticle(1)->getName());
-    EXPECT_EQ(particle.getTransform3D(),lb->getParticle(1)->getTransform3D());
-    EXPECT_EQ(positions, lb->getParticlePositions(0));
-    EXPECT_EQ(positions, lb->getParticlePositions(1));
-
-    HomogeneousMaterial material("Air",0.0,0.0);
-    lb->setAmbientMaterial(material);
-    EXPECT_EQ("Air", lb->getAmbientMaterial()->getName());
-    EXPECT_EQ(1.0, lb->getAmbientMaterial()->getRefractiveIndex());
-
-    delete lb;
-}
-
-
-TEST_F(LatticeBasisTest, LatticeBasisConstructorWithTwoParameter)
-{
-    Particle particle;
-    std::vector<kvector_t > positions;
-    positions.push_back(kvector_t(1.0,1.0,1.0));
-    LatticeBasis *lb = new LatticeBasis(particle, positions);
-
-    EXPECT_EQ("LatticeBasis",lb->getName());
-    lb->addParticle(particle, positions);
-    EXPECT_EQ(particle.getMaterial(),lb->getParticle(0)->getAmbientMaterial());
-    EXPECT_EQ(particle.getName(),lb->getParticle(0)->getName());
-    EXPECT_EQ(particle.getTransform3D(),lb->getParticle(0)->getTransform3D());
-    EXPECT_EQ(particle.getMaterial(),lb->getParticle(1)->getAmbientMaterial());
-    EXPECT_EQ(particle.getName(),lb->getParticle(1)->getName());
-    EXPECT_EQ(particle.getTransform3D(),lb->getParticle(1)->getTransform3D());
-    EXPECT_EQ(positions, lb->getParticlePositions(0));
-    EXPECT_EQ(positions, lb->getParticlePositions(1));
-
-    HomogeneousMaterial material("Air",0.0,0.0);
-    lb->setAmbientMaterial(material);
-    EXPECT_EQ("Air", lb->getAmbientMaterial()->getName());
-    EXPECT_EQ(1.0, lb->getAmbientMaterial()->getRefractiveIndex());
-
-    delete lb;
-}
-
-TEST_F(LatticeBasisTest, LatticeBasisClone)
-{
-    LatticeBasis *lb = new LatticeBasis();
-    Particle particle;
-    std::vector<kvector_t > positions;
-    positions.push_back(kvector_t(1.0,1.0,1.0));
-    HomogeneousMaterial material("Air",0.0,0.0);
-    lb->addParticle(particle, positions);
-    lb->setAmbientMaterial(material);
-    LatticeBasis *lbClone = lb->clone();
-
-    EXPECT_EQ(lbClone->getName(),lb->getName());
-
-    EXPECT_EQ(lbClone->getParticle(0)->getAmbientMaterial()->getRefractiveIndex(),lb->getParticle(0)->getAmbientMaterial()->getRefractiveIndex());
-    EXPECT_EQ(lbClone->getParticle(0)->getName(), lb->getParticle(0)->getName());
-    EXPECT_EQ(lbClone->getParticle(0)->getTransform3D(),lb->getParticle(0)->getTransform3D());
-    EXPECT_EQ(positions, lb->getParticlePositions(0));
-
-
-    EXPECT_EQ("Air", lb->getAmbientMaterial()->getName());
-    EXPECT_EQ(1.0, lb->getAmbientMaterial()->getRefractiveIndex());
-
-    delete lb;
-    delete lbClone;
-}
-
-
-#endif
diff --git a/Tests/UnitTests/TestCore/main.cpp b/Tests/UnitTests/TestCore/main.cpp
index cdf1770cd6b16cb5446d25c390388da8f9011fc9..8de161f5e498fdf4355a14cfa9324e7b0ea801f7 100644
--- a/Tests/UnitTests/TestCore/main.cpp
+++ b/Tests/UnitTests/TestCore/main.cpp
@@ -24,7 +24,7 @@
 #include "RealParameterWrapperTest.h"
 #include "SimulationTest.h"
 #include "ThreadInfoTest.h"
-#include "LatticeBasisTest.h"
+#include "ParticleCompositionTest.h"
 #include "LayerRoughnessTest.h"
 #include "ParticleInfoTest.h"
 #include "LLDataTest.h"
diff --git a/dev-tools/openmpi/pytests/ompi_meso.py b/dev-tools/openmpi/pytests/ompi_meso.py
index b0d9a85f3074809a9858ba9c580acf1293e1b6fa..85ec0e43213124e95b3abcfa982d1f8f14583cc1 100644
--- a/dev-tools/openmpi/pytests/ompi_meso.py
+++ b/dev-tools/openmpi/pytests/ompi_meso.py
@@ -61,7 +61,7 @@ class MesoSampleBuilder(ISampleBuilder):
         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)
         pos_vector = [position_0, position_1, position_2]
-        basis = LatticeBasis()
+        basis = ParticleComposition()
         basis.addParticle(particle, pos_vector)
         npc = Crystal(basis, lattice)
         dw_factor = self.m_sigma_lattice_length_a.value*self.m_sigma_lattice_length_a.value/6.0
diff --git a/dev-tools/openmpi/pytests/ompi_meso_cpp.py b/dev-tools/openmpi/pytests/ompi_meso_cpp.py
index 7ce94b2ec01dc691a1d8e98fbf313da8c68de18e..6f7efc104959c297b989f3034f7150e7c7e1735d 100644
--- a/dev-tools/openmpi/pytests/ompi_meso_cpp.py
+++ b/dev-tools/openmpi/pytests/ompi_meso_cpp.py
@@ -60,7 +60,7 @@ class MesoSampleBuilder(ISampleBuilder):
         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)
         pos_vector = [position_0, position_1, position_2]
-        basis = LatticeBasis()
+        basis = ParticleComposition()
         basis.addParticle(particle, pos_vector)
         npc = Crystal(basis, lattice)
         dw_factor = self.m_sigma_lattice_length_a.value*self.m_sigma_lattice_length_a.value/6.0
diff --git a/dev-tools/openmpi/pytests/round1_sim3_ompi.py b/dev-tools/openmpi/pytests/round1_sim3_ompi.py
index b54ed8ce6ec91f3eb604b3877f347c1be130b8ad..85d4b958c3f322cc921b93fd9db1943a30f15fff 100644
--- a/dev-tools/openmpi/pytests/round1_sim3_ompi.py
+++ b/dev-tools/openmpi/pytests/round1_sim3_ompi.py
@@ -72,7 +72,7 @@ class MesoSampleBuilder(ISampleBuilder):
         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)
         pos_vector = [position_0, position_1, position_2]
-        basis = LatticeBasis()
+        basis = ParticleComposition()
         basis.addParticle(particle, pos_vector)
         npc = Crystal(basis, lattice)
         dw_factor = self.m_sigma_lattice_length_a.value*self.m_sigma_lattice_length_a.value/6.0
diff --git a/dev-tools/python-bindings/settings_core.py b/dev-tools/python-bindings/settings_core.py
index 79e91a72064e11381f3d3900218b63e2196dac63..ef92da213fce414743a4d610a32a20b0362b2a86 100644
--- a/dev-tools/python-bindings/settings_core.py
+++ b/dev-tools/python-bindings/settings_core.py
@@ -142,7 +142,6 @@ include_classes = [
     "Lattice",
     "Lattice1DIFParameters",
     "Lattice2DIFParameters",
-    "LatticeBasis",
     "Layer",
     "LayerInterface",
     "LayerRoughness",
@@ -154,6 +153,7 @@ include_classes = [
     "ParameterDistribution",
     "ParameterPool",
     "Particle",
+    "ParticleComposition",
     "ParticleDistribution",
     "ParticleCoreShell",
     "ParticleLayout",
@@ -218,7 +218,7 @@ def ManualClassTunings(mb):
     cl.member_function("createTrigonalLattice").call_policies = call_policies.return_value_policy(call_policies.return_by_value)
     cl.member_function("setSelectionRule").include()
     #
-    cl = mb.class_("LatticeBasis")
+    cl = mb.class_("ParticleComposition")
     cl.constructors( lambda decl: bool( decl.arguments ) ).exclude() # exclude non-default constructors
     cl.member_functions().exclude()
     cl.member_function("addParticle").include()
diff --git a/dev-tools/user-api/docstring.py b/dev-tools/user-api/docstring.py
index 06ed5e3017659159ca90c12527e302c782b0e5cf..6457e159cf81bc2bef072b48efb32b528dfa3f86 100644
--- a/dev-tools/user-api/docstring.py
+++ b/dev-tools/user-api/docstring.py
@@ -42,8 +42,8 @@ user_api = [
     "Lattice.getBasisVectorC",
     "Lattice.setSelectionRule",
     "Lattice2DIFParameters",
-    "LatticeBasis",
-    "LatticeBasis.addParticle",
+    "ParticleComposition",
+    "ParticleComposition.addParticle",
     "Layer",
     "Layer.setDecoration",
     "LayerRoughness",