diff --git a/Base/Pixel/SimulationElement.cpp b/Base/Pixel/SimulationElement.cpp
index 0bb310f495e787f944fa4d3ff4bb9f59df0048ab..102aadb816ab60f1fefd7996a378ad6f24f1a0f7 100644
--- a/Base/Pixel/SimulationElement.cpp
+++ b/Base/Pixel/SimulationElement.cpp
@@ -76,7 +76,7 @@ kvector_t SimulationElement::getKf(double x, double y) const
     return m_pixel->getK(x, y, m_wavelength);
 }
 
-kvector_t SimulationElement::getMeanQ() const
+kvector_t SimulationElement::meanQ() const
 {
     return getKi() - getMeanKf();
 }
diff --git a/Base/Pixel/SimulationElement.h b/Base/Pixel/SimulationElement.h
index 0e133be808e611b06ea2c4517725a82a89b20b58..ff70182f0078a1a3ec6f9077567e5648c9e51a02 100644
--- a/Base/Pixel/SimulationElement.h
+++ b/Base/Pixel/SimulationElement.h
@@ -53,7 +53,7 @@ public:
     double getIntensity() const { return m_intensity; }
     kvector_t getKi() const;
     kvector_t getMeanKf() const;
-    kvector_t getMeanQ() const;
+    kvector_t meanQ() const;
     kvector_t getQ(double x, double y) const;
 
     double integrationFactor(double x, double y) const;
diff --git a/CHANGELOG b/CHANGELOG
index 9a236ddf7cf2e8fd139b10710f797b0f9fb4ecea..4778aa9ea7bf5bf777f1ee67b0c2af1c56e0d06e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,8 @@
 BornAgain-1.18.99, ongoing development
+  > API changes:
+    1) Lattice has been renamed to Lattice3D, for clearer disambuation from Lattice2D.
+    2) Retain only those interference functions constructors that take a Lattice2D
+       or Lattice3D parameter.
   > Fixes of unreported bugs:
     * For alpha_i, set scattered intensity to 0 (incorrect, but everything else would be worse)
 
diff --git a/Core/Computation/ParticleLayoutComputation.cpp b/Core/Computation/ParticleLayoutComputation.cpp
index 1397aed4a96508b06e3bd03ea0c211ef9a119261..92383eed2355fcace9b091074406eec45dcdfe1d 100644
--- a/Core/Computation/ParticleLayoutComputation.cpp
+++ b/Core/Computation/ParticleLayoutComputation.cpp
@@ -27,24 +27,24 @@ std::unique_ptr<IInterferenceFunctionStrategy>
 processedInterferenceFunction(const ProcessedLayout& layout, const SimulationOptions& sim_params,
                               bool polarized)
 {
-    const IInterferenceFunction* p_iff = layout.interferenceFunction();
-    if (p_iff && layout.numberOfSlices() > 1 && !p_iff->supportsMultilayer())
+    const IInterferenceFunction* iff = layout.interferenceFunction();
+    if (iff && layout.numberOfSlices() > 1 && !iff->supportsMultilayer())
         throw std::runtime_error("LayoutStrategyBuilder::checkInterferenceFunction: "
                                  "interference function does not support multiple layers");
 
-    auto p_radial_para = dynamic_cast<const InterferenceFunctionRadialParaCrystal*>(p_iff);
+    auto radial_para = dynamic_cast<const InterferenceFunctionRadialParaCrystal*>(iff);
 
     const std::vector<FormFactorCoherentSum>& weighted_formfactors = layout.formFactorList();
 
     std::unique_ptr<IInterferenceFunctionStrategy> result;
 
-    if (p_radial_para && p_radial_para->kappa() > 0.0) {
-        double kappa = p_radial_para->kappa();
-        return std::make_unique<SSCApproximationStrategy>(weighted_formfactors, p_iff, sim_params,
-                                                          polarized, kappa);
+    if (radial_para && radial_para->kappa() > 0.0) {
+        double kappa = radial_para->kappa();
+        return std::make_unique<SSCApproximationStrategy>(weighted_formfactors, radial_para,
+                                                          sim_params, polarized, kappa);
     }
-    return std::make_unique<DecouplingApproximationStrategy>(weighted_formfactors, p_iff,
-                                                             sim_params, polarized);
+    return std::make_unique<DecouplingApproximationStrategy>(weighted_formfactors, iff, sim_params,
+                                                             polarized);
 }
 
 } // namespace
diff --git a/Core/Computation/ProcessedLayout.cpp b/Core/Computation/ProcessedLayout.cpp
index 1c11512269566b5259b2cd24d6753df7e97a41c5..228eec782ab0c37839b923e306ecb27545074541 100644
--- a/Core/Computation/ProcessedLayout.cpp
+++ b/Core/Computation/ProcessedLayout.cpp
@@ -25,8 +25,15 @@
 
 namespace
 {
-void ScaleRegionMap(std::map<size_t, std::vector<HomogeneousRegion>>& region_map, double factor);
+void ScaleRegionMap(std::map<size_t, std::vector<HomogeneousRegion>>& region_map, double factor)
+{
+    for (auto& entry : region_map) {
+        for (auto& region : entry.second) {
+            region.m_volume *= factor;
+        }
+    }
 }
+} // namespace
 
 ProcessedLayout::ProcessedLayout(const ParticleLayout& layout, const std::vector<Slice>& slices,
                                  double z_ref, const IFresnelMap* p_fresnel_map, bool polarized)
@@ -80,10 +87,10 @@ void ProcessedLayout::collectFormFactors(const ParticleLayout& layout,
                                          const std::vector<Slice>& slices, double z_ref)
 {
     double layout_abundance = layout.getTotalAbundance();
-    for (auto p_particle : layout.particles()) {
-        auto ff_coh = processParticle(*p_particle, slices, z_ref);
+    for (const auto* particle : layout.particles()) {
+        FormFactorCoherentSum ff_coh = processParticle(*particle, slices, z_ref);
         ff_coh.scaleRelativeAbundance(layout_abundance);
-        m_formfactors.push_back(std::move(ff_coh));
+        m_formfactors.emplace_back(ff_coh);
     }
     double weight = layout.weight();
     m_surface_density = weight * layout.totalParticleSurfaceDensity();
@@ -102,25 +109,25 @@ FormFactorCoherentSum ProcessedLayout::processParticle(const IParticle& particle
     mergeRegionMap(region_map);
     auto result = FormFactorCoherentSum(abundance);
     for (size_t i = 0; i < sliced_ffs.size(); ++i) {
-        auto ff_pair = sliced_ffs[i];
-        std::unique_ptr<IFormFactor> P_ff_framework;
+        const auto ff_pair = sliced_ffs[i];
+        std::unique_ptr<IFormFactor> ff_framework;
         if (slices.size() > 1) {
             if (m_polarized)
-                P_ff_framework = std::make_unique<FormFactorDWBAPol>(*ff_pair.first);
+                ff_framework = std::make_unique<FormFactorDWBAPol>(*ff_pair.first);
             else
-                P_ff_framework = std::make_unique<FormFactorDWBA>(*ff_pair.first);
+                ff_framework = std::make_unique<FormFactorDWBA>(*ff_pair.first);
         } else {
             if (m_polarized)
-                P_ff_framework = std::make_unique<FormFactorBAPol>(*ff_pair.first);
+                ff_framework = std::make_unique<FormFactorBAPol>(*ff_pair.first);
             else
-                P_ff_framework.reset(ff_pair.first->clone());
+                ff_framework.reset(ff_pair.first->clone());
         }
 
         size_t slice_index = ff_pair.second;
         const Material slice_material = slices[slice_index].material();
-        P_ff_framework->setAmbientMaterial(slice_material);
+        ff_framework->setAmbientMaterial(slice_material);
 
-        auto part = FormFactorCoherentPart(P_ff_framework.release());
+        auto part = FormFactorCoherentPart(ff_framework.release());
         part.setSpecularInfo(m_fresnel_map, slice_index);
 
         result.addCoherentPart(part);
@@ -138,15 +145,3 @@ void ProcessedLayout::mergeRegionMap(
                                          regions.end());
     }
 }
-
-namespace
-{
-void ScaleRegionMap(std::map<size_t, std::vector<HomogeneousRegion>>& region_map, double factor)
-{
-    for (auto& entry : region_map) {
-        for (auto& region : entry.second) {
-            region.m_volume *= factor;
-        }
-    }
-}
-} // namespace
diff --git a/Core/Computation/RoughMultiLayerComputation.cpp b/Core/Computation/RoughMultiLayerComputation.cpp
index 46df387a997035103e7c2a98b104dda47f9977d6..92925b35e3cff7d2c767f2b2f871bbe54eb725f9 100644
--- a/Core/Computation/RoughMultiLayerComputation.cpp
+++ b/Core/Computation/RoughMultiLayerComputation.cpp
@@ -50,7 +50,7 @@ void RoughMultiLayerComputation::compute(SimulationElement& elem) const
     if (elem.getAlphaMean() < 0.0)
         return;
     auto n_slices = m_sample->numberOfSlices();
-    kvector_t q = elem.getMeanQ();
+    kvector_t q = elem.meanQ();
     double wavelength = elem.getWavelength();
     double autocorr(0.0);
     complex_t crosscorr(0.0, 0.0);
diff --git a/Core/Export/SampleToPython.cpp b/Core/Export/SampleToPython.cpp
index 11d9ef1d0632680cbcd0e74f0e5e64929c3d875c..edcc4c3f7ed2bc241f19b1040759ce48d3bfd1fe 100644
--- a/Core/Export/SampleToPython.cpp
+++ b/Core/Export/SampleToPython.cpp
@@ -46,35 +46,35 @@ void SampleToPython::initLabels(const MultiLayer& multilayer)
 
     m_label->insertMultiLayer(&multilayer);
 
-    for (auto x : multilayer.containedMaterials())
+    for (const auto* x : multilayer.containedMaterials())
         m_label->insertMaterial(x);
-    for (auto x : INodeUtils::AllDescendantsOfType<Layer>(multilayer))
+    for (const auto* x : INodeUtils::AllDescendantsOfType<Layer>(multilayer))
         m_label->insertLayer(x);
-    for (auto x : INodeUtils::AllDescendantsOfType<LayerRoughness>(multilayer))
+    for (const auto* x : INodeUtils::AllDescendantsOfType<LayerRoughness>(multilayer))
         m_label->insertRoughness(x);
-    for (auto x : INodeUtils::AllDescendantsOfType<IFormFactor>(multilayer))
+    for (const auto* x : INodeUtils::AllDescendantsOfType<IFormFactor>(multilayer))
         m_label->insertFormFactor(x);
-    for (auto x : INodeUtils::AllDescendantsOfType<ParticleLayout>(multilayer))
+    for (const auto* x : INodeUtils::AllDescendantsOfType<ParticleLayout>(multilayer))
         m_label->insertLayout(x);
-    for (auto x : INodeUtils::AllDescendantsOfType<IInterferenceFunction>(multilayer))
+    for (const auto* x : INodeUtils::AllDescendantsOfType<IInterferenceFunction>(multilayer))
         m_label->insertInterferenceFunction(x);
-    for (auto x : INodeUtils::AllDescendantsOfType<Particle>(multilayer))
+    for (const auto* x : INodeUtils::AllDescendantsOfType<Particle>(multilayer))
         m_label->insertParticle(x);
-    for (auto x : INodeUtils::AllDescendantsOfType<ParticleCoreShell>(multilayer))
+    for (const auto* x : INodeUtils::AllDescendantsOfType<ParticleCoreShell>(multilayer))
         m_label->insertParticleCoreShell(x);
-    for (auto x : INodeUtils::AllDescendantsOfType<ParticleComposition>(multilayer))
+    for (const auto* x : INodeUtils::AllDescendantsOfType<ParticleComposition>(multilayer))
         m_label->insertParticleComposition(x);
-    for (auto x : INodeUtils::AllDescendantsOfType<ParticleDistribution>(multilayer))
+    for (const auto* x : INodeUtils::AllDescendantsOfType<ParticleDistribution>(multilayer))
         m_label->insertParticleDistribution(x);
-    for (auto x : INodeUtils::AllDescendantsOfType<Lattice2D>(multilayer))
+    for (const auto* x : INodeUtils::AllDescendantsOfType<Lattice2D>(multilayer))
         m_label->insertLattice2D(x);
-    for (auto x : INodeUtils::AllDescendantsOfType<Lattice3D>(multilayer))
+    for (const auto* x : INodeUtils::AllDescendantsOfType<Lattice3D>(multilayer))
         m_label->insertLattice3D(x);
-    for (auto x : INodeUtils::AllDescendantsOfType<Crystal>(multilayer))
+    for (const auto* x : INodeUtils::AllDescendantsOfType<Crystal>(multilayer))
         m_label->insertCrystal(x);
-    for (auto x : INodeUtils::AllDescendantsOfType<MesoCrystal>(multilayer))
+    for (const auto* x : INodeUtils::AllDescendantsOfType<MesoCrystal>(multilayer))
         m_label->insertMesoCrystal(x);
-    for (auto x : INodeUtils::AllDescendantsOfType<IRotation>(multilayer))
+    for (const auto* x : INodeUtils::AllDescendantsOfType<IRotation>(multilayer))
         m_label->insertRotation(x);
 }
 
@@ -87,10 +87,9 @@ std::string SampleToPython::defineGetSample() const
     return "def " + pyfmt::getSampleFunctionName() + "():\n" + defineMaterials() + defineLayers()
            + defineFormFactors() + defineParticles() + defineCoreShellParticles()
            + defineParticleCompositions() + defineLattices2D() + defineLattices3D()
-           + defineCrystals()
-           + defineMesoCrystals() + defineParticleDistributions() + defineInterferenceFunctions()
-           + defineParticleLayouts() + defineRoughnesses() + addLayoutsToLayers()
-           + defineMultiLayers() + "\n\n";
+           + defineCrystals() + defineMesoCrystals() + defineParticleDistributions()
+           + defineInterferenceFunctions() + defineParticleLayouts() + defineRoughnesses()
+           + addLayoutsToLayers() + defineMultiLayers() + "\n\n";
 }
 
 const std::map<MATERIAL_TYPES, std::string> factory_names{
@@ -137,7 +136,7 @@ std::string SampleToPython::defineMaterials() const
 
 std::string SampleToPython::defineLayers() const
 {
-    const auto themap = m_label->layerMap();
+    const auto* themap = m_label->layerMap();
     if (themap->empty())
         return "# No Layers.\n\n";
     std::ostringstream result;
@@ -159,7 +158,7 @@ std::string SampleToPython::defineLayers() const
 
 std::string SampleToPython::defineFormFactors() const
 {
-    const auto themap = m_label->formFactorMap();
+    const auto* themap = m_label->formFactorMap();
     if (themap->empty())
         return "";
     std::ostringstream result;
@@ -175,7 +174,7 @@ std::string SampleToPython::defineFormFactors() const
 
 std::string SampleToPython::defineParticles() const
 {
-    const auto themap = m_label->particleMap();
+    const auto* themap = m_label->particleMap();
     if (themap->empty())
         return "";
     std::ostringstream result;
@@ -184,7 +183,7 @@ std::string SampleToPython::defineParticles() const
     for (auto it = themap->begin(); it != themap->end(); ++it) {
         const Particle* particle = it->first;
         std::string particle_name = it->second;
-        auto ff = INodeUtils::OnlyChildOfType<IFormFactor>(*particle);
+        const auto* ff = INodeUtils::OnlyChildOfType<IFormFactor>(*particle);
         if (!ff)
             continue;
         result << indent() << particle_name << " = ba.Particle("
@@ -198,7 +197,7 @@ std::string SampleToPython::defineParticles() const
 
 std::string SampleToPython::defineCoreShellParticles() const
 {
-    const auto themap = m_label->particleCoreShellMap();
+    const auto* themap = m_label->particleCoreShellMap();
     if (themap->empty())
         return "";
     std::ostringstream result;
@@ -219,7 +218,7 @@ std::string SampleToPython::defineCoreShellParticles() const
 
 std::string SampleToPython::defineParticleDistributions() const
 {
-    const auto themap = m_label->particleDistributionsMap();
+    const auto* themap = m_label->particleDistributionsMap();
     if (themap->empty())
         return "";
 
@@ -267,7 +266,7 @@ std::string SampleToPython::defineParticleDistributions() const
 
 std::string SampleToPython::defineParticleCompositions() const
 {
-    const auto themap = m_label->particleCompositionMap();
+    const auto* themap = m_label->particleCompositionMap();
     if (themap->empty())
         return "";
     std::ostringstream result;
@@ -277,8 +276,8 @@ std::string SampleToPython::defineParticleCompositions() const
         const ParticleComposition* particle_composition = it->first;
         std::string particle_composition_name = it->second;
         result << indent() << particle_composition_name << " = ba.ParticleComposition()\n";
-        auto particle_list = INodeUtils::ChildNodesOfType<IParticle>(*particle_composition);
-        for (auto particle : particle_list) {
+        const auto particle_list = INodeUtils::ChildNodesOfType<IParticle>(*particle_composition);
+        for (const auto* particle : particle_list) {
             result << indent() << particle_composition_name << ".addParticle("
                    << m_label->labelParticle(particle) << ")\n";
         }
@@ -290,7 +289,7 @@ std::string SampleToPython::defineParticleCompositions() const
 
 std::string SampleToPython::defineLattices2D() const
 {
-    const auto themap = m_label->lattice2DMap();
+    const auto* themap = m_label->lattice2DMap();
     if (themap->empty())
         return "";
     std::ostringstream result;
@@ -299,19 +298,18 @@ std::string SampleToPython::defineLattices2D() const
     for (auto it = themap->begin(); it != themap->end(); ++it) {
         const Lattice2D* lattice = it->first;
         std::string lattice_name = it->second;
-        result << indent() << lattice_name << " = ba.BasicLattice(\n";
-        result << indent() << indent()
-               << pyfmt::printNm(lattice->length1()) << ", "
+        result << indent() << lattice_name << " = ba.BasicLattice2D(\n";
+        result << indent() << indent() << pyfmt::printNm(lattice->length1()) << ", "
                << pyfmt::printNm(lattice->length2()) << ", "
                << pyfmt::printDegrees(lattice->latticeAngle()) << ", "
-               << pyfmt::printDegrees(lattice->rotationAngle()) << "),\n";
+               << pyfmt::printDegrees(lattice->rotationAngle()) << ")\n";
     }
     return result.str();
 }
 
 std::string SampleToPython::defineLattices3D() const
 {
-    const auto themap = m_label->lattice3DMap();
+    const auto* themap = m_label->lattice3DMap();
     if (themap->empty())
         return "";
     std::ostringstream result;
@@ -336,7 +334,7 @@ std::string SampleToPython::defineLattices3D() const
 
 std::string SampleToPython::defineCrystals() const
 {
-    const auto themap = m_label->crystalMap();
+    const auto* themap = m_label->crystalMap();
     if (themap->empty())
         return "";
     std::ostringstream result;
@@ -345,8 +343,8 @@ std::string SampleToPython::defineCrystals() const
     for (auto it = themap->begin(); it != themap->end(); ++it) {
         const Crystal* crystal = it->first;
         std::string crystal_name = it->second;
-        auto lattice = INodeUtils::OnlyChildOfType<Lattice3D>(*crystal);
-        auto basis = INodeUtils::OnlyChildOfType<IParticle>(*crystal);
+        const auto* lattice = INodeUtils::OnlyChildOfType<Lattice3D>(*crystal);
+        const auto* basis = INodeUtils::OnlyChildOfType<IParticle>(*crystal);
         if (!lattice || !basis)
             continue;
         result << indent() << crystal_name << " = ba.Crystal(";
@@ -358,7 +356,7 @@ std::string SampleToPython::defineCrystals() const
 
 std::string SampleToPython::defineMesoCrystals() const
 {
-    const auto themap = m_label->mesocrystalMap();
+    const auto* themap = m_label->mesocrystalMap();
     if (themap->empty())
         return "";
     std::ostringstream result;
@@ -382,7 +380,7 @@ std::string SampleToPython::defineMesoCrystals() const
 
 std::string SampleToPython::defineInterferenceFunctions() const
 {
-    const auto themap = m_label->interferenceFunctionMap();
+    const auto* themap = m_label->interferenceFunctionMap();
     if (themap->empty())
         return "";
     std::ostringstream result;
@@ -393,85 +391,83 @@ std::string SampleToPython::defineInterferenceFunctions() const
 
         if (dynamic_cast<const InterferenceFunctionNone*>(interference))
             result << indent() << it->second << " = ba.InterferenceFunctionNone()\n";
-        else if (auto lattice_1d =
+
+        else if (const auto* iff =
                      dynamic_cast<const InterferenceFunction1DLattice*>(interference)) {
             result << indent() << it->second << " = ba.InterferenceFunction1DLattice("
-                   << pyfmt::printNm(lattice_1d->getLength()) << ", "
-                   << pyfmt::printDegrees(lattice_1d->getXi()) << ")\n";
+                   << pyfmt::printNm(iff->getLength()) << ", " << pyfmt::printDegrees(iff->getXi())
+                   << ")\n";
 
-            auto pdf = INodeUtils::OnlyChildOfType<IFTDecayFunction1D>(*lattice_1d);
+            const auto* pdf = INodeUtils::OnlyChildOfType<IFTDecayFunction1D>(*iff);
 
             if (pdf->decayLength() != 0.0)
                 result << indent() << it->second << "_pdf  = ba." << pdf->getName() << "("
                        << pyfmt2::argumentList(pdf) << ")\n"
                        << indent() << it->second << ".setDecayFunction(" << it->second << "_pdf)\n";
-        } else if (auto para_radial =
+
+        } else if (const auto* iff =
                        dynamic_cast<const InterferenceFunctionRadialParaCrystal*>(interference)) {
             result << indent() << it->second << " = ba.InterferenceFunctionRadialParaCrystal("
-                   << pyfmt::printNm(para_radial->peakDistance()) << ", "
-                   << pyfmt::printNm(para_radial->dampingLength()) << ")\n";
+                   << pyfmt::printNm(iff->peakDistance()) << ", "
+                   << pyfmt::printNm(iff->dampingLength()) << ")\n";
 
-            if (para_radial->kappa() != 0.0)
-                result << indent() << it->second << ".setKappa("
-                       << pyfmt::printDouble(para_radial->kappa()) << ")\n";
+            if (iff->kappa() != 0.0)
+                result << indent() << it->second << ".setKappa(" << pyfmt::printDouble(iff->kappa())
+                       << ")\n";
 
-            if (para_radial->domainSize() != 0.0)
+            if (iff->domainSize() != 0.0)
                 result << indent() << it->second << ".setDomainSize("
-                       << pyfmt::printDouble(para_radial->domainSize()) << ")\n";
+                       << pyfmt::printDouble(iff->domainSize()) << ")\n";
 
-            auto pdf = INodeUtils::OnlyChildOfType<IFTDistribution1D>(*para_radial);
+            const auto* pdf = INodeUtils::OnlyChildOfType<IFTDistribution1D>(*iff);
 
             if (pdf->omega() != 0.0)
                 result << indent() << it->second << "_pdf  = ba." << pdf->getName() << "("
                        << pyfmt2::argumentList(pdf) << ")\n"
                        << indent() << it->second << ".setProbabilityDistribution(" << it->second
                        << "_pdf)\n";
-        } else if (auto lattice_2d =
+
+        } else if (const auto* iff =
                        dynamic_cast<const InterferenceFunction2DLattice*>(interference)) {
-            const Lattice2D& lattice = lattice_2d->lattice();
+            const auto* lattice = INodeUtils::OnlyChildOfType<Lattice2D>(*iff);
+
             result << indent() << it->second << " = ba.InterferenceFunction2DLattice("
-                   << pyfmt::printNm(lattice.length1()) << ", " << pyfmt::printNm(lattice.length2())
-                   << ", " << pyfmt::printDegrees(lattice.latticeAngle()) << ", "
-                   << pyfmt::printDegrees(lattice.rotationAngle()) << ")\n";
+                   << m_label->labelLattice2D(lattice) << ")\n";
 
-            auto pdf = INodeUtils::OnlyChildOfType<IFTDecayFunction2D>(*lattice_2d);
+            const auto* pdf = INodeUtils::OnlyChildOfType<IFTDecayFunction2D>(*iff);
 
             result << indent() << it->second << "_pdf  = ba." << pdf->getName() << "("
                    << pyfmt2::argumentList(pdf) << ")\n"
                    << indent() << it->second << ".setDecayFunction(" << it->second << "_pdf)\n";
 
-            if (lattice_2d->integrationOverXi() == true)
+            if (iff->integrationOverXi() == true)
                 result << indent() << it->second << ".setIntegrationOverXi(True)\n";
-        } else if (auto lattice_2d =
+
+        } else if (const auto* iff =
                        dynamic_cast<const InterferenceFunctionFinite2DLattice*>(interference)) {
-            const Lattice2D& lattice = lattice_2d->lattice();
+            const auto* lattice = INodeUtils::OnlyChildOfType<Lattice2D>(*iff);
+
             result << indent() << it->second << " = ba.InterferenceFunctionFinite2DLattice("
-                   << pyfmt::printNm(lattice.length1()) << ", " << pyfmt::printNm(lattice.length2())
-                   << ", " << pyfmt::printDegrees(lattice.latticeAngle()) << ", "
-                   << pyfmt::printDegrees(lattice.rotationAngle()) << ", "
-                   << lattice_2d->numberUnitCells1() << ", " << lattice_2d->numberUnitCells2()
-                   << ")\n";
+                   << m_label->labelLattice2D(lattice) << ", " << iff->numberUnitCells1() << ", "
+                   << iff->numberUnitCells2() << ")\n";
 
-            if (lattice_2d->integrationOverXi() == true)
+            if (iff->integrationOverXi() == true)
                 result << indent() << it->second << ".setIntegrationOverXi(True)\n";
-        } else if (auto para_2d =
+
+        } else if (const auto* iff =
                        dynamic_cast<const InterferenceFunction2DParaCrystal*>(interference)) {
-            std::vector<double> domainSize = para_2d->domainSizes();
-            const Lattice2D& lattice = para_2d->lattice();
+            const auto* lattice = INodeUtils::OnlyChildOfType<Lattice2D>(*iff);
+            std::vector<double> domainSize = iff->domainSizes();
+
             result << indent() << it->second << " = ba.InterferenceFunction2DParaCrystal("
-                   << pyfmt::printNm(lattice.length1()) << ", " << pyfmt::printNm(lattice.length2())
-                   << ", " << pyfmt::printDegrees(lattice.latticeAngle()) << ", "
-                   << pyfmt::printDegrees(lattice.rotationAngle()) << ", "
-                   << pyfmt::printNm(para_2d->dampingLength()) << ")\n";
-
-            if (domainSize[0] != 0.0 || domainSize[1] != 0.0)
-                result << indent() << it->second << ".setDomainSizes("
-                       << pyfmt::printNm(domainSize[0]) << ", " << pyfmt::printNm(domainSize[1])
-                       << ")\n";
-            if (para_2d->integrationOverXi() == true)
+                   << m_label->labelLattice2D(lattice) << ", "
+                   << pyfmt::printNm(iff->dampingLength()) << ", " << pyfmt::printNm(domainSize[0])
+                   << ", " << pyfmt::printNm(domainSize[1]) << ")\n";
+
+            if (iff->integrationOverXi() == true)
                 result << indent() << it->second << ".setIntegrationOverXi(True)\n";
 
-            auto pdf_vector = INodeUtils::ChildNodesOfType<IFTDistribution2D>(*para_2d);
+            const auto pdf_vector = INodeUtils::ChildNodesOfType<IFTDistribution2D>(*iff);
             if (pdf_vector.size() != 2)
                 continue;
             const IFTDistribution2D* pdf = pdf_vector[0];
@@ -485,16 +481,19 @@ std::string SampleToPython::defineInterferenceFunctions() const
                    << pyfmt2::argumentList(pdf) << ")\n";
             result << indent() << it->second << ".setProbabilityDistributions(" << it->second
                    << "_pdf_1, " << it->second << "_pdf_2)\n";
-        } else if (auto lattice_hd =
+
+        } else if (const auto* lattice_hd =
                        dynamic_cast<const InterferenceFunctionHardDisk*>(interference)) {
             result << indent() << it->second << " = ba.InterferenceFunctionHardDisk("
                    << pyfmt::printNm(lattice_hd->radius()) << ", "
                    << pyfmt::printDouble(lattice_hd->density()) << ")\n";
+
         } else
             throw Exceptions::NotImplementedException(
                 "Bug: ExportToPython::defineInterferenceFunctions() called with unexpected "
                 "IInterferenceFunction "
                 + interference->getName());
+
         if (interference->positionVariance() > 0.0) {
             result << indent() << it->second << ".setPositionVariance("
                    << pyfmt::printNm2(interference->positionVariance()) << ")\n";
@@ -505,7 +504,7 @@ std::string SampleToPython::defineInterferenceFunctions() const
 
 std::string SampleToPython::defineParticleLayouts() const
 {
-    const auto themap = m_label->particleLayoutMap();
+    const auto* themap = m_label->particleLayoutMap();
     if (themap->empty())
         return "";
     std::ostringstream result;
@@ -515,15 +514,16 @@ std::string SampleToPython::defineParticleLayouts() const
         const ParticleLayout* iLayout = it->first;
         if (const ParticleLayout* particleLayout = dynamic_cast<const ParticleLayout*>(iLayout)) {
             result << indent() << it->second << " = ba.ParticleLayout()\n";
-            auto particles = INodeUtils::ChildNodesOfType<IAbstractParticle>(*particleLayout);
+            const auto particles = INodeUtils::ChildNodesOfType<IAbstractParticle>(*particleLayout);
 
-            for (auto particle : particles) {
+            for (const auto* particle : particles) {
                 double abundance = particle->abundance();
                 result << indent() << it->second << ".addParticle("
-                       << m_label->labelParticle(particle) << ", "
-                       << pyfmt::printDouble(abundance) << ")\n";
+                       << m_label->labelParticle(particle) << ", " << pyfmt::printDouble(abundance)
+                       << ")\n";
             }
-            if (auto iff = INodeUtils::OnlyChildOfType<IInterferenceFunction>(*particleLayout))
+            if (const auto* iff =
+                    INodeUtils::OnlyChildOfType<IInterferenceFunction>(*particleLayout))
                 result << indent() << it->second << ".setInterferenceFunction("
                        << m_label->labelInterferenceFunction(iff) << ")\n";
             result << indent() << it->second << ".setWeight(" << particleLayout->weight() << ")\n";
@@ -536,7 +536,7 @@ std::string SampleToPython::defineParticleLayouts() const
 
 std::string SampleToPython::defineRoughnesses() const
 {
-    const auto themap = m_label->layerRoughnessMap();
+    const auto* themap = m_label->layerRoughnessMap();
     if (themap->empty())
         return "";
     std::ostringstream result;
@@ -558,7 +558,7 @@ std::string SampleToPython::addLayoutsToLayers() const
     const auto layermap = m_label->layerMap();
     for (auto it = layermap->begin(); it != layermap->end(); ++it) {
         const Layer* layer = it->first;
-        for (auto layout : layer->layouts())
+        for (const auto* layout : layer->layouts())
             result << "\n"
                    << indent() << it->second << ".addLayout(" << m_label->labelLayout(layout)
                    << ")\n";
@@ -568,7 +568,7 @@ std::string SampleToPython::addLayoutsToLayers() const
 
 std::string SampleToPython::defineMultiLayers() const
 {
-    const auto themap = m_label->multiLayerMap();
+    const auto* themap = m_label->multiLayerMap();
     if (themap->empty())
         return "# No MultiLayers.\n\n";
     std::ostringstream result;
diff --git a/Examples/Demos/simul_demo_lattice1.py b/Examples/Demos/simul_demo_lattice1.py
index e83b8afef7e69777be7d09d0ac3e525b00bdb750..2fc3a58d21ab56a8cd94674105bb837d010806f5 100644
--- a/Examples/Demos/simul_demo_lattice1.py
+++ b/Examples/Demos/simul_demo_lattice1.py
@@ -27,7 +27,7 @@ def RunSimulation():
     particle_layout.addParticle(cylinder, 1.0)
 
     # interference function
-    interference = InterferenceFunction2DLattice(ba.SquareLattice(10.0*nanometer))
+    interference = InterferenceFunction2DLattice(ba.SquareLattice2D(10.0*nanometer))
     pdf = FTDecayFunction2DCauchy(300.0*nanometer/2.0/M_PI, 100.0*nanometer/2.0/M_PI, 0)
     interference.setDecayFunction(pdf)
     particle_layout.setInterferenceFunction(interference)
diff --git a/Examples/Demos/simul_demo_lattice2.py b/Examples/Demos/simul_demo_lattice2.py
index 2e99c5e192c867b9a3c769272db7c7053f90b2ae..b7dc1f7d1042aec7e1e27884135475123ff3ecde 100644
--- a/Examples/Demos/simul_demo_lattice2.py
+++ b/Examples/Demos/simul_demo_lattice2.py
@@ -32,7 +32,7 @@ def RunSimulation():
     particle_layout2.addParticle(cylinder, 1.0)
 
     # interference function
-    interference = InterferenceFunction2DLattice(ba.SquareLattice(10.0*nanometer))
+    interference = InterferenceFunction2DLattice(ba.SquareLattice2D(10.0*nanometer))
     pdf = FTDecayFunction2DCauchy(300.0*nanometer/2.0/M_PI, 100.0*nanometer/2.0/M_PI, 0)
     interference.setDecayFunction(pdf)
     particle_layout1.setInterferenceFunction(interference)
diff --git a/Examples/python/fitting/ex03_ExtendedExamples/custom_objective_function/custom_objective_function.py b/Examples/python/fitting/ex03_ExtendedExamples/custom_objective_function/custom_objective_function.py
index 26c5727efef3fead00d813052204d4cdd8b88b1d..a72521bdb979627c0b206a9c81270a7e43a19b32 100644
--- a/Examples/python/fitting/ex03_ExtendedExamples/custom_objective_function/custom_objective_function.py
+++ b/Examples/python/fitting/ex03_ExtendedExamples/custom_objective_function/custom_objective_function.py
@@ -52,7 +52,7 @@ def get_sample(params):
     particle_layout.addParticle(sphere)
 
     interference = ba.InterferenceFunction2DLattice(
-        ba.HexagonalLattice(lattice_length))
+        ba.HexagonalLattice2D(lattice_length))
     pdf = ba.FTDecayFunction2DCauchy(10*nm, 10*nm, 0)
     interference.setDecayFunction(pdf)
 
diff --git a/Examples/python/fitting/ex03_ExtendedExamples/external_minimizer/lmfit_basics.py b/Examples/python/fitting/ex03_ExtendedExamples/external_minimizer/lmfit_basics.py
index 2f8f4618085a191a825f8ea6546b9e8eb4755244..f0a22f72c68fe5f16ec536a4f92a4e1463514c0d 100644
--- a/Examples/python/fitting/ex03_ExtendedExamples/external_minimizer/lmfit_basics.py
+++ b/Examples/python/fitting/ex03_ExtendedExamples/external_minimizer/lmfit_basics.py
@@ -26,7 +26,7 @@ def get_sample(params):
     particle_layout.addParticle(sphere)
 
     interference = ba.InterferenceFunction2DLattice(
-        ba.HexagonalLattice(lattice_length))
+        ba.HexagonalLattice2D(lattice_length))
     pdf = ba.FTDecayFunction2DCauchy(10*nm, 10*nm, 0)
     interference.setDecayFunction(pdf)
 
diff --git a/Examples/python/fitting/ex03_ExtendedExamples/external_minimizer/lmfit_with_plotting.py b/Examples/python/fitting/ex03_ExtendedExamples/external_minimizer/lmfit_with_plotting.py
index c05ac002ba332a89782b778b231535054c375844..b08c02e7d5a65a70b76372507a7c3e113b9aec40 100644
--- a/Examples/python/fitting/ex03_ExtendedExamples/external_minimizer/lmfit_with_plotting.py
+++ b/Examples/python/fitting/ex03_ExtendedExamples/external_minimizer/lmfit_with_plotting.py
@@ -27,7 +27,7 @@ def get_sample(params):
     particle_layout.addParticle(sphere)
 
     interference = ba.InterferenceFunction2DLattice(
-        ba.HexagonalLattice(lattice_length))
+        ba.HexagonalLattice2D(lattice_length))
     pdf = ba.FTDecayFunction2DCauchy(10*nm, 10*nm, 0)
     interference.setDecayFunction(pdf)
 
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/CosineRipplesAtRectLattice.py b/Examples/python/simulation/ex03_InterferenceFunctions/CosineRipplesAtRectLattice.py
index 763fc30f52c8c7b67bb0d02184b7117b1c6f4a2b..5f482c78cae4be965e75378431bf526de6e6ff48 100644
--- a/Examples/python/simulation/ex03_InterferenceFunctions/CosineRipplesAtRectLattice.py
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/CosineRipplesAtRectLattice.py
@@ -24,7 +24,7 @@ def get_sample():
     particle_layout.addParticle(particle, 1.0)
 
     interference = ba.InterferenceFunction2DLattice(
-        200.0*nm, 50.0*nm, 90.0*deg, 0.0*deg)
+        ba.BasicLattice2D(200.0*nm, 50.0*nm, 90.0*deg, 0.0*deg))
     pdf = ba.FTDecayFunction2DCauchy(1000.*nm/2./numpy.pi, 100.*nm/2./numpy.pi, 0)
     interference.setDecayFunction(pdf)
     particle_layout.setInterferenceFunction(interference)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DCenteredSquareLattice.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DCenteredSquareLattice.py
index ea4363117a2f6e6ea119785898b44c18c9f15482..7f8399e20aa156732952600b7146855d474568cc 100644
--- a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DCenteredSquareLattice.py
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DCenteredSquareLattice.py
@@ -17,7 +17,7 @@ def get_sample():
     m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
 
     # collection of particles
-    interference = ba.InterferenceFunction2DLattice(ba.SquareLattice(25.0*nm, 0))
+    interference = ba.InterferenceFunction2DLattice(ba.SquareLattice2D(25.0*nm, 0))
     pdf = ba.FTDecayFunction2DCauchy(300.0*nm/2.0/numpy.pi,
                                      100.0*nm/2.0/numpy.pi, 0)
     interference.setDecayFunction(pdf)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DLatticeSumOfRotated.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DLatticeSumOfRotated.py
index 125a213decaa034781ef6d72ddd3fd9d99eba2dd..6e5f5ba565290c68a090b09cdd06775872bcea65 100644
--- a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DLatticeSumOfRotated.py
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DLatticeSumOfRotated.py
@@ -17,7 +17,7 @@ def get_sample():
     substrate_layer = ba.Layer(m_substrate)
 
     p_interference_function = \
-        ba.InterferenceFunction2DLattice(ba.SquareLattice(25.0*nm, 0))
+        ba.InterferenceFunction2DLattice(ba.SquareLattice2D(25.0*nm, 0))
     pdf = ba.FTDecayFunction2DCauchy(300.0*nm/2.0/numpy.pi,
                                      100.0*nm/2.0/numpy.pi, 0)
     p_interference_function.setDecayFunction(pdf)
@@ -55,7 +55,7 @@ def get_simulation():
     xi_distr = ba.DistributionGate(xi_min, xi_max)
 
     # assigns distribution with 3 equidistant points to lattice rotation angle
-    simulation.addParameterDistribution("*/SquareLattice/Xi", xi_distr, 3)
+    simulation.addParameterDistribution("*/SquareLattice2D/Xi", xi_distr, 3)
 
     return simulation
 
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DParaCrystal.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DParaCrystal.py
index af0500ab3f5e4df91699ee618719297af832d5e7..ffee0d01b04cad63b9dc0fc892922634b0cf76fd 100644
--- a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DParaCrystal.py
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DParaCrystal.py
@@ -18,7 +18,7 @@ def get_sample():
     cylinder = ba.Particle(m_particle, cylinder_ff)
 
     interference = ba.InterferenceFunction2DParaCrystal(
-        ba.SquareLattice(10.0*nm), 0.0, 20.0*micrometer, 20.0*micrometer)
+        ba.SquareLattice2D(10.0*nm), 0.0, 20.0*micrometer, 20.0*micrometer)
     interference.setIntegrationOverXi(True)
     pdf = ba.FTDistribution2DCauchy(1.0*nm, 1.0*nm, 0)
     interference.setProbabilityDistributions(pdf, pdf)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DRotatedSquareLattice.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DRotatedSquareLattice.py
index 99993c2f2978a2c576526da58dc4098d0c0245e6..e0f43a4beef0e44049a922d3c17d3cfe8e670946 100644
--- a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DRotatedSquareLattice.py
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DRotatedSquareLattice.py
@@ -17,7 +17,7 @@ def get_sample():
 
     # collection of particles
     interference = ba.InterferenceFunction2DLattice(
-        ba.SquareLattice(25.0*nm, 30.0*deg))
+        ba.SquareLattice2D(25.0*nm, 30.0*deg))
     pdf = ba.FTDecayFunction2DCauchy(300.0*nm/2.0/numpy.pi, 100.0*nm/2.0/numpy.pi, 0)
     pdf.setParameterValue("Gamma", 30.0*deg)
     interference.setDecayFunction(pdf)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DSquareFiniteLattice.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DSquareFiniteLattice.py
index 0319d13ca30d07f23ceb311c37baf3f28e6755da..5e882bbf4d5c95f0b46dc8aef08afd32f7d42d44 100644
--- a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DSquareFiniteLattice.py
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DSquareFiniteLattice.py
@@ -17,7 +17,7 @@ def get_sample():
 
     # collection of particles
     interference = ba.InterferenceFunctionFinite2DLattice(
-        ba.SquareLattice(25.0*nm, 0.0), 40, 40)
+        ba.SquareLattice2D(25.0*nm, 0.0), 40, 40)
     interference.setPositionVariance(1.0)
 
     cylinder_ff = ba.FormFactorCylinder(3.*nm, 3.*nm)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DSquareLattice.py b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DSquareLattice.py
index b44049343179d999936e7dadd45de028a15004bf..beee085dcfa8c42f2831c5a775ea28acfddc7217 100644
--- a/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DSquareLattice.py
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/Interference2DSquareLattice.py
@@ -16,7 +16,8 @@ def get_sample():
     m_particle = ba.HomogeneousMaterial("Particle", 6e-4, 2e-8)
 
     # collection of particles
-    interference = ba.InterferenceFunction2DLattice(ba.SquareLattice(25.0*nm, 0*deg))
+    interference = ba.InterferenceFunction2DLattice(
+        ba.SquareLattice2D(25.0*nm, 0*deg))
     pdf = ba.FTDecayFunction2DCauchy(300.0*nm/2.0/numpy.pi,
                                      100.0*nm/2.0/numpy.pi, 0)
     interference.setDecayFunction(pdf)
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/SpheresAtHexLattice.py b/Examples/python/simulation/ex03_InterferenceFunctions/SpheresAtHexLattice.py
index 5813247a2a430c59651a7b5e953703c97893c598..3aad9209640967aeeb40f84694b28260bf2c3768 100644
--- a/Examples/python/simulation/ex03_InterferenceFunctions/SpheresAtHexLattice.py
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/SpheresAtHexLattice.py
@@ -20,7 +20,7 @@ def get_sample():
     particle_layout.addParticle(sphere)
 
     interference = ba.InterferenceFunction2DLattice(
-        ba.HexagonalLattice(20.0*nm, 0*deg))
+        ba.HexagonalLattice2D(20.0*nm, 0*deg))
     pdf = ba.FTDecayFunction2DCauchy(10*nm, 10*nm, 0)
     interference.setDecayFunction(pdf)
 
diff --git a/Examples/python/simulation/ex03_InterferenceFunctions/TriangularRipple.py b/Examples/python/simulation/ex03_InterferenceFunctions/TriangularRipple.py
index ea813a7fc43e78f82042c60ba73a37c3ba986cfa..f70859eaa1c1656f5a866a7b63880b91f561c7bd 100644
--- a/Examples/python/simulation/ex03_InterferenceFunctions/TriangularRipple.py
+++ b/Examples/python/simulation/ex03_InterferenceFunctions/TriangularRipple.py
@@ -25,7 +25,7 @@ def get_sample():
     particle_layout.addParticle(ripple, 1.0)
 
     interference = ba.InterferenceFunction2DLattice(
-        200.0*nm, 50.0*nm, 90.0*deg, 0.0*deg)
+        ba.BasicLattice2D(200.0*nm, 50.0*nm, 90.0*deg, 0.0*deg))
     pdf = ba.FTDecayFunction2DGauss(1000.*nm/2./numpy.pi, 100.*nm/2./numpy.pi, 0)
     interference.setDecayFunction(pdf)
     particle_layout.setInterferenceFunction(interference)
diff --git a/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py b/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py
index e798c1b411fa0243ceee8c3a7d84281eead55670..1c2298a929dd8fa9d12de19d36ab40a9ce9e88f0 100644
--- a/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py
+++ b/Examples/python/simulation/ex04_ComplexShapes/HexagonalLatticesWithBasis.py
@@ -27,7 +27,7 @@ def get_sample():
     particle_layout.addParticle(basis)
 
     interference = ba.InterferenceFunction2DLattice(
-        ba.HexagonalLattice(radius*2.0, 0*deg))
+        ba.HexagonalLattice2D(radius*2.0, 0*deg))
     pdf = ba.FTDecayFunction2DCauchy(10*nm, 10*nm, 0)
     interference.setDecayFunction(pdf)
 
diff --git a/Examples/python/simulation/ex06_Reflectometry/MaterialProfileWithParticles.py b/Examples/python/simulation/ex06_Reflectometry/MaterialProfileWithParticles.py
index 2fd471de8348f318110d6e6784a0220f57820a9d..da91b839e052eafadc50cb5ababd3835643b6438 100644
--- a/Examples/python/simulation/ex06_Reflectometry/MaterialProfileWithParticles.py
+++ b/Examples/python/simulation/ex06_Reflectometry/MaterialProfileWithParticles.py
@@ -35,7 +35,7 @@ def get_sample():
     particle = ba.Particle(m_particle, ff)
     layout = ba.ParticleLayout()
     layout.addParticle(particle)
-    iff = ba.InterferenceFunction2DLattice(ba.SquareLattice(10 * nm, 0))
+    iff = ba.InterferenceFunction2DLattice(ba.SquareLattice2D(10 * nm, 0))
     layout.setInterferenceFunction(iff)
     ambient_layer.addLayout(layout)
     ambient_layer.setNumberOfSlices(20)
diff --git a/Examples/python/simulation/ex07_Miscellaneous/BoxesWithSpecularPeak.py b/Examples/python/simulation/ex07_Miscellaneous/BoxesWithSpecularPeak.py
index aa060d9272ed258b121c3a730a86a5444bfa1a67..c401213ac521c676c2660c1de80d17726a549c72 100644
--- a/Examples/python/simulation/ex07_Miscellaneous/BoxesWithSpecularPeak.py
+++ b/Examples/python/simulation/ex07_Miscellaneous/BoxesWithSpecularPeak.py
@@ -21,7 +21,7 @@ def get_sample():
     particle_layout.addParticle(box)
 
     # interference function
-    interference = ba.InterferenceFunction2DLattice(ba.SquareLattice(8*nm, 0*deg))
+    interference = ba.InterferenceFunction2DLattice(ba.SquareLattice2D(8*nm, 0*deg))
     pdf = ba.FTDecayFunction2DCauchy(100*nm, 100*nm, 0)
     interference.setDecayFunction(pdf)
     particle_layout.setInterferenceFunction(interference)
diff --git a/Examples/python/simulation/ex07_Miscellaneous/CylindersInAverageLayer.py b/Examples/python/simulation/ex07_Miscellaneous/CylindersInAverageLayer.py
index 96af9bfa2090d173f6058ab64ba8416234e6fc9d..90619a26b8bf62080197f1c51ac52c2a62aa90fb 100644
--- a/Examples/python/simulation/ex07_Miscellaneous/CylindersInAverageLayer.py
+++ b/Examples/python/simulation/ex07_Miscellaneous/CylindersInAverageLayer.py
@@ -23,7 +23,7 @@ def get_sample(cyl_height=5*nm):
     particle_layout.addParticle(cylinder, 1.0, position)
 
     # interference function
-    interference = ba.InterferenceFunction2DLattice(ba.SquareLattice(15*nm, 0*deg))
+    interference = ba.InterferenceFunction2DLattice(ba.SquareLattice2D(15*nm, 0*deg))
     pdf = ba.FTDecayFunction2DCauchy(300*nm, 300*nm, 0)
     interference.setDecayFunction(pdf)
     particle_layout.setInterferenceFunction(interference)
diff --git a/Examples/python/simulation/ex07_Miscellaneous/HalfSpheresInAverageTopLayer.py b/Examples/python/simulation/ex07_Miscellaneous/HalfSpheresInAverageTopLayer.py
index 2ecf336360fd1dcef066a0d666dd9c4a2d04afd2..a024491a7d5e3688e54195e4881e45d53b9966d9 100644
--- a/Examples/python/simulation/ex07_Miscellaneous/HalfSpheresInAverageTopLayer.py
+++ b/Examples/python/simulation/ex07_Miscellaneous/HalfSpheresInAverageTopLayer.py
@@ -26,7 +26,7 @@ def get_sample():
     particle_layout.addParticle(half_sphere)
 
     # interference function
-    interference = ba.InterferenceFunction2DLattice(ba.SquareLattice(10*nm, 0*deg))
+    interference = ba.InterferenceFunction2DLattice(ba.SquareLattice2D(10*nm, 0*deg))
     pdf = ba.FTDecayFunction2DCauchy(100*nm, 100*nm, 0)
     interference.setDecayFunction(pdf)
     particle_layout.setInterferenceFunction(interference)
diff --git a/GUI/coregui/Models/GUIExamplesFactory.cpp b/GUI/coregui/Models/GUIExamplesFactory.cpp
index 92db0d0c40f5a5b5b31cd346d48abcdb04536fb6..07ecdf9cefb803f56c2530f5f13fecec24b47abb 100644
--- a/GUI/coregui/Models/GUIExamplesFactory.cpp
+++ b/GUI/coregui/Models/GUIExamplesFactory.cpp
@@ -27,7 +27,7 @@ QMap<QString, QString> init_NameToRegistry()
     result["example03"] = "HexParaCrystalBuilder";
     result["example04"] = "CoreShellParticleBuilder";
     result["example05"] = "MultiLayerWithRoughnessBuilder";
-    result["example06"] = "SquareLatticeBuilder";
+    result["example06"] = "SquareLattice2DBuilder";
     result["example07"] = "RotatedPyramidsBuilder";
     result["example08"] = "CylindersWithSizeDistributionBuilder";
     result["example09"] = "ParticleCompositionBuilder";
diff --git a/GUI/coregui/Models/GroupInfoCatalog.cpp b/GUI/coregui/Models/GroupInfoCatalog.cpp
index 13dc64d704e7c8725bea21af0d49896e7be73792..f4ea64b92fcf731ac3d99288f20fe6f91443988b 100644
--- a/GUI/coregui/Models/GroupInfoCatalog.cpp
+++ b/GUI/coregui/Models/GroupInfoCatalog.cpp
@@ -133,10 +133,10 @@ GroupInfoCatalog::GroupInfoCatalog()
     addInfo(info);
 
     info = GroupInfo("Lattice group");
-    info.add("BasicLattice", "Basic");
-    info.add("SquareLattice", "Square");
-    info.add("HexagonalLattice", "Hexagonal");
-    info.setDefaultType("HexagonalLattice");
+    info.add("BasicLattice2D", "Basic");
+    info.add("SquareLattice2D", "Square");
+    info.add("HexagonalLattice2D", "Hexagonal");
+    info.setDefaultType("HexagonalLattice2D");
     addInfo(info);
 
     info = GroupInfo("Resolution function group");
diff --git a/GUI/coregui/Models/ItemCatalog.cpp b/GUI/coregui/Models/ItemCatalog.cpp
index de57baa658d72dcc2fd9e82b16c8e32cd09a7c8f..b623fb5f9a6481deefac9ca1762161a02aed351c 100644
--- a/GUI/coregui/Models/ItemCatalog.cpp
+++ b/GUI/coregui/Models/ItemCatalog.cpp
@@ -163,9 +163,9 @@ ItemCatalog::ItemCatalog()
     add("FTDecayFunction2DGauss", create_new<FTDecayFunction2DGaussItem>);
     add("FTDecayFunction2DVoigt", create_new<FTDecayFunction2DVoigtItem>);
 
-    add("BasicLattice", create_new<BasicLatticeItem>);
-    add("SquareLattice", create_new<SquareLatticeItem>);
-    add("HexagonalLattice", create_new<HexagonalLatticeItem>);
+    add("BasicLattice2D", create_new<BasicLattice2DItem>);
+    add("SquareLattice2D", create_new<SquareLattice2DItem>);
+    add("HexagonalLattice2D", create_new<HexagonalLattice2DItem>);
 
     add("Material", create_new<MaterialItem>);
     add("MaterialContainer", create_new<MaterialItemContainer>);
diff --git a/GUI/coregui/Models/Lattice2DItems.cpp b/GUI/coregui/Models/Lattice2DItems.cpp
index 78df94beb19cc5ada78761600eee57391cbf5db1..ab4329f399f720de6c58b05dfc7adfb057f4cdb1 100644
--- a/GUI/coregui/Models/Lattice2DItems.cpp
+++ b/GUI/coregui/Models/Lattice2DItems.cpp
@@ -32,11 +32,11 @@ double Lattice2DItem::unitCellArea() const
     return createLattice()->unitCellArea();
 }
 
-const QString BasicLatticeItem::P_LATTICE_LENGTH1 = QString::fromStdString("LatticeLength1");
-const QString BasicLatticeItem::P_LATTICE_LENGTH2 = QString::fromStdString("LatticeLength2");
-const QString BasicLatticeItem::P_LATTICE_ANGLE = QString::fromStdString("Alpha");
+const QString BasicLattice2DItem::P_LATTICE_LENGTH1 = QString::fromStdString("LatticeLength1");
+const QString BasicLattice2DItem::P_LATTICE_LENGTH2 = QString::fromStdString("LatticeLength2");
+const QString BasicLattice2DItem::P_LATTICE_ANGLE = QString::fromStdString("Alpha");
 
-BasicLatticeItem::BasicLatticeItem() : Lattice2DItem("BasicLattice")
+BasicLattice2DItem::BasicLattice2DItem() : Lattice2DItem("BasicLattice2D")
 {
     setToolTip("Two dimensional lattice");
     addProperty(P_LATTICE_LENGTH1, 20.0)
@@ -47,9 +47,9 @@ BasicLatticeItem::BasicLatticeItem() : Lattice2DItem("BasicLattice")
     addProperty(Lattice2DItem::P_LATTICE_ROTATION_ANGLE, 0.0)->setToolTip(axis_rotation_tooltip);
 }
 
-std::unique_ptr<Lattice2D> BasicLatticeItem::createLattice() const
+std::unique_ptr<Lattice2D> BasicLattice2DItem::createLattice() const
 {
-    return std::make_unique<BasicLattice>(
+    return std::make_unique<BasicLattice2D>(
         getItemValue(P_LATTICE_LENGTH1).toDouble(), getItemValue(P_LATTICE_LENGTH2).toDouble(),
         Units::deg2rad(getItemValue(P_LATTICE_ANGLE).toDouble()),
         Units::deg2rad(getItemValue(Lattice2DItem::P_LATTICE_ROTATION_ANGLE).toDouble()));
@@ -57,36 +57,36 @@ std::unique_ptr<Lattice2D> BasicLatticeItem::createLattice() const
 
 // --------------------------------------------------------------------------------------------- //
 
-const QString SquareLatticeItem::P_LATTICE_LENGTH = QString::fromStdString("LatticeLength");
+const QString SquareLattice2DItem::P_LATTICE_LENGTH = QString::fromStdString("LatticeLength");
 
-SquareLatticeItem::SquareLatticeItem() : Lattice2DItem("SquareLattice")
+SquareLattice2DItem::SquareLattice2DItem() : Lattice2DItem("SquareLattice2D")
 {
     addProperty(P_LATTICE_LENGTH, 20.0)
         ->setToolTip("Length of first and second lattice vectors in nanometers");
     addProperty(Lattice2DItem::P_LATTICE_ROTATION_ANGLE, 0.0)->setToolTip(axis_rotation_tooltip);
 }
 
-std::unique_ptr<Lattice2D> SquareLatticeItem::createLattice() const
+std::unique_ptr<Lattice2D> SquareLattice2DItem::createLattice() const
 {
-    return std::make_unique<SquareLattice>(
+    return std::make_unique<SquareLattice2D>(
         getItemValue(P_LATTICE_LENGTH).toDouble(),
         Units::deg2rad(getItemValue(Lattice2DItem::P_LATTICE_ROTATION_ANGLE).toDouble()));
 }
 
 // --------------------------------------------------------------------------------------------- //
 
-const QString HexagonalLatticeItem::P_LATTICE_LENGTH = QString::fromStdString("LatticeLength");
+const QString HexagonalLattice2DItem::P_LATTICE_LENGTH = QString::fromStdString("LatticeLength");
 
-HexagonalLatticeItem::HexagonalLatticeItem() : Lattice2DItem("HexagonalLattice")
+HexagonalLattice2DItem::HexagonalLattice2DItem() : Lattice2DItem("HexagonalLattice2D")
 {
     addProperty(P_LATTICE_LENGTH, 20.0)
         ->setToolTip("Length of first and second lattice vectors in nanometers");
     addProperty(Lattice2DItem::P_LATTICE_ROTATION_ANGLE, 0.0)->setToolTip(axis_rotation_tooltip);
 }
 
-std::unique_ptr<Lattice2D> HexagonalLatticeItem::createLattice() const
+std::unique_ptr<Lattice2D> HexagonalLattice2DItem::createLattice() const
 {
-    return std::make_unique<HexagonalLattice>(
+    return std::make_unique<HexagonalLattice2D>(
         getItemValue(P_LATTICE_LENGTH).toDouble(),
         Units::deg2rad(getItemValue(Lattice2DItem::P_LATTICE_ROTATION_ANGLE).toDouble()));
 }
diff --git a/GUI/coregui/Models/Lattice2DItems.h b/GUI/coregui/Models/Lattice2DItems.h
index 2947ef9b3fbd8eca1946307256267aad03dd9c67..359d29d3c0c783af417f82b2b19f77befe8a1eb6 100644
--- a/GUI/coregui/Models/Lattice2DItems.h
+++ b/GUI/coregui/Models/Lattice2DItems.h
@@ -27,29 +27,29 @@ public:
     double unitCellArea() const;
 };
 
-class BA_CORE_API_ BasicLatticeItem : public Lattice2DItem
+class BA_CORE_API_ BasicLattice2DItem : public Lattice2DItem
 {
 public:
     static const QString P_LATTICE_LENGTH1;
     static const QString P_LATTICE_LENGTH2;
     static const QString P_LATTICE_ANGLE;
-    BasicLatticeItem();
+    BasicLattice2DItem();
     std::unique_ptr<Lattice2D> createLattice() const;
 };
 
-class BA_CORE_API_ SquareLatticeItem : public Lattice2DItem
+class BA_CORE_API_ SquareLattice2DItem : public Lattice2DItem
 {
 public:
     static const QString P_LATTICE_LENGTH;
-    SquareLatticeItem();
+    SquareLattice2DItem();
     std::unique_ptr<Lattice2D> createLattice() const;
 };
 
-class BA_CORE_API_ HexagonalLatticeItem : public Lattice2DItem
+class BA_CORE_API_ HexagonalLattice2DItem : public Lattice2DItem
 {
 public:
     static const QString P_LATTICE_LENGTH;
-    HexagonalLatticeItem();
+    HexagonalLattice2DItem();
     std::unique_ptr<Lattice2D> createLattice() const;
 };
 
diff --git a/GUI/coregui/Models/TransformFromDomain.cpp b/GUI/coregui/Models/TransformFromDomain.cpp
index d75c35f6c09b0bb0b522f7757d8787abbc663ec9..33fc8782ce0720ebe49604cee0b59e886d4bdf70 100644
--- a/GUI/coregui/Models/TransformFromDomain.cpp
+++ b/GUI/coregui/Models/TransformFromDomain.cpp
@@ -761,22 +761,22 @@ void SetDecayFunction2D(SessionItem* item, const IFTDecayFunction2D* pdf, QStrin
 void set2DLatticeParameters(SessionItem* item, const Lattice2D& lattice)
 {
     SessionItem* latticeItem(nullptr);
-    if (lattice.getName() == "SquareLattice") {
+    if (lattice.getName() == "SquareLattice2D") {
         latticeItem = item->setGroupProperty(InterferenceFunction2DLatticeItem::P_LATTICE_TYPE,
-                                             "SquareLattice");
-        latticeItem->setItemValue(SquareLatticeItem::P_LATTICE_LENGTH, lattice.length1());
+                                             "SquareLattice2D");
+        latticeItem->setItemValue(SquareLattice2DItem::P_LATTICE_LENGTH, lattice.length1());
 
-    } else if (lattice.getName() == "HexagonalLattice") {
+    } else if (lattice.getName() == "HexagonalLattice2D") {
         latticeItem = item->setGroupProperty(InterferenceFunction2DLatticeItem::P_LATTICE_TYPE,
-                                             "HexagonalLattice");
-        latticeItem->setItemValue(HexagonalLatticeItem::P_LATTICE_LENGTH, lattice.length1());
+                                             "HexagonalLattice2D");
+        latticeItem->setItemValue(HexagonalLattice2DItem::P_LATTICE_LENGTH, lattice.length1());
 
     } else {
         latticeItem = item->setGroupProperty(InterferenceFunction2DLatticeItem::P_LATTICE_TYPE,
-                                             "BasicLattice");
-        latticeItem->setItemValue(BasicLatticeItem::P_LATTICE_LENGTH1, lattice.length1());
-        latticeItem->setItemValue(BasicLatticeItem::P_LATTICE_LENGTH2, lattice.length2());
-        latticeItem->setItemValue(BasicLatticeItem::P_LATTICE_ANGLE,
+                                             "BasicLattice2D");
+        latticeItem->setItemValue(BasicLattice2DItem::P_LATTICE_LENGTH1, lattice.length1());
+        latticeItem->setItemValue(BasicLattice2DItem::P_LATTICE_LENGTH2, lattice.length2());
+        latticeItem->setItemValue(BasicLattice2DItem::P_LATTICE_ANGLE,
                                   Units::rad2deg(lattice.latticeAngle()));
     }
     latticeItem->setItemValue(Lattice2DItem::P_LATTICE_ROTATION_ANGLE,
diff --git a/Param/Node/INodeVisitor.h b/Param/Node/INodeVisitor.h
index e513d4cc5ec3724c4ce69a2d5f08d315b04726da..128401c0f990a9333f45aa43d4c6ba6f50356836 100644
--- a/Param/Node/INodeVisitor.h
+++ b/Param/Node/INodeVisitor.h
@@ -15,7 +15,7 @@
 #ifndef BORNAGAIN_PARAM_NODE_INODEVISITOR_H
 #define BORNAGAIN_PARAM_NODE_INODEVISITOR_H
 
-class BasicLattice;
+class BasicLattice2D;
 class Beam;
 class ConstantBackground;
 class ConvolutionDetectorResolution;
@@ -90,7 +90,7 @@ class FTDistribution2DGate;
 class FTDistribution2DGauss;
 class FTDistribution2DVoigt;
 class GISASSimulation;
-class HexagonalLattice;
+class HexagonalLattice2D;
 class IAbstractParticle;
 class IClusteredParticles;
 class IdentityRotation;
@@ -137,7 +137,7 @@ class RotationZ;
 class SpecularDetector1D;
 class SpecularSimulation;
 class SphericalDetector;
-class SquareLattice;
+class SquareLattice2D;
 
 //! Visitor interface to visit ISample objects.
 //! @ingroup samples_internal
@@ -150,7 +150,7 @@ public:
     INodeVisitor() : m_depth(0) {}
     virtual ~INodeVisitor() {}
 
-    virtual void visit(const BasicLattice*) {}
+    virtual void visit(const BasicLattice2D*) {}
     virtual void visit(const Beam*) {}
     virtual void visit(const ConstantBackground*) {}
     virtual void visit(const ConvolutionDetectorResolution*) {}
@@ -225,7 +225,7 @@ public:
     virtual void visit(const FTDistribution2DGauss*) {}
     virtual void visit(const FTDistribution2DVoigt*) {}
     virtual void visit(const GISASSimulation*) {}
-    virtual void visit(const HexagonalLattice*) {}
+    virtual void visit(const HexagonalLattice2D*) {}
     virtual void visit(const IAbstractParticle*) {}
     virtual void visit(const IClusteredParticles*) {}
     virtual void visit(const IdentityRotation*) {}
@@ -272,7 +272,7 @@ public:
     virtual void visit(const SpecularDetector1D*) {}
     virtual void visit(const SpecularSimulation*) {}
     virtual void visit(const SphericalDetector*) {}
-    virtual void visit(const SquareLattice*) {}
+    virtual void visit(const SquareLattice2D*) {}
 
     //! Returns depth of the visitor in the composite hierarchy
     int depth() const { return m_depth; }
diff --git a/Sample/Aggregate/InterferenceFunction2DLattice.cpp b/Sample/Aggregate/InterferenceFunction2DLattice.cpp
index afcb51ec7efd9ff71960ec18eddb107b81fea335..9c18beb8ac9c0c41e54b62a2f6420cc3de60bd17 100644
--- a/Sample/Aggregate/InterferenceFunction2DLattice.cpp
+++ b/Sample/Aggregate/InterferenceFunction2DLattice.cpp
@@ -35,17 +35,6 @@ InterferenceFunction2DLattice::InterferenceFunction2DLattice(const Lattice2D& la
     initialize_rec_vectors();
 }
 
-//! Constructor of two-dimensional interference function.
-//! @param length_1: length of the first basis vector in nanometers
-//! @param length_2: length of the second basis vector  in nanometers
-//! @param alpha: angle between the basis vectors in radians
-//! @param xi: rotation of the lattice with respect to the x-axis (beam direction) in radians
-InterferenceFunction2DLattice::InterferenceFunction2DLattice(double length_1, double length_2,
-                                                             double alpha, double xi)
-    : InterferenceFunction2DLattice(BasicLattice(length_1, length_2, alpha, xi))
-{
-}
-
 InterferenceFunction2DLattice::~InterferenceFunction2DLattice() = default;
 
 InterferenceFunction2DLattice* InterferenceFunction2DLattice::clone() const
@@ -178,8 +167,8 @@ void InterferenceFunction2DLattice::initialize_rec_vectors()
         throw std::runtime_error("InterferenceFunction2DLattice::initialize_rec_vectors() -> "
                                  "Error. No lattice defined yet");
 
-    BasicLattice base_lattice(m_lattice->length1(), m_lattice->length2(), m_lattice->latticeAngle(),
-                              0.);
+    BasicLattice2D base_lattice(m_lattice->length1(), m_lattice->length2(),
+                                m_lattice->latticeAngle(), 0.);
     m_sbase = base_lattice.reciprocalBases();
 }
 
diff --git a/Sample/Aggregate/InterferenceFunction2DLattice.h b/Sample/Aggregate/InterferenceFunction2DLattice.h
index de7c89eab928158bd4bf45efc83c78347dd4f3f4..47853415622ba8caf9df0e7edca3b6f4bd5a1dac 100644
--- a/Sample/Aggregate/InterferenceFunction2DLattice.h
+++ b/Sample/Aggregate/InterferenceFunction2DLattice.h
@@ -26,7 +26,6 @@
 class InterferenceFunction2DLattice : public IInterferenceFunction
 {
 public:
-    InterferenceFunction2DLattice(double length_1, double length_2, double alpha, double xi);
     InterferenceFunction2DLattice(const Lattice2D& lattice);
     ~InterferenceFunction2DLattice() final;
 
diff --git a/Sample/Aggregate/InterferenceFunction2DParaCrystal.cpp b/Sample/Aggregate/InterferenceFunction2DParaCrystal.cpp
index 4f3e8b6148351100fbeeeb53aa7f350559018b31..35ef5fc4280c02bf992b5c05a1620f9e099ebb76 100644
--- a/Sample/Aggregate/InterferenceFunction2DParaCrystal.cpp
+++ b/Sample/Aggregate/InterferenceFunction2DParaCrystal.cpp
@@ -34,22 +34,6 @@ InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(const Latti
     registerParameter("DomainSize2", &m_domain_sizes[1]).setUnit("nm").setNonnegative();
 }
 
-//! Constructor of interference function of two-dimensional paracrystal.
-//! @param length_1: length of first lattice vector in nanometers
-//! @param length_2: length of second lattice vector in nanometers
-//! @param alpha: angle between lattice vectors in radians
-//! @param xi: rotation of lattice with respect to x-axis (beam direction) in radians
-//! @param damping_length: the damping (coherence) length of the paracrystal in nanometers
-
-InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(double length_1,
-                                                                     double length_2, double alpha,
-                                                                     double xi,
-                                                                     double damping_length)
-    : InterferenceFunction2DParaCrystal(BasicLattice(length_1, length_2, alpha, xi), damping_length,
-                                        0, 0)
-{
-}
-
 InterferenceFunction2DParaCrystal::~InterferenceFunction2DParaCrystal() = default;
 
 InterferenceFunction2DParaCrystal* InterferenceFunction2DParaCrystal::clone() const
diff --git a/Sample/Aggregate/InterferenceFunction2DParaCrystal.h b/Sample/Aggregate/InterferenceFunction2DParaCrystal.h
index 7f61d639436540ac0c006b3b7970387323d02c34..4fa228812769278992b3595c41ab82500cc15b2b 100644
--- a/Sample/Aggregate/InterferenceFunction2DParaCrystal.h
+++ b/Sample/Aggregate/InterferenceFunction2DParaCrystal.h
@@ -32,9 +32,6 @@ public:
     InterferenceFunction2DParaCrystal(const Lattice2D& lattice, double damping_length,
                                       double domain_size_1, double domain_size_2);
 
-    InterferenceFunction2DParaCrystal(double length_1, double length_2, double alpha, double xi,
-                                      double damping_length);
-
     ~InterferenceFunction2DParaCrystal() final;
 
     InterferenceFunction2DParaCrystal* clone() const override final;
diff --git a/Sample/Aggregate/InterferenceFunction2DSuperLattice.cpp b/Sample/Aggregate/InterferenceFunction2DSuperLattice.cpp
index e58c11ba3c431b2dfae2f0177af333e28ab79d52..cc0041a76350fc39e1612a8dc41a19dd3da814cd 100644
--- a/Sample/Aggregate/InterferenceFunction2DSuperLattice.cpp
+++ b/Sample/Aggregate/InterferenceFunction2DSuperLattice.cpp
@@ -46,7 +46,7 @@ InterferenceFunction2DSuperLattice::InterferenceFunction2DSuperLattice(const Lat
 //! @param size_2: correlation length in direction 2
 InterferenceFunction2DSuperLattice::InterferenceFunction2DSuperLattice(
     double length_1, double length_2, double alpha, double xi, unsigned size_1, unsigned size_2)
-    : InterferenceFunction2DSuperLattice(BasicLattice(length_1, length_2, alpha, xi), size_1,
+    : InterferenceFunction2DSuperLattice(BasicLattice2D(length_1, length_2, alpha, xi), size_1,
                                          size_2)
 {
 }
diff --git a/Sample/Aggregate/InterferenceFunctionFinite2DLattice.cpp b/Sample/Aggregate/InterferenceFunctionFinite2DLattice.cpp
index f53a35ef17af12e3549b6f187bf285e6d11ec889..342e1e2c8514b2794ac810bf11e1b1933f3ac734 100644
--- a/Sample/Aggregate/InterferenceFunctionFinite2DLattice.cpp
+++ b/Sample/Aggregate/InterferenceFunctionFinite2DLattice.cpp
@@ -36,21 +36,6 @@ InterferenceFunctionFinite2DLattice::InterferenceFunctionFinite2DLattice(const L
     registerChild(m_lattice.get());
 }
 
-//! Constructor of two-dimensional finite lattice interference function.
-//! @param length_1: length of first lattice vector in nanometers
-//! @param length_2: length of second lattice vector  in nanometers
-//! @param alpha: angle between lattice vectors in radians
-//! @param xi: rotation of lattice with respect to x-axis (beam direction) in radians
-//! @param N_1: number of lattice cells in the first lattice direction
-//! @param N_2: number of lattice cells in the second lattice direction
-InterferenceFunctionFinite2DLattice::InterferenceFunctionFinite2DLattice(double length_1,
-                                                                         double length_2,
-                                                                         double alpha, double xi,
-                                                                         unsigned N_1, unsigned N_2)
-    : InterferenceFunctionFinite2DLattice(BasicLattice(length_1, length_2, alpha, xi), N_1, N_2)
-{
-}
-
 InterferenceFunctionFinite2DLattice::~InterferenceFunctionFinite2DLattice() = default;
 
 InterferenceFunctionFinite2DLattice* InterferenceFunctionFinite2DLattice::clone() const
diff --git a/Sample/Aggregate/InterferenceFunctionFinite2DLattice.h b/Sample/Aggregate/InterferenceFunctionFinite2DLattice.h
index 6f90b1fac3e1b11e5b0ad3a930d6bb051cf3bf59..35c24acdbbc42b64a43ea6d53dfe767a560e0190 100644
--- a/Sample/Aggregate/InterferenceFunctionFinite2DLattice.h
+++ b/Sample/Aggregate/InterferenceFunctionFinite2DLattice.h
@@ -25,8 +25,6 @@ class InterferenceFunctionFinite2DLattice : public IInterferenceFunction
 {
 public:
     InterferenceFunctionFinite2DLattice(const Lattice2D& lattice, unsigned N_1, unsigned N_2);
-    InterferenceFunctionFinite2DLattice(double length_1, double length_2, double alpha, double xi,
-                                        unsigned N_1, unsigned N_2);
     ~InterferenceFunctionFinite2DLattice() final;
 
     InterferenceFunctionFinite2DLattice* clone() const override final;
diff --git a/Sample/Aggregate/ParticleLayout.cpp b/Sample/Aggregate/ParticleLayout.cpp
index 8881eddede6e3d28ba86d28d49027bbd57a69af5..b52f3edc5c0effdc2f4954018c50553e0c26551a 100644
--- a/Sample/Aggregate/ParticleLayout.cpp
+++ b/Sample/Aggregate/ParticleLayout.cpp
@@ -112,9 +112,8 @@ const IInterferenceFunction* ParticleLayout::interferenceFunction() const
 double ParticleLayout::getTotalAbundance() const
 {
     double result = 0.0;
-    for (auto p_particle : m_particles) {
+    for (auto p_particle : m_particles)
         result += p_particle->abundance();
-    }
     return result;
 }
 
diff --git a/Sample/Interference/DecouplingApproximationStrategy.cpp b/Sample/Interference/DecouplingApproximationStrategy.cpp
index 7b6f493ad14590276e0c9ecb6ea708db0a7f0e56..43994a90e223db42006ffef343819d53ce23f790 100644
--- a/Sample/Interference/DecouplingApproximationStrategy.cpp
+++ b/Sample/Interference/DecouplingApproximationStrategy.cpp
@@ -18,13 +18,15 @@
 #include "Base/Utils/MathFunctions.h"
 #include "Param/Base/RealParameter.h"
 #include "Sample/Aggregate/IInterferenceFunction.h"
+#include "Sample/Aggregate/InterferenceFunctionNone.h"
 #include "Sample/Fresnel/FormFactorCoherentSum.h"
-#include "Sample/Interference/FormFactorPrecompute.h"
 
 DecouplingApproximationStrategy::DecouplingApproximationStrategy(
     const std::vector<FormFactorCoherentSum>& weighted_formfactors,
-    const IInterferenceFunction* p_iff, SimulationOptions sim_params, bool polarized)
-    : IInterferenceFunctionStrategy(weighted_formfactors, p_iff, sim_params, polarized)
+    const IInterferenceFunction* iff, SimulationOptions sim_params, bool polarized)
+    : IInterferenceFunctionStrategy(weighted_formfactors, sim_params, polarized)
+    , m_iff(iff ? iff->clone() : new InterferenceFunctionNone())
+
 {
 }
 
@@ -36,18 +38,17 @@ DecouplingApproximationStrategy::scalarCalculation(const SimulationElement& sim_
 {
     double intensity = 0.0;
     complex_t amplitude = complex_t(0.0, 0.0);
-    auto precomputed_ff = FormFactorPrecompute::scalar(sim_element, m_formfactor_wrappers);
-    for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
-        complex_t ff = precomputed_ff[i];
+    for (const auto& ffw : m_weighted_formfactors) {
+        const complex_t ff = ffw.evaluate(sim_element);
         if (std::isnan(ff.real()))
             throw Exceptions::RuntimeErrorException(
                 "DecouplingApproximationStrategy::scalarCalculation() -> Error! Amplitude is NaN");
-        double fraction = m_formfactor_wrappers[i].relativeAbundance();
+        double fraction = ffw.relativeAbundance();
         amplitude += fraction * ff;
         intensity += fraction * std::norm(ff);
     }
-    double amplitude_norm = std::norm(amplitude);
-    double coherence_factor = m_iff->evaluate(sim_element.getMeanQ());
+    const double amplitude_norm = std::norm(amplitude);
+    const double coherence_factor = m_iff->evaluate(sim_element.meanQ());
     return intensity + amplitude_norm * (coherence_factor - 1.0);
 }
 
@@ -58,24 +59,24 @@ DecouplingApproximationStrategy::polarizedCalculation(const SimulationElement& s
     Eigen::Matrix2cd mean_intensity = Eigen::Matrix2cd::Zero();
     Eigen::Matrix2cd mean_amplitude = Eigen::Matrix2cd::Zero();
 
-    auto precomputed_ff = FormFactorPrecompute::polarized(sim_element, m_formfactor_wrappers);
     const auto& polarization_handler = sim_element.polarizationHandler();
-    for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
-        Eigen::Matrix2cd ff = precomputed_ff[i];
+    for (const auto& ffw : m_weighted_formfactors) {
+        const Eigen::Matrix2cd ff = ffw.evaluatePol(sim_element);
         if (!ff.allFinite())
             throw Exceptions::RuntimeErrorException(
                 "DecouplingApproximationStrategy::polarizedCalculation() -> "
                 "Error! Form factor contains NaN or infinite");
-        double fraction = m_formfactor_wrappers[i].relativeAbundance();
+        const double fraction = ffw.relativeAbundance();
         mean_amplitude += fraction * ff;
         mean_intensity += fraction * (ff * polarization_handler.getPolarization() * ff.adjoint());
     }
-    Eigen::Matrix2cd amplitude_matrix = polarization_handler.getAnalyzerOperator() * mean_amplitude
-                                        * polarization_handler.getPolarization()
-                                        * mean_amplitude.adjoint();
-    Eigen::Matrix2cd intensity_matrix = polarization_handler.getAnalyzerOperator() * mean_intensity;
-    double amplitude_trace = std::abs(amplitude_matrix.trace());
-    double intensity_trace = std::abs(intensity_matrix.trace());
-    double coherence_factor = m_iff->evaluate(sim_element.getMeanQ());
+    const Eigen::Matrix2cd amplitude_matrix =
+        polarization_handler.getAnalyzerOperator() * mean_amplitude
+        * polarization_handler.getPolarization() * mean_amplitude.adjoint();
+    const Eigen::Matrix2cd intensity_matrix =
+        polarization_handler.getAnalyzerOperator() * mean_intensity;
+    const double amplitude_trace = std::abs(amplitude_matrix.trace());
+    const double intensity_trace = std::abs(intensity_matrix.trace());
+    const double coherence_factor = m_iff->evaluate(sim_element.meanQ());
     return intensity_trace + amplitude_trace * (coherence_factor - 1.0);
 }
diff --git a/Sample/Interference/DecouplingApproximationStrategy.h b/Sample/Interference/DecouplingApproximationStrategy.h
index bb2569e9fd5ca409eb0416ab881717781efa0ca4..12a76bfccba380870a642414f23506ffc84f912b 100644
--- a/Sample/Interference/DecouplingApproximationStrategy.h
+++ b/Sample/Interference/DecouplingApproximationStrategy.h
@@ -27,12 +27,14 @@ class DecouplingApproximationStrategy final : public IInterferenceFunctionStrate
 {
 public:
     DecouplingApproximationStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors,
-                                    const IInterferenceFunction* p_iff,
-                                    SimulationOptions sim_params, bool polarized);
+                                    const IInterferenceFunction* iff, SimulationOptions sim_params,
+                                    bool polarized);
 
 private:
     double scalarCalculation(const SimulationElement& sim_element) const override;
     double polarizedCalculation(const SimulationElement& sim_element) const override;
+
+    std::unique_ptr<IInterferenceFunction> m_iff;
 };
 
 #endif // BORNAGAIN_SAMPLE_INTERFERENCE_DECOUPLINGAPPROXIMATIONSTRATEGY_H
diff --git a/Sample/Interference/IInterferenceFunctionStrategy.cpp b/Sample/Interference/IInterferenceFunctionStrategy.cpp
index 9c5c315dc7c5412602a9d39ebda7753afbd52ca1..734244fc585cd6350f59d676bdc18c185eb12bf5 100644
--- a/Sample/Interference/IInterferenceFunctionStrategy.cpp
+++ b/Sample/Interference/IInterferenceFunctionStrategy.cpp
@@ -17,20 +17,18 @@
 #include "Base/Types/Exceptions.h"
 #include "Base/Utils/Assert.h"
 #include "Base/Utils/IntegratorMCMiser.h"
-#include "Sample/Aggregate/InterferenceFunctionNone.h"
 #include "Sample/Fresnel/FormFactorCoherentSum.h"
 
 IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(
     const std::vector<FormFactorCoherentSum>& weighted_formfactors,
-    const IInterferenceFunction* p_iff, const SimulationOptions& sim_params, bool polarized)
-    : m_formfactor_wrappers(weighted_formfactors)
-    , m_iff(p_iff ? p_iff->clone() : new InterferenceFunctionNone())
+    const SimulationOptions& sim_params, bool polarized)
+    : m_weighted_formfactors(weighted_formfactors)
     , m_options(sim_params)
     , m_polarized(polarized)
     , m_integrator(
           make_integrator_miser(this, &IInterferenceFunctionStrategy::evaluate_for_fixed_angles, 2))
 {
-    ASSERT(!m_formfactor_wrappers.empty());
+    ASSERT(!m_weighted_formfactors.empty());
 }
 
 IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy() = default;
diff --git a/Sample/Interference/IInterferenceFunctionStrategy.h b/Sample/Interference/IInterferenceFunctionStrategy.h
index 9d6b56908820f1a29cec2cb98996fc3ef7a760d1..59811d770bcb0f75e4bd5de4d5503ebc579ffabc 100644
--- a/Sample/Interference/IInterferenceFunctionStrategy.h
+++ b/Sample/Interference/IInterferenceFunctionStrategy.h
@@ -42,7 +42,6 @@ class IInterferenceFunctionStrategy
 {
 public:
     IInterferenceFunctionStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors,
-                                  const IInterferenceFunction* p_iff,
                                   const SimulationOptions& sim_params, bool polarized);
     virtual ~IInterferenceFunctionStrategy();
 
@@ -50,8 +49,7 @@ public:
     double evaluate(const SimulationElement& sim_element) const;
 
 protected:
-    std::vector<FormFactorCoherentSum> m_formfactor_wrappers;
-    std::unique_ptr<IInterferenceFunction> m_iff;
+    std::vector<FormFactorCoherentSum> m_weighted_formfactors;
     const SimulationOptions m_options;
 
 private:
diff --git a/Sample/Interference/SSCAHelper.cpp b/Sample/Interference/SSCAHelper.cpp
deleted file mode 100644
index 4961df4e69679574f58199e074ec4c7388376b0e..0000000000000000000000000000000000000000
--- a/Sample/Interference/SSCAHelper.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Sample/Interference/SSCAHelper.cpp
-//! @brief     Implements class SSCAHelper.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-// ************************************************************************** //
-
-#include "Sample/Interference/SSCAHelper.h"
-#include "Base/Types/Exceptions.h"
-#include "Sample/Aggregate/InterferenceFunctionRadialParaCrystal.h"
-#include "Sample/Fresnel/FormFactorCoherentSum.h"
-
-SSCAHelper::SSCAHelper(double kappa) : m_kappa(kappa), m_mean_radius{} {}
-
-void SSCAHelper::init(const std::vector<FormFactorCoherentSum>& ff_wrappers)
-{
-    m_mean_radius = 0.0;
-    for (auto& ffw : ff_wrappers)
-        m_mean_radius += ffw.relativeAbundance() * ffw.radialExtension();
-}
-
-complex_t SSCAHelper::getCharacteristicSizeCoupling(
-    double qp, const std::vector<FormFactorCoherentSum>& ff_wrappers) const
-{
-    complex_t result{};
-    for (auto& ffw : ff_wrappers) {
-        double radial_extension = ffw.radialExtension();
-        result +=
-            ffw.relativeAbundance() * calculatePositionOffsetPhase(2.0 * qp, radial_extension);
-    }
-    return result;
-}
-
-complex_t SSCAHelper::getCharacteristicDistribution(double qp,
-                                                    const IInterferenceFunction* p_iff) const
-{
-    const InterferenceFunctionRadialParaCrystal* p_iff_radial =
-        dynamic_cast<const InterferenceFunctionRadialParaCrystal*>(p_iff);
-    if (!p_iff_radial)
-        throw Exceptions::ClassInitializationException("Wrong interference function for SSCA");
-    return p_iff_radial->FTPDF(qp);
-}
-
-complex_t SSCAHelper::calculatePositionOffsetPhase(double qp, double radial_extension) const
-{
-    return exp_I(m_kappa * qp * (radial_extension - m_mean_radius));
-}
-
-complex_t
-SSCAHelper::getMeanFormfactorNorm(double qp, const std::vector<complex_t>& precomputed_ff,
-                                  const std::vector<FormFactorCoherentSum>& ff_wrappers) const
-{
-    complex_t ff_orig = 0., ff_conj = 0.; // original and conjugated mean formfactor
-    for (size_t i = 0; i < ff_wrappers.size(); ++i) {
-        double radial_extension = ff_wrappers[i].radialExtension();
-        complex_t prefac =
-            ff_wrappers[i].relativeAbundance() * calculatePositionOffsetPhase(qp, radial_extension);
-        ff_orig += prefac * precomputed_ff[i];
-        ff_conj += prefac * std::conj(precomputed_ff[i]);
-    }
-    return ff_orig * ff_conj;
-}
-
-void SSCAHelper::getMeanFormfactors(double qp, Eigen::Matrix2cd& ff_orig, Eigen::Matrix2cd& ff_conj,
-                                    const FormFactorPrecompute::matrixFFVector_t& precomputed_ff,
-                                    const std::vector<FormFactorCoherentSum>& ff_wrappers) const
-{
-    ff_orig = Eigen::Matrix2cd::Zero();
-    ff_conj = Eigen::Matrix2cd::Zero();
-    for (size_t i = 0; i < ff_wrappers.size(); ++i) {
-        double radial_extension = ff_wrappers[i].radialExtension();
-        complex_t prefac =
-            ff_wrappers[i].relativeAbundance() * calculatePositionOffsetPhase(qp, radial_extension);
-        ff_orig += prefac * precomputed_ff[i];
-        ff_conj += prefac * precomputed_ff[i].adjoint();
-    }
-}
diff --git a/Sample/Interference/SSCAHelper.h b/Sample/Interference/SSCAHelper.h
deleted file mode 100644
index eaff366a9dbf23818020c6a690deb3db99965d2a..0000000000000000000000000000000000000000
--- a/Sample/Interference/SSCAHelper.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// ************************************************************************** //
-//
-//  BornAgain: simulate and fit scattering at grazing incidence
-//
-//! @file      Sample/Interference/SSCAHelper.h
-//! @brief     Defines class SSCAHelper.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-// ************************************************************************** //
-
-#ifndef BORNAGAIN_SAMPLE_INTERFERENCE_SSCAHELPER_H
-#define BORNAGAIN_SAMPLE_INTERFERENCE_SSCAHELPER_H
-
-#include "Sample/Interference/FormFactorPrecompute.h"
-#include "Sample/Interference/IInterferenceFunctionStrategy.h"
-#include <Eigen/StdVector>
-
-class FormFactorCoherentSum;
-class IInterferenceFunction;
-
-//! Helper class for SSCApproximationStrategy, offering some methods, shared between
-//! the scalar and polarized scattering calculations
-//! @ingroup algorithms_internal
-
-class SSCAHelper
-{
-public:
-    SSCAHelper(double kappa);
-
-    void init(const std::vector<FormFactorCoherentSum>& ff_wrappers);
-
-    complex_t
-    getCharacteristicSizeCoupling(double qp,
-                                  const std::vector<FormFactorCoherentSum>& ff_wrappers) const;
-    complex_t getCharacteristicDistribution(double qp, const IInterferenceFunction* p_iff) const;
-    complex_t calculatePositionOffsetPhase(double qp, double radial_extension) const;
-    complex_t getMeanFormfactorNorm(double qp, const std::vector<complex_t>& precomputed_ff,
-                                    const std::vector<FormFactorCoherentSum>& ff_wrappers) const;
-    void getMeanFormfactors(double qp, Eigen::Matrix2cd& ff_orig, Eigen::Matrix2cd& ff_conj,
-                            const FormFactorPrecompute::matrixFFVector_t& precomputed_ff,
-                            const std::vector<FormFactorCoherentSum>& ff_wrappers) const;
-
-private:
-    double m_kappa;
-    double m_mean_radius;
-};
-
-#endif // BORNAGAIN_SAMPLE_INTERFERENCE_SSCAHELPER_H
diff --git a/Sample/Interference/SSCApproximationStrategy.cpp b/Sample/Interference/SSCApproximationStrategy.cpp
index 37ba6aa5497bd1c1ccdfdc2f14e2faf2be158176..6da59710a197cc8d4e514d460bca18f0ed515119 100644
--- a/Sample/Interference/SSCApproximationStrategy.cpp
+++ b/Sample/Interference/SSCApproximationStrategy.cpp
@@ -14,16 +14,21 @@
 
 #include "Sample/Interference/SSCApproximationStrategy.h"
 #include "Base/Pixel/SimulationElement.h"
-#include "Sample/Aggregate/IInterferenceFunction.h"
+#include "Base/Types/Exceptions.h"
+#include "Sample/Aggregate/InterferenceFunctionRadialParaCrystal.h"
 #include "Sample/Fresnel/FormFactorCoherentSum.h"
 
 SSCApproximationStrategy::SSCApproximationStrategy(
     const std::vector<FormFactorCoherentSum>& weighted_formfactors,
-    const IInterferenceFunction* p_iff, SimulationOptions sim_params, bool polarized, double kappa)
-    : IInterferenceFunctionStrategy(weighted_formfactors, p_iff, sim_params, polarized)
-    , m_helper(kappa)
+    const InterferenceFunctionRadialParaCrystal* iff, SimulationOptions sim_params, bool polarized,
+    double kappa)
+    : IInterferenceFunctionStrategy(weighted_formfactors, sim_params, polarized)
+    , m_iff(iff->clone())
+    , m_kappa(kappa)
 {
-    m_helper.init(m_formfactor_wrappers);
+    m_mean_radius = 0.0;
+    for (const auto& ffw : m_weighted_formfactors)
+        m_mean_radius += ffw.relativeAbundance() * ffw.radialExtension();
 }
 
 //! Returns the total scattering intensity for given kf and
@@ -31,45 +36,70 @@ SSCApproximationStrategy::SSCApproximationStrategy(
 //! This is the scalar version
 double SSCApproximationStrategy::scalarCalculation(const SimulationElement& sim_element) const
 {
-    double qp = sim_element.getMeanQ().magxy();
+    const double qp = sim_element.meanQ().magxy();
     double diffuse_intensity = 0.0;
-    auto precomputed_ff = FormFactorPrecompute::scalar(sim_element, m_formfactor_wrappers);
-    for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
-        complex_t ff = precomputed_ff[i];
-        double fraction = m_formfactor_wrappers[i].relativeAbundance();
+    complex_t ff_orig = 0., ff_conj = 0.; // original and conjugated mean formfactor
+    for (const auto& ffw : m_weighted_formfactors) {
+        complex_t ff = ffw.evaluate(sim_element);
+        double fraction = ffw.relativeAbundance();
         diffuse_intensity += fraction * std::norm(ff);
+        double radial_extension = ffw.radialExtension();
+        complex_t prefac =
+            ffw.relativeAbundance() * calculatePositionOffsetPhase(qp, radial_extension);
+        ff_orig += prefac * ff;
+        ff_conj += prefac * std::conj(ff);
     }
-    complex_t mean_ff_norm =
-        m_helper.getMeanFormfactorNorm(qp, precomputed_ff, m_formfactor_wrappers);
-    complex_t p2kappa = m_helper.getCharacteristicSizeCoupling(qp, m_formfactor_wrappers);
-    complex_t omega = m_helper.getCharacteristicDistribution(qp, m_iff.get());
-    double iff = 2.0 * (mean_ff_norm * omega / (1.0 - p2kappa * omega)).real();
-    double dw_factor = m_iff->DWfactor(sim_element.getMeanQ());
+    const complex_t mean_ff_norm = ff_orig * ff_conj;
+    const complex_t p2kappa = getCharacteristicSizeCoupling(qp, m_weighted_formfactors);
+    const complex_t omega = m_iff->FTPDF(qp);
+    const double iff = 2.0 * (mean_ff_norm * omega / (1.0 - p2kappa * omega)).real();
+    const double dw_factor = m_iff->DWfactor(sim_element.meanQ());
     return diffuse_intensity + dw_factor * iff;
 }
 
 //! This is the polarized version
 double SSCApproximationStrategy::polarizedCalculation(const SimulationElement& sim_element) const
 {
-    double qp = sim_element.getMeanQ().magxy();
+    const double qp = sim_element.meanQ().magxy();
     Eigen::Matrix2cd diffuse_matrix = Eigen::Matrix2cd::Zero();
-    auto precomputed_ff = FormFactorPrecompute::polarized(sim_element, m_formfactor_wrappers);
     const auto& polarization_handler = sim_element.polarizationHandler();
-    for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
-        Eigen::Matrix2cd ff = precomputed_ff[i];
-        double fraction = m_formfactor_wrappers[i].relativeAbundance();
+    Eigen::Matrix2cd ff_orig = Eigen::Matrix2cd::Zero();
+    Eigen::Matrix2cd ff_conj = Eigen::Matrix2cd::Zero();
+    for (const auto& ffw : m_weighted_formfactors) {
+        const Eigen::Matrix2cd ff = ffw.evaluatePol(sim_element);
+        const double fraction = ffw.relativeAbundance();
         diffuse_matrix += fraction * (ff * polarization_handler.getPolarization() * ff.adjoint());
+        const double radial_extension = ffw.radialExtension();
+        const complex_t prefac =
+            ffw.relativeAbundance() * calculatePositionOffsetPhase(qp, radial_extension);
+        ff_orig += prefac * ff;
+        ff_conj += prefac * ff.adjoint();
     }
-    Eigen::Matrix2cd mff_orig, mff_conj; // original and conjugated mean formfactor
-    m_helper.getMeanFormfactors(qp, mff_orig, mff_conj, precomputed_ff, m_formfactor_wrappers);
-    complex_t p2kappa = m_helper.getCharacteristicSizeCoupling(qp, m_formfactor_wrappers);
-    complex_t omega = m_helper.getCharacteristicDistribution(qp, m_iff.get());
-    Eigen::Matrix2cd interference_matrix = (2.0 * omega / (1.0 - p2kappa * omega))
-                                           * polarization_handler.getAnalyzerOperator() * mff_orig
-                                           * polarization_handler.getPolarization() * mff_conj;
-    Eigen::Matrix2cd diffuse_matrix2 = polarization_handler.getAnalyzerOperator() * diffuse_matrix;
-    double interference_trace = std::abs(interference_matrix.trace());
-    double diffuse_trace = std::abs(diffuse_matrix2.trace());
-    double dw_factor = m_iff->DWfactor(sim_element.getMeanQ());
+    const complex_t p2kappa = getCharacteristicSizeCoupling(qp, m_weighted_formfactors);
+    const complex_t omega = m_iff->FTPDF(qp);
+    const Eigen::Matrix2cd interference_matrix =
+        (2.0 * omega / (1.0 - p2kappa * omega)) * polarization_handler.getAnalyzerOperator()
+        * ff_orig * polarization_handler.getPolarization() * ff_conj;
+    const Eigen::Matrix2cd diffuse_matrix2 =
+        polarization_handler.getAnalyzerOperator() * diffuse_matrix;
+    const double interference_trace = std::abs(interference_matrix.trace());
+    const double diffuse_trace = std::abs(diffuse_matrix2.trace());
+    const double dw_factor = m_iff->DWfactor(sim_element.meanQ());
     return diffuse_trace + dw_factor * interference_trace;
 }
+
+complex_t SSCApproximationStrategy::getCharacteristicSizeCoupling(
+    double qp, const std::vector<FormFactorCoherentSum>& ff_wrappers) const
+{
+    complex_t result = 0;
+    for (const auto& ffw : ff_wrappers)
+        result +=
+            ffw.relativeAbundance() * calculatePositionOffsetPhase(2.0 * qp, ffw.radialExtension());
+    return result;
+}
+
+complex_t SSCApproximationStrategy::calculatePositionOffsetPhase(double qp,
+                                                                 double radial_extension) const
+{
+    return exp_I(m_kappa * qp * (radial_extension - m_mean_radius));
+}
diff --git a/Sample/Interference/SSCApproximationStrategy.h b/Sample/Interference/SSCApproximationStrategy.h
index 073a478ab49406167253b03288dcbe115463a1d7..0f900d7fcfe942777272fc79873131fc588f4dc0 100644
--- a/Sample/Interference/SSCApproximationStrategy.h
+++ b/Sample/Interference/SSCApproximationStrategy.h
@@ -15,8 +15,10 @@
 #ifndef BORNAGAIN_SAMPLE_INTERFERENCE_SSCAPPROXIMATIONSTRATEGY_H
 #define BORNAGAIN_SAMPLE_INTERFERENCE_SSCAPPROXIMATIONSTRATEGY_H
 
-#include "Sample/Interference/SSCAHelper.h"
+#include "Sample/Interference/IInterferenceFunctionStrategy.h"
+#include <Eigen/StdVector>
 
+class InterferenceFunctionRadialParaCrystal;
 class SimulationElement;
 
 //! Strategy class to compute the total scattering from a particle layout
@@ -27,13 +29,23 @@ class SSCApproximationStrategy final : public IInterferenceFunctionStrategy
 {
 public:
     SSCApproximationStrategy(const std::vector<FormFactorCoherentSum>& weighted_formfactors,
-                             const IInterferenceFunction* p_iff, SimulationOptions sim_params,
-                             bool polarized, double kappa);
+                             const InterferenceFunctionRadialParaCrystal* iff,
+                             SimulationOptions sim_params, bool polarized, double kappa);
 
 private:
     double scalarCalculation(const SimulationElement& sim_element) const override;
     double polarizedCalculation(const SimulationElement& sim_element) const override;
-    SSCAHelper m_helper;
+
+    void init(const std::vector<FormFactorCoherentSum>& ff_wrappers);
+
+    complex_t
+    getCharacteristicSizeCoupling(double qp,
+                                  const std::vector<FormFactorCoherentSum>& ff_wrappers) const;
+    complex_t calculatePositionOffsetPhase(double qp, double radial_extension) const;
+
+    std::unique_ptr<InterferenceFunctionRadialParaCrystal> m_iff;
+    double m_kappa;
+    double m_mean_radius;
 };
 
 #endif // BORNAGAIN_SAMPLE_INTERFERENCE_SSCAPPROXIMATIONSTRATEGY_H
diff --git a/Sample/Lattice/BakeLattice.cpp b/Sample/Lattice/BakeLattice.cpp
index f9979f0da7cb6a2f0e3b4e72d012f65ad92662ee..a178819ced363393e7df20e6624eb539e5068fca 100644
--- a/Sample/Lattice/BakeLattice.cpp
+++ b/Sample/Lattice/BakeLattice.cpp
@@ -15,7 +15,7 @@
 #include "Sample/Lattice/BakeLattice.h"
 #include "Sample/Lattice/Lattice3D.h"
 
-Lattice3D bake::createCubicLattice(double a)
+Lattice3D bake::CubicLattice(double a)
 {
     kvector_t a1(a, 0.0, 0.0);
     kvector_t a2(0.0, a, 0.0);
@@ -23,7 +23,7 @@ Lattice3D bake::createCubicLattice(double a)
     return Lattice3D(a1, a2, a3);
 }
 
-Lattice3D bake::createFCCLattice(double a)
+Lattice3D bake::FCCLattice(double a)
 {
     double b = a / 2.0;
     kvector_t a1(0.0, b, b);
@@ -32,7 +32,7 @@ Lattice3D bake::createFCCLattice(double a)
     return Lattice3D(a1, a2, a3);
 }
 
-Lattice3D bake::createHexagonalLattice(double a, double c)
+Lattice3D bake::HexagonalLattice(double a, double c)
 {
     kvector_t a1(a, 0.0, 0.0);
     kvector_t a2(-a / 2.0, std::sqrt(3.0) * a / 2.0, 0.0);
@@ -40,7 +40,7 @@ Lattice3D bake::createHexagonalLattice(double a, double c)
     return Lattice3D(a1, a2, a3);
 }
 
-Lattice3D bake::createHCPLattice(double a, double c)
+Lattice3D bake::HCPLattice(double a, double c)
 {
     kvector_t a1(a, 0.0, 0.0);
     kvector_t a2(-a / 2.0, std::sqrt(3.0) * a / 2.0, 0);
@@ -48,7 +48,7 @@ Lattice3D bake::createHCPLattice(double a, double c)
     return Lattice3D(a1, a2, a3);
 }
 
-Lattice3D bake::createTetragonalLattice(double a, double c)
+Lattice3D bake::TetragonalLattice(double a, double c)
 {
     kvector_t a1(a, 0.0, 0.0);
     kvector_t a2(0.0, a, 0.0);
@@ -56,7 +56,7 @@ Lattice3D bake::createTetragonalLattice(double a, double c)
     return Lattice3D(a1, a2, a3);
 }
 
-Lattice3D bake::createBCTLattice(double a, double c)
+Lattice3D bake::BCTLattice(double a, double c)
 {
     kvector_t a1(a, 0.0, 0.0);
     kvector_t a2(0.0, a, 0.0);
diff --git a/Sample/Lattice/BakeLattice.h b/Sample/Lattice/BakeLattice.h
index 4f0373f36a61a2c881c3402888abd8bdbf08a3e6..239c7d6b92bf2619fae5880f285d3a5367fa65e6 100644
--- a/Sample/Lattice/BakeLattice.h
+++ b/Sample/Lattice/BakeLattice.h
@@ -21,23 +21,23 @@ namespace bake
 {
 
 //! Returns a primitive cubic (cP) lattice with edge length a.
-Lattice3D createCubicLattice(double a);
+Lattice3D CubicLattice(double a);
 
 //! Returns a face-centered cubic (cF) lattice with edge length a.
-Lattice3D createFCCLattice(double a);
+Lattice3D FCCLattice(double a);
 
 //! Returns a primitive hexagonal (hP) lattice with hexagonal edge a and height c.
-Lattice3D createHexagonalLattice(double a, double c);
+Lattice3D HexagonalLattice(double a, double c);
 
 //! TODO: Clarify how this is meant: HCP is not a Bravais lattice.
-Lattice3D createHCPLattice(double a, double c);
+Lattice3D HCPLattice(double a, double c);
 
 //! Returns a primitive tetragonal (tP) lattice with square base edge a and height c.
-Lattice3D createTetragonalLattice(double a, double c);
+Lattice3D TetragonalLattice(double a, double c);
 
 //! Returns a body-centered cubic (cI) lattice with edge length a.
 //! TODO: Clarify meaning of c
-Lattice3D createBCTLattice(double a, double c);
+Lattice3D BCTLattice(double a, double c);
 
 } // namespace bake
 
diff --git a/Sample/Lattice/Lattice2D.cpp b/Sample/Lattice/Lattice2D.cpp
index a7dee724f0bdc798213ad54486ec0b97d2347d97..d8f8c5fbd06c8b06cf5c1a19c6936ddaa9885639 100644
--- a/Sample/Lattice/Lattice2D.cpp
+++ b/Sample/Lattice/Lattice2D.cpp
@@ -62,86 +62,88 @@ void Lattice2D::setRotationEnabled(bool enabled) // TODO ASAP replace by generic
 }
 
 // ************************************************************************** //
-// class BasicLattice
+// class BasicLattice2D
 // ************************************************************************** //
 
-BasicLattice::BasicLattice(double length1, double length2, double angle, double xi)
+BasicLattice2D::BasicLattice2D(double length1, double length2, double angle, double xi)
     : Lattice2D(xi), m_length1(length1), m_length2(length2), m_angle(angle)
 {
     if (m_length1 <= 0.0 || m_length2 <= 0.0)
-        throw std::runtime_error("BasicLattice::BasicLattice() -> Error. Lattice length can't be "
-                                 "negative or zero.");
+        throw std::runtime_error(
+            "BasicLattice2D::BasicLattice2D() -> Error. Lattice length can't be "
+            "negative or zero.");
 
-    setName("BasicLattice");
+    setName("BasicLattice2D");
     registerParameter("LatticeLength1", &m_length1).setUnit("nm").setPositive();
     registerParameter("LatticeLength2", &m_length2).setUnit("nm").setPositive();
     registerParameter("Alpha", &m_angle).setUnit("rad");
 }
 
-BasicLattice* BasicLattice::clone() const
+BasicLattice2D* BasicLattice2D::clone() const
 {
-    return new BasicLattice(m_length1, m_length2, m_angle, m_xi);
+    return new BasicLattice2D(m_length1, m_length2, m_angle, m_xi);
 }
 
-double BasicLattice::unitCellArea() const
+double BasicLattice2D::unitCellArea() const
 {
     return std::abs(m_length1 * m_length2 * std::sin(m_angle));
 }
 
 // ************************************************************************** //
-// class SquareLattice
+// class SquareLattice2D
 // ************************************************************************** //
 
-SquareLattice::SquareLattice(double length, double xi) : Lattice2D(xi), m_length(length)
+SquareLattice2D::SquareLattice2D(double length, double xi) : Lattice2D(xi), m_length(length)
 {
     if (m_length <= 0.0)
-        throw std::runtime_error("SquareLattice::SquareLattice() -> Error. Lattice length can't be "
-                                 "negative or zero.");
+        throw std::runtime_error(
+            "SquareLattice2D::SquareLattice2D() -> Error. Lattice length can't be "
+            "negative or zero.");
 
-    setName("SquareLattice");
+    setName("SquareLattice2D");
     registerParameter("LatticeLength", &m_length).setUnit("nm").setPositive();
 }
 
-SquareLattice* SquareLattice::clone() const
+SquareLattice2D* SquareLattice2D::clone() const
 {
-    return new SquareLattice(m_length, m_xi);
+    return new SquareLattice2D(m_length, m_xi);
 }
 
-double SquareLattice::latticeAngle() const
+double SquareLattice2D::latticeAngle() const
 {
     return M_PI / 2.0;
 }
 
-double SquareLattice::unitCellArea() const
+double SquareLattice2D::unitCellArea() const
 {
     return std::abs(m_length * m_length);
 }
 
 // ************************************************************************** //
-// class HexagonalLattice
+// class HexagonalLattice2D
 // ************************************************************************** //
 
-HexagonalLattice::HexagonalLattice(double length, double xi) : Lattice2D(xi), m_length(length)
+HexagonalLattice2D::HexagonalLattice2D(double length, double xi) : Lattice2D(xi), m_length(length)
 {
     if (m_length <= 0.0)
-        throw std::runtime_error("HexagonalLattice::HexagonalLattice() -> Error. "
+        throw std::runtime_error("HexagonalLattice2D::HexagonalLattice2D() -> Error. "
                                  "Lattice length can't be negative or zero.");
 
-    setName("HexagonalLattice");
+    setName("HexagonalLattice2D");
     registerParameter("LatticeLength", &m_length).setUnit("nm").setPositive();
 }
 
-HexagonalLattice* HexagonalLattice::clone() const
+HexagonalLattice2D* HexagonalLattice2D::clone() const
 {
-    return new HexagonalLattice(m_length, m_xi);
+    return new HexagonalLattice2D(m_length, m_xi);
 }
 
-double HexagonalLattice::latticeAngle() const
+double HexagonalLattice2D::latticeAngle() const
 {
     return M_TWOPI / 3.0;
 }
 
-double HexagonalLattice::unitCellArea() const
+double HexagonalLattice2D::unitCellArea() const
 {
     static const double sinval = std::sin(latticeAngle());
     return std::abs(m_length * m_length * sinval);
diff --git a/Sample/Lattice/Lattice2D.h b/Sample/Lattice/Lattice2D.h
index 3cb822c7a875e2ef876ec9e0897ca754f8c58254..f65f406978c0dd847fc130bf7e673e792fe5f18a 100644
--- a/Sample/Lattice/Lattice2D.h
+++ b/Sample/Lattice/Lattice2D.h
@@ -47,12 +47,12 @@ protected:
     double m_xi;
 };
 
-class BasicLattice : public Lattice2D
+class BasicLattice2D : public Lattice2D
 {
 public:
-    BasicLattice(double length1, double length2, double angle, double xi);
+    BasicLattice2D(double length1, double length2, double angle, double xi);
 
-    BasicLattice* clone() const;
+    BasicLattice2D* clone() const;
 
     void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
 
@@ -66,12 +66,12 @@ private:
     double m_angle;
 };
 
-class SquareLattice : public Lattice2D
+class SquareLattice2D : public Lattice2D
 {
 public:
-    SquareLattice(double length, double xi = 0.0);
+    SquareLattice2D(double length, double xi = 0.0);
 
-    SquareLattice* clone() const;
+    SquareLattice2D* clone() const;
 
     void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
 
@@ -84,12 +84,12 @@ private:
     double m_length;
 };
 
-class HexagonalLattice : public Lattice2D
+class HexagonalLattice2D : public Lattice2D
 {
 public:
-    HexagonalLattice(double length, double xi);
+    HexagonalLattice2D(double length, double xi);
 
-    HexagonalLattice* clone() const;
+    HexagonalLattice2D* clone() const;
 
     void accept(INodeVisitor* visitor) const final { visitor->visit(this); }
 
diff --git a/Sample/StandardSamples/BoxesSquareLatticeBuilder.cpp b/Sample/StandardSamples/BoxesSquareLatticeBuilder.cpp
index 10331c867b06ef015a4824ca2679f0f95f10c6cf..cd6beeb3924cbc05f82bcfba9a60524d63c1bca7 100644
--- a/Sample/StandardSamples/BoxesSquareLatticeBuilder.cpp
+++ b/Sample/StandardSamples/BoxesSquareLatticeBuilder.cpp
@@ -3,7 +3,7 @@
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
 //! @file      Sample/StandardSamples/BoxesSquareLatticeBuilder.cpp
-//! @brief     Implements class BoxesSquareLatticeBuilder.
+//! @brief     Implements class BoxesSquareLattice2DBuilder.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -22,7 +22,7 @@
 #include "Sample/Particle/Particle.h"
 #include "Sample/StandardSamples/ReferenceMaterials.h"
 
-MultiLayer* BoxesSquareLatticeBuilder::buildSample() const
+MultiLayer* BoxesSquareLattice2DBuilder::buildSample() const
 {
     const double length = 5 * Units::nm;
     const double height = 10 * Units::nm;
@@ -30,7 +30,7 @@ MultiLayer* BoxesSquareLatticeBuilder::buildSample() const
     Layer vacuum_layer(refMat::Vacuum);
     Layer substrate_layer(refMat::Substrate);
 
-    InterferenceFunction2DLattice iff(SquareLattice(8 * Units::nm, 0));
+    InterferenceFunction2DLattice iff(SquareLattice2D(8 * Units::nm, 0));
 
     FTDecayFunction2DCauchy pdf(100.0 * Units::nm, 100.0 * Units::nm, 0);
     iff.setDecayFunction(pdf);
diff --git a/Sample/StandardSamples/BoxesSquareLatticeBuilder.h b/Sample/StandardSamples/BoxesSquareLatticeBuilder.h
index c1698475bb3b6941ecec7fe048ce5a10797ac15c..9cffdc7b98b48294f94eb644a8490dfcd5eaff45 100644
--- a/Sample/StandardSamples/BoxesSquareLatticeBuilder.h
+++ b/Sample/StandardSamples/BoxesSquareLatticeBuilder.h
@@ -3,7 +3,7 @@
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
 //! @file      Sample/StandardSamples/BoxesSquareLatticeBuilder.h
-//! @brief     Defines class BoxesSquareLatticeBuilder.
+//! @brief     Defines class BoxesSquareLattice2DBuilder.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -20,7 +20,7 @@
 //! Builds sample: square boxes in a square lattice
 //! @ingroup standard_samples
 
-class BoxesSquareLatticeBuilder : public ISampleBuilder
+class BoxesSquareLattice2DBuilder : public ISampleBuilder
 {
 public:
     MultiLayer* buildSample() const;
diff --git a/Sample/StandardSamples/ParaCrystalBuilder.cpp b/Sample/StandardSamples/ParaCrystalBuilder.cpp
index f3ce78de17d96fa8708b01acf2d5006431a08370..ab62ca3084437249d16c60cfc29165ec9a0574e5 100644
--- a/Sample/StandardSamples/ParaCrystalBuilder.cpp
+++ b/Sample/StandardSamples/ParaCrystalBuilder.cpp
@@ -71,7 +71,7 @@ MultiLayer* Basic2DParaCrystalBuilder::buildSample() const
     Layer substrate_layer(refMat::Substrate);
 
     InterferenceFunction2DParaCrystal iff(
-        BasicLattice(10.0 * Units::nm, 20.0 * Units::nm, 30.0 * Units::deg, 45.0 * Units::deg),
+        BasicLattice2D(10.0 * Units::nm, 20.0 * Units::nm, 30.0 * Units::deg, 45.0 * Units::deg),
         1000.0 * Units::nm, 20.0 * Units::micrometer, 40.0 * Units::micrometer);
 
     iff.setProbabilityDistributions(*m_pdf1, *m_pdf2);
@@ -118,7 +118,7 @@ MultiLayer* HexParaCrystalBuilder::buildSample() const
     Layer vacuum_layer(refMat::Vacuum);
     Layer substrate_layer(refMat::Substrate);
 
-    InterferenceFunction2DParaCrystal iff(HexagonalLattice(m_peak_distance, 0.0), m_corr_length,
+    InterferenceFunction2DParaCrystal iff(HexagonalLattice2D(m_peak_distance, 0.0), m_corr_length,
                                           m_domain_size_1, m_domain_size_2);
     iff.setIntegrationOverXi(true);
     FTDistribution2DCauchy pdf(1.0 * Units::nm, 1.0 * Units::nm, 0);
@@ -147,7 +147,7 @@ MultiLayer* RectParaCrystalBuilder::buildSample() const
     Layer vacuum_layer(refMat::Vacuum);
     Layer substrate_layer(refMat::Substrate);
 
-    InterferenceFunction2DParaCrystal iff(SquareLattice(10 * Units::nm), 0, 0, 0);
+    InterferenceFunction2DParaCrystal iff(SquareLattice2D(10 * Units::nm), 0, 0, 0);
     iff.setIntegrationOverXi(true);
     iff.setDomainSizes(20.0 * Units::micrometer, 20.0 * Units::micrometer);
     FTDistribution2DCauchy pdf1(0.5 * Units::nm, 2.0 * Units::nm, 0);
diff --git a/Sample/StandardSamples/ParticleCompositionBuilder.cpp b/Sample/StandardSamples/ParticleCompositionBuilder.cpp
index 770fd27422b33c0a1c26a7bb45fa413941acac3b..0ff683894866cdf649273daef2ed86409537aad1 100644
--- a/Sample/StandardSamples/ParticleCompositionBuilder.cpp
+++ b/Sample/StandardSamples/ParticleCompositionBuilder.cpp
@@ -43,7 +43,7 @@ MultiLayer* ParticleCompositionBuilder::buildSample() const
     basis.addParticles(sphere, positions);
     particle_layout.addParticle(basis);
 
-    InterferenceFunction2DLattice iff(HexagonalLattice(radius * 2.0, 0));
+    InterferenceFunction2DLattice iff(HexagonalLattice2D(radius * 2.0, 0));
     FTDecayFunction2DCauchy pdf(10 * Units::nm, 10 * Units::nm, 0);
     iff.setDecayFunction(pdf);
 
diff --git a/Sample/StandardSamples/SampleBuilderFactory.cpp b/Sample/StandardSamples/SampleBuilderFactory.cpp
index 182417f8f7c4b9ad84cec9c196cdf33766f0ec65..a05b45d6535a274422d55b12a4a00f077beaabea 100644
--- a/Sample/StandardSamples/SampleBuilderFactory.cpp
+++ b/Sample/StandardSamples/SampleBuilderFactory.cpp
@@ -74,13 +74,13 @@ SampleBuilderFactory::SampleBuilderFactory()
 
     registerItem("Basic2DLatticeBuilder", create_new<Basic2DLatticeBuilder>);
 
-    registerItem("SquareLatticeBuilder", create_new<SquareLatticeBuilder>);
+    registerItem("SquareLattice2DBuilder", create_new<SquareLattice2DBuilder>);
 
-    registerItem("CenteredSquareLatticeBuilder", create_new<CenteredSquareLatticeBuilder>);
+    registerItem("CenteredSquareLattice2DBuilder", create_new<CenteredSquareLattice2DBuilder>);
 
-    registerItem("RotatedSquareLatticeBuilder", create_new<RotatedSquareLatticeBuilder>);
+    registerItem("RotatedSquareLattice2DBuilder", create_new<RotatedSquareLattice2DBuilder>);
 
-    registerItem("FiniteSquareLatticeBuilder", create_new<FiniteSquareLatticeBuilder>);
+    registerItem("FiniteSquareLattice2DBuilder", create_new<FiniteSquareLattice2DBuilder>);
 
     registerItem("SuperLatticeBuilder", create_new<SuperLatticeBuilder>);
 
@@ -165,7 +165,7 @@ SampleBuilderFactory::SampleBuilderFactory()
 
     registerItem("LayersWithAbsorptionBySLDBuilder", create_new<LayersWithAbsorptionBySLDBuilder>);
 
-    registerItem("BoxesSquareLatticeBuilder", create_new<BoxesSquareLatticeBuilder>);
+    registerItem("BoxesSquareLattice2DBuilder", create_new<BoxesSquareLattice2DBuilder>);
 
     registerItem("RotatedCylindersBuilder", create_new<RotatedCylindersBuilder>);
 
diff --git a/Sample/StandardSamples/TwoDimLatticeBuilder.cpp b/Sample/StandardSamples/TwoDimLatticeBuilder.cpp
index feb9207a5cac884c9fc96e4ee525c116579539a9..52cc9c4aa7b464b7b7735e29ce74eaf7fb1520da 100644
--- a/Sample/StandardSamples/TwoDimLatticeBuilder.cpp
+++ b/Sample/StandardSamples/TwoDimLatticeBuilder.cpp
@@ -19,7 +19,6 @@
 #include "Sample/Aggregate/InterferenceFunctionFinite2DLattice.h"
 #include "Sample/Aggregate/ParticleLayout.h"
 #include "Sample/HardParticle/FormFactorCylinder.h"
-#include "Sample/Lattice/Lattice2D.h"
 #include "Sample/Multilayer/Layer.h"
 #include "Sample/Multilayer/MultiLayer.h"
 #include "Sample/Particle/Particle.h"
@@ -32,7 +31,7 @@ MultiLayer* Basic2DLatticeBuilder::buildSample() const
     Layer substrate_layer(refMat::Substrate);
 
     InterferenceFunction2DLattice iff(
-        BasicLattice(5.0 * Units::nm, 10.0 * Units::nm, 30.0 * Units::deg, 10.0 * Units::deg));
+        BasicLattice2D(5.0 * Units::nm, 10.0 * Units::nm, 30.0 * Units::deg, 10.0 * Units::deg));
 
     FTDecayFunction2DCauchy pdf(300.0 * Units::nm / 2.0 / M_PI, 100.0 * Units::nm / 2.0 / M_PI, 0);
     iff.setDecayFunction(pdf);
@@ -56,12 +55,12 @@ MultiLayer* Basic2DLatticeBuilder::buildSample() const
 // -----------------------------------------------------------------------------
 // lattice #1:
 // -----------------------------------------------------------------------------
-MultiLayer* SquareLatticeBuilder::buildSample() const
+MultiLayer* SquareLattice2DBuilder::buildSample() const
 {
     Layer vacuum_layer(refMat::Vacuum);
     Layer substrate_layer(refMat::Substrate);
 
-    InterferenceFunction2DLattice iff(SquareLattice(10.0 * Units::nm, 0));
+    InterferenceFunction2DLattice iff(SquareLattice2D(10.0 * Units::nm, 0));
     FTDecayFunction2DCauchy pdf(300.0 * Units::nm / 2.0 / M_PI, 100.0 * Units::nm / 2.0 / M_PI, 0);
     iff.setDecayFunction(pdf);
 
@@ -84,13 +83,13 @@ MultiLayer* SquareLatticeBuilder::buildSample() const
 // -----------------------------------------------------------------------------
 // lattice #2: centered
 // -----------------------------------------------------------------------------
-MultiLayer* CenteredSquareLatticeBuilder::buildSample() const
+MultiLayer* CenteredSquareLattice2DBuilder::buildSample() const
 {
     Layer vacuum_layer(refMat::Vacuum);
     Layer substrate_layer(refMat::Substrate);
 
     InterferenceFunction2DLattice interference_function(
-        BasicLattice(10.0 * Units::nm, 10.0 * Units::nm, M_PI / 2.0, 0));
+        BasicLattice2D(10.0 * Units::nm, 10.0 * Units::nm, M_PI / 2.0, 0));
     FTDecayFunction2DCauchy pdf(300.0 * Units::nm / 2.0 / M_PI, 100.0 * Units::nm / 2.0 / M_PI, 0);
     interference_function.setDecayFunction(pdf);
 
@@ -118,12 +117,12 @@ MultiLayer* CenteredSquareLatticeBuilder::buildSample() const
 // -----------------------------------------------------------------------------
 // lattice #3: rotated
 // -----------------------------------------------------------------------------
-MultiLayer* RotatedSquareLatticeBuilder::buildSample() const
+MultiLayer* RotatedSquareLattice2DBuilder::buildSample() const
 {
     Layer vacuum_layer(refMat::Vacuum);
     Layer substrate_layer(refMat::Substrate);
 
-    InterferenceFunction2DLattice iff(SquareLattice(10.0 * Units::nm, 30.0 * Units::deg));
+    InterferenceFunction2DLattice iff(SquareLattice2D(10.0 * Units::nm, 30.0 * Units::deg));
     FTDecayFunction2DCauchy pdf(300.0 * Units::nm / 2.0 / M_PI, 100.0 * Units::nm / 2.0 / M_PI,
                                 30.0 * Units::deg);
     iff.setDecayFunction(pdf);
@@ -148,12 +147,12 @@ MultiLayer* RotatedSquareLatticeBuilder::buildSample() const
 // -----------------------------------------------------------------------------
 // lattice #4: finite square
 // -----------------------------------------------------------------------------
-MultiLayer* FiniteSquareLatticeBuilder::buildSample() const
+MultiLayer* FiniteSquareLattice2DBuilder::buildSample() const
 {
     Layer vacuum_layer(refMat::Vacuum);
     Layer substrate_layer(refMat::Substrate);
 
-    InterferenceFunctionFinite2DLattice iff(SquareLattice(10.0 * Units::nm, 0.0), 40, 40);
+    InterferenceFunctionFinite2DLattice iff(SquareLattice2D(10.0 * Units::nm, 0.0), 40, 40);
     iff.setPositionVariance(1.0);
 
     // particles
@@ -180,8 +179,9 @@ MultiLayer* SuperLatticeBuilder::buildSample() const
     Layer vacuum_layer(refMat::Vacuum);
     Layer substrate_layer(refMat::Substrate);
 
-    InterferenceFunction2DSuperLattice iff(SquareLattice(200.0 * Units::nm, 0.0), 40, 40);
-    InterferenceFunctionFinite2DLattice substructure(SquareLattice(10.0 * Units::nm, 0.0), 10, 10);
+    InterferenceFunction2DSuperLattice iff(SquareLattice2D(200.0 * Units::nm, 0.0), 40, 40);
+    InterferenceFunctionFinite2DLattice substructure(SquareLattice2D(10.0 * Units::nm, 0.0), 10,
+                                                     10);
     iff.setSubstructureIFF(substructure);
     iff.setPositionVariance(1.0);
 
diff --git a/Sample/StandardSamples/TwoDimLatticeBuilder.h b/Sample/StandardSamples/TwoDimLatticeBuilder.h
index 78e08b943ce7b2547b19c50a740b3ae81eb463c7..4423a9f3d7a601b9ca6be989a9caeed6a0afeed9 100644
--- a/Sample/StandardSamples/TwoDimLatticeBuilder.h
+++ b/Sample/StandardSamples/TwoDimLatticeBuilder.h
@@ -30,17 +30,17 @@ public:
 //! Builds sample: 2D lattice with different disorder (IsGISAXS example #6).
 //! @ingroup standard_samples
 
-class SquareLatticeBuilder : public ISampleBuilder
+class SquareLattice2DBuilder : public ISampleBuilder
 {
 public:
-    SquareLatticeBuilder() {}
+    SquareLattice2DBuilder() {}
     MultiLayer* buildSample() const;
 };
 
 //! Builds sample: 2D lattice with different disorder (IsGISAXS example #6).
 //! @ingroup standard_samples
 
-class CenteredSquareLatticeBuilder : public ISampleBuilder
+class CenteredSquareLattice2DBuilder : public ISampleBuilder
 {
 public:
     MultiLayer* buildSample() const;
@@ -49,7 +49,7 @@ public:
 //! Builds sample: 2D lattice with different disorder (IsGISAXS example #6).
 //! @ingroup standard_samples
 
-class RotatedSquareLatticeBuilder : public ISampleBuilder
+class RotatedSquareLattice2DBuilder : public ISampleBuilder
 {
 public:
     MultiLayer* buildSample() const;
@@ -58,7 +58,7 @@ public:
 //! Builds sample: 2D finite lattice with thermal disorder.
 //! @ingroup standard_samples
 
-class FiniteSquareLatticeBuilder : public ISampleBuilder
+class FiniteSquareLattice2DBuilder : public ISampleBuilder
 {
 public:
     MultiLayer* buildSample() const;
diff --git a/Tests/Functional/GUI/Translate/TranslationTests.cpp b/Tests/Functional/GUI/Translate/TranslationTests.cpp
index e996725b9003f912bb46062ea85645076b45c948..467968dece551fcc54a42f1f8a34090cf5337c01 100644
--- a/Tests/Functional/GUI/Translate/TranslationTests.cpp
+++ b/Tests/Functional/GUI/Translate/TranslationTests.cpp
@@ -54,9 +54,9 @@ TEST_F(Translate, Roughness)
     EXPECT_TRUE(run("BasicGISAS", "MultiLayerWithRoughnessBuilder"));
 }
 
-TEST_F(Translate, SquareLattice)
+TEST_F(Translate, SquareLattice2D)
 {
-    EXPECT_TRUE(run("BasicGISAS", "SquareLatticeBuilder"));
+    EXPECT_TRUE(run("BasicGISAS", "SquareLattice2DBuilder"));
 }
 
 TEST_F(Translate, Rotation)
diff --git a/Tests/Functional/Python/PyCore/mesocrystal1.py b/Tests/Functional/Python/PyCore/mesocrystal1.py
index 4da5e4201652ef3d6011562ade02dc9f352dddbf..484bee4064e93f63782db68c8419e808dd27e894 100644
--- a/Tests/Functional/Python/PyCore/mesocrystal1.py
+++ b/Tests/Functional/Python/PyCore/mesocrystal1.py
@@ -117,7 +117,7 @@ class MySampleBuilder(ISampleBuilder):
     # create lattice
     # -------------------------------------------------------------------------
     def createLattice(self, stacking_radius_a, stacking_radius_c):
-        result = createHexagonalLattice(stacking_radius_a*2.0, stacking_radius_c*2.0*2.3)
+        result = HexagonalLattice(stacking_radius_a*2.0, stacking_radius_c*2.0*2.3)
         result.setSelectionRule(SimpleSelectionRule(-1, 1, 1, 3))
         return result
 
diff --git a/Tests/Functional/Std/StandardTests.h b/Tests/Functional/Std/StandardTests.h
index a144c55fcaeaab9a02089b20a8da7643361e310e..b03d1c3eae7d465e87ac65653992b328adbde611 100644
--- a/Tests/Functional/Std/StandardTests.h
+++ b/Tests/Functional/Std/StandardTests.h
@@ -86,24 +86,25 @@ TEST_F(Std, MultiLayerWithRoughness)
         run("MultiLayerWithRoughness", "MiniGISAS", "MultiLayerWithRoughnessBuilder", 2e-10));
 }
 
-TEST_F(Std, SquareLattice)
+TEST_F(Std, SquareLattice2D)
 {
-    EXPECT_TRUE(run("SquareLattice", "MiniGISAS", "SquareLatticeBuilder", 2e-10));
+    EXPECT_TRUE(run("SquareLattice2D", "MiniGISAS", "SquareLattice2DBuilder", 2e-10));
 }
 
-TEST_F(Std, CenteredSquareLattice)
+TEST_F(Std, CenteredSquareLattice2D)
 {
-    EXPECT_TRUE(run("CenteredSquareLattice", "MiniGISAS", "CenteredSquareLatticeBuilder", 2e-10));
+    EXPECT_TRUE(
+        run("CenteredSquareLattice2D", "MiniGISAS", "CenteredSquareLattice2DBuilder", 2e-10));
 }
 
-TEST_F(Std, RotatedSquareLattice)
+TEST_F(Std, RotatedSquareLattice2D)
 {
-    EXPECT_TRUE(run("RotatedSquareLattice", "MiniGISAS", "RotatedSquareLatticeBuilder", 2e-10));
+    EXPECT_TRUE(run("RotatedSquareLattice2D", "MiniGISAS", "RotatedSquareLattice2DBuilder", 2e-10));
 }
 
-TEST_F(Std, FiniteSquareLattice)
+TEST_F(Std, FiniteSquareLattice2D)
 {
-    EXPECT_TRUE(run("FiniteSquareLattice", "MiniGISAS", "FiniteSquareLatticeBuilder", 2e-10));
+    EXPECT_TRUE(run("FiniteSquareLattice2D", "MiniGISAS", "FiniteSquareLattice2DBuilder", 2e-10));
 }
 
 TEST_F(Std, RotatedPyramids)
@@ -361,7 +362,8 @@ TEST_F(Std, RectDetWithRoi)
 
 TEST_F(Std, BoxesWithSpecular)
 {
-    EXPECT_TRUE(run("BoxesWithSpecular", "MiniGISASSpecular", "BoxesSquareLatticeBuilder", 1e-10));
+    EXPECT_TRUE(
+        run("BoxesWithSpecular", "MiniGISASSpecular", "BoxesSquareLattice2DBuilder", 1e-10));
 }
 
 TEST_F(Std, RotatedCylinder)
diff --git a/Tests/Performance/Core/Mesocrystal.cpp b/Tests/Performance/Core/Mesocrystal.cpp
index 4cf83ed8fabb612da93a1f3d2f822eda4139a605..7b0a456799f35c73168ceee3ab205081b35fd47b 100644
--- a/Tests/Performance/Core/Mesocrystal.cpp
+++ b/Tests/Performance/Core/Mesocrystal.cpp
@@ -55,7 +55,7 @@ std::unique_ptr<RectangularDetector> create_detector()
 
 Lattice3D createLattice(double a, double c)
 {
-    Lattice3D result = bake::createHexagonalLattice(a, c);
+    Lattice3D result = bake::HexagonalLattice(a, c);
     result.setSelectionRule(SimpleSelectionRule(-1, 1, 1, 3));
     return result;
 }
diff --git a/Tests/Performance/Core/ThreadingComponents.cpp b/Tests/Performance/Core/ThreadingComponents.cpp
index 1eb550587e484fa6187dde1f005721547f8366da..6e7023589d01055cfa14fc4830c89687020bb2ba 100644
--- a/Tests/Performance/Core/ThreadingComponents.cpp
+++ b/Tests/Performance/Core/ThreadingComponents.cpp
@@ -50,8 +50,8 @@ std::unique_ptr<MultiLayer> createSampleSpheresDistribution(int nspheres)
                                       RealLimits::limited(5.0 * Units::nm, 15.0 * Units::nm));
     ParticleDistribution particleDistribution_1(particle_1, par_distr_1);
 
-    InterferenceFunction2DLattice interference_1(10.0 * Units::nm, 10.0 * Units::nm,
-                                                 90.0 * Units::deg, 0.0 * Units::deg);
+    InterferenceFunction2DLattice interference_1(
+        BasicLattice2D(10.0 * Units::nm, 10.0 * Units::nm, 90.0 * Units::deg, 0.0 * Units::deg));
     FTDecayFunction2DCauchy interference_1_pdf(47.7464829276 * Units::nm, 15.9154943092 * Units::nm,
                                                0.0 * Units::deg);
     interference_1.setDecayFunction(interference_1_pdf);
diff --git a/Tests/Performance/Python/test_performance.py b/Tests/Performance/Python/test_performance.py
index 2dbfcc039441c175c45b4e3ba5d35fe4bb1dfb80..05182c9d12bdca27c5457fbac02c12964613de39 100755
--- a/Tests/Performance/Python/test_performance.py
+++ b/Tests/Performance/Python/test_performance.py
@@ -201,7 +201,7 @@ class PerformanceTests:
         self.add("CylindersInDWBA",    "MaxiGISAS",    "CylindersInDWBABuilder", 10)
         self.add("RotatedPyramids",    "MaxiGISAS",    "RotatedPyramidsBuilder", 10)
         self.add("CoreShell",          "MaxiGISAS",    "CoreShellParticleBuilder", 10)
-        self.add("SquareLattice",      "MaxiGISAS",    "SquareLatticeBuilder", 10)
+        self.add("SquareLattice2D",      "MaxiGISAS",    "SquareLattice2DBuilder", 10)
         self.add("RadialParaCrystal",  "MaxiGISAS",    "RadialParaCrystalBuilder", 10)
         self.add("HexParaCrystal",     "BasicGISAS",   "HexParaCrystalBuilder", 1)
         self.add("SSCA",               "MaxiGISAS",    "SizeDistributionSSCAModelBuilder", 10)
diff --git a/Tests/ReferenceData/Std/CenteredSquareLattice.int.gz b/Tests/ReferenceData/Std/CenteredSquareLattice2D.int.gz
similarity index 100%
rename from Tests/ReferenceData/Std/CenteredSquareLattice.int.gz
rename to Tests/ReferenceData/Std/CenteredSquareLattice2D.int.gz
diff --git a/Tests/ReferenceData/Std/FiniteSquareLattice.int.gz b/Tests/ReferenceData/Std/FiniteSquareLattice2D.int.gz
similarity index 100%
rename from Tests/ReferenceData/Std/FiniteSquareLattice.int.gz
rename to Tests/ReferenceData/Std/FiniteSquareLattice2D.int.gz
diff --git a/Tests/ReferenceData/Std/RotatedSquareLattice.int.gz b/Tests/ReferenceData/Std/RotatedSquareLattice2D.int.gz
similarity index 100%
rename from Tests/ReferenceData/Std/RotatedSquareLattice.int.gz
rename to Tests/ReferenceData/Std/RotatedSquareLattice2D.int.gz
diff --git a/Tests/ReferenceData/Std/SquareLattice.int.gz b/Tests/ReferenceData/Std/SquareLattice2D.int.gz
similarity index 100%
rename from Tests/ReferenceData/Std/SquareLattice.int.gz
rename to Tests/ReferenceData/Std/SquareLattice2D.int.gz
diff --git a/Tests/UnitTests/Core/Sample/CrystalTest.cpp b/Tests/UnitTests/Core/Sample/CrystalTest.cpp
index b51b5850086d87266606bbf6eb974aa653222334..586ff6db1cd96f31d1171f652cef4147b70c894f 100644
--- a/Tests/UnitTests/Core/Sample/CrystalTest.cpp
+++ b/Tests/UnitTests/Core/Sample/CrystalTest.cpp
@@ -9,7 +9,7 @@ class CrystalTest : public ::testing::Test
 
 TEST_F(CrystalTest, getChildren)
 {
-    Lattice3D lattice = bake::createHexagonalLattice(1.0, 2.0);
+    Lattice3D lattice = bake::HexagonalLattice(1.0, 2.0);
     ParticleComposition composition;
     Crystal crystal(composition, lattice);
 
diff --git a/Tests/UnitTests/Core/Sample/Lattice2DTest.cpp b/Tests/UnitTests/Core/Sample/Lattice2DTest.cpp
index 1da1c24b164685eb64b316aebbbf7bb94963b6a8..37a0a14bd16dbbed45362d2008e45d13b999d4e3 100644
--- a/Tests/UnitTests/Core/Sample/Lattice2DTest.cpp
+++ b/Tests/UnitTests/Core/Sample/Lattice2DTest.cpp
@@ -8,7 +8,7 @@ class Lattice2DTest : public ::testing::Test
 TEST_F(Lattice2DTest, basicLattice)
 {
     const double length1(1.0), length2(2.0), angle(3.0), rotangle(0.7);
-    BasicLattice lattice(length1, length2, angle, rotangle);
+    BasicLattice2D lattice(length1, length2, angle, rotangle);
     EXPECT_EQ(lattice.length1(), length1);
     EXPECT_EQ(lattice.length2(), length2);
     EXPECT_EQ(lattice.latticeAngle(), angle);
@@ -29,7 +29,7 @@ TEST_F(Lattice2DTest, basicLattice)
 TEST_F(Lattice2DTest, basicLatticeClone)
 {
     const double length1(1.0), length2(2.0), angle(3.0), xi(4.0);
-    BasicLattice lattice(length1, length2, angle, xi);
+    BasicLattice2D lattice(length1, length2, angle, xi);
 
     std::unique_ptr<Lattice2D> clone(lattice.clone());
     EXPECT_EQ(clone->length1(), length1);
@@ -41,7 +41,7 @@ TEST_F(Lattice2DTest, basicLatticeClone)
 TEST_F(Lattice2DTest, squareLatticeClone)
 {
     const double length(1.0), xi(4.0);
-    SquareLattice lattice(length, xi);
+    SquareLattice2D lattice(length, xi);
 
     std::unique_ptr<Lattice2D> clone(lattice.clone());
     EXPECT_EQ(clone->length1(), length);
@@ -61,7 +61,7 @@ TEST_F(Lattice2DTest, squareLatticeClone)
 TEST_F(Lattice2DTest, hexagonalLatticeClone)
 {
     const double length(1.0), xi(4.0);
-    HexagonalLattice lattice(length, xi);
+    HexagonalLattice2D lattice(length, xi);
 
     std::unique_ptr<Lattice2D> clone(lattice.clone());
     EXPECT_EQ(clone->length1(), length);
@@ -91,7 +91,7 @@ TEST_F(Lattice2DTest, onChange)
 
     Parent parent;
     const double length1(1.0), length2(2.0), angle(3.0), xi(4.0);
-    BasicLattice lattice(length1, length2, angle, xi);
+    BasicLattice2D lattice(length1, length2, angle, xi);
 
     parent.registerChild(&lattice);
     EXPECT_FALSE(parent.m_changed);
diff --git a/Tests/UnitTests/Core/Sample/LatticeTest.cpp b/Tests/UnitTests/Core/Sample/LatticeTest.cpp
index b381662e7c16c27772747cd70337bc31ee183245..361fc2a1954eb8bcd65b9f81b158de2255b3e961 100644
--- a/Tests/UnitTests/Core/Sample/LatticeTest.cpp
+++ b/Tests/UnitTests/Core/Sample/LatticeTest.cpp
@@ -134,7 +134,7 @@ TEST_F(LatticeTest, reciprocalLatticeVectorsWithinRadiusTest)
 TEST_F(LatticeTest, FCCLatticeTest)
 {
     // creates FCC lattice onto a new Lattice instance l1
-    Lattice3D l1 = bake::createFCCLattice(1);
+    Lattice3D l1 = bake::FCCLattice(1);
 
     kvector_t fcc1(0, 0.5, 0.5), fcc2(0.5, 0, 0.5), fcc3(0.5, 0.5, 0);
 
@@ -144,9 +144,9 @@ TEST_F(LatticeTest, FCCLatticeTest)
 }
 
 // tests hexagonal lattice creation
-TEST_F(LatticeTest, HexagonalLatticeTest)
+TEST_F(LatticeTest, HexagonalLattice2DTest)
 {
-    Lattice3D l1 = bake::createHexagonalLattice(1, 4);
+    Lattice3D l1 = bake::HexagonalLattice(1, 4);
 
     kvector_t tri1(1, 0.0, 0.0);
     kvector_t tri2(-1 / 2.0, std::sqrt(3.0) * 1 / 2.0, 0);
diff --git a/Tests/UnitTests/Core/Sample/MesoCrystalTest.cpp b/Tests/UnitTests/Core/Sample/MesoCrystalTest.cpp
index 3b9b73e6329a8a7af06a7a1c96068bf99ed08894..601e1e108a70afa93179c6c81df4878933529fd6 100644
--- a/Tests/UnitTests/Core/Sample/MesoCrystalTest.cpp
+++ b/Tests/UnitTests/Core/Sample/MesoCrystalTest.cpp
@@ -12,7 +12,7 @@ class MesoCrystalTest : public ::testing::Test
 
 TEST_F(MesoCrystalTest, getChildren)
 {
-    Lattice3D lattice = bake::createHexagonalLattice(1.0, 2.0);
+    Lattice3D lattice = bake::HexagonalLattice(1.0, 2.0);
     ParticleComposition composition;
     Crystal crystal(composition, lattice);
     MesoCrystal meso(crystal, FormFactorFullSphere(1.0));
diff --git a/Tests/UnitTests/Core/Sample/MultilayerAveragingTest.cpp b/Tests/UnitTests/Core/Sample/MultilayerAveragingTest.cpp
index a47c90aa25e761d5cf7ccd5d0bc6f40a74e50dc1..90661ecbec8729755c3d79e2b6ff2103b0312462 100644
--- a/Tests/UnitTests/Core/Sample/MultilayerAveragingTest.cpp
+++ b/Tests/UnitTests/Core/Sample/MultilayerAveragingTest.cpp
@@ -28,8 +28,8 @@ TEST_F(MultilayerAveragingTest, AverageMultilayer)
     Particle particle(stone, cylinder_ff);
 
     // interferences
-    InterferenceFunction2DLattice interf_1(10.0, 10.0, 120.0, 0.0);
-    InterferenceFunction2DLattice interf_2(10.0, 10.0, 120.0, 0.0);
+    InterferenceFunction2DLattice interf_1(BasicLattice2D(10.0, 10.0, 120.0, 0.0));
+    InterferenceFunction2DLattice interf_2(BasicLattice2D(10.0, 10.0, 120.0, 0.0));
 
     // layouts
     ParticleLayout layout_1;
diff --git a/Tests/UnitTests/GUI/TestParaCrystalItems.cpp b/Tests/UnitTests/GUI/TestParaCrystalItems.cpp
index c7f62a945364ed69a01057cea34a97a92a13605f..65b9195171979bded6d1b2d78b9c05d427252239 100644
--- a/Tests/UnitTests/GUI/TestParaCrystalItems.cpp
+++ b/Tests/UnitTests/GUI/TestParaCrystalItems.cpp
@@ -17,9 +17,9 @@ TEST_F(TestParaCrystalItems, test_Para2D_fromToDomain)
     double length1(10.0), length2(20.0), angle(45.0), xi(90.0);
     double damping_length(1000.0), domain_size1(50.0), domain_size2(100.0);
 
-    InterferenceFunction2DParaCrystal orig(length1, length2, angle * Units::deg, xi * Units::deg,
-                                           damping_length);
-    orig.setDomainSizes(domain_size1, domain_size2);
+    InterferenceFunction2DParaCrystal orig(
+        BasicLattice2D(length1, length2, angle * Units::deg, xi * Units::deg), damping_length,
+        domain_size1, domain_size2);
 
     double clength_x(1.0), clength_y(2.0), gamma(3.0);
     orig.setProbabilityDistributions(
@@ -41,10 +41,10 @@ TEST_F(TestParaCrystalItems, test_Para2D_fromToDomain)
               orig.integrationOverXi());
 
     SessionItem* latticeItem = item.getGroupItem(InterferenceFunction2DLatticeItem::P_LATTICE_TYPE);
-    EXPECT_EQ(latticeItem->modelType(), "BasicLattice");
-    EXPECT_EQ(latticeItem->getItemValue(BasicLatticeItem::P_LATTICE_LENGTH1).toDouble(), length1);
-    EXPECT_EQ(latticeItem->getItemValue(BasicLatticeItem::P_LATTICE_LENGTH2).toDouble(), length2);
-    EXPECT_EQ(latticeItem->getItemValue(BasicLatticeItem::P_LATTICE_ANGLE).toDouble(), angle);
+    EXPECT_EQ(latticeItem->modelType(), "BasicLattice2D");
+    EXPECT_EQ(latticeItem->getItemValue(BasicLattice2DItem::P_LATTICE_LENGTH1).toDouble(), length1);
+    EXPECT_EQ(latticeItem->getItemValue(BasicLattice2DItem::P_LATTICE_LENGTH2).toDouble(), length2);
+    EXPECT_EQ(latticeItem->getItemValue(BasicLattice2DItem::P_LATTICE_ANGLE).toDouble(), angle);
     EXPECT_EQ(latticeItem->getItemValue(Lattice2DItem::P_LATTICE_ROTATION_ANGLE).toDouble(), xi);
 
     SessionItem* pdfItem1 = item.getGroupItem(InterferenceFunction2DParaCrystalItem::P_PDF1);
diff --git a/Tests/UnitTests/GUI/TestParticleLayoutItem.h b/Tests/UnitTests/GUI/TestParticleLayoutItem.h
index 07e661c7f6163bca6f4c4df1942b7e6dec8448e7..6cc11f4041d13e881d17e913db9d6f5d77c14fb0 100644
--- a/Tests/UnitTests/GUI/TestParticleLayoutItem.h
+++ b/Tests/UnitTests/GUI/TestParticleLayoutItem.h
@@ -68,8 +68,8 @@ TEST_F(TestParticleLayoutItem, densityValue)
 
     auto& hexItem =
         interference->groupItem<Lattice2DItem>(InterferenceFunction2DLatticeItem::P_LATTICE_TYPE);
-    EXPECT_EQ(hexItem.modelType(), "HexagonalLattice");
-    double length = hexItem.getItemValue(HexagonalLatticeItem::P_LATTICE_LENGTH).toDouble();
+    EXPECT_EQ(hexItem.modelType(), "HexagonalLattice2D");
+    double length = hexItem.getItemValue(HexagonalLattice2DItem::P_LATTICE_LENGTH).toDouble();
     double expectedDensity = 1. / (length * length * std::sin(M_TWOPI / 3.0));
     EXPECT_DOUBLE_EQ(1.0 / hexItem.unitCellArea(), expectedDensity);
     EXPECT_DOUBLE_EQ(layout->getItemValue(ParticleLayoutItem::P_TOTAL_DENSITY).toDouble(),
@@ -77,18 +77,18 @@ TEST_F(TestParticleLayoutItem, densityValue)
 
     // changing hexagonal lattice length
     length = 100.0;
-    hexItem.setItemValue(HexagonalLatticeItem::P_LATTICE_LENGTH, length);
+    hexItem.setItemValue(HexagonalLattice2DItem::P_LATTICE_LENGTH, length);
     expectedDensity = 1. / (length * length * std::sin(M_TWOPI / 3.0));
     EXPECT_DOUBLE_EQ(layout->getItemValue(ParticleLayoutItem::P_TOTAL_DENSITY).toDouble(),
                      expectedDensity);
 
     // changing lattice type to square and checking new surface density
     interference->setGroupProperty(InterferenceFunction2DLatticeItem::P_LATTICE_TYPE,
-                                   "SquareLattice");
+                                   "SquareLattice2D");
     auto& squareItem =
         interference->groupItem<Lattice2DItem>(InterferenceFunction2DLatticeItem::P_LATTICE_TYPE);
-    EXPECT_EQ(squareItem.modelType(), "SquareLattice");
-    length = squareItem.getItemValue(SquareLatticeItem::P_LATTICE_LENGTH).toDouble();
+    EXPECT_EQ(squareItem.modelType(), "SquareLattice2D");
+    length = squareItem.getItemValue(SquareLattice2DItem::P_LATTICE_LENGTH).toDouble();
     expectedDensity = 1. / (length * length);
     EXPECT_DOUBLE_EQ(1.0 / squareItem.unitCellArea(), expectedDensity);
     EXPECT_DOUBLE_EQ(layout->getItemValue(ParticleLayoutItem::P_TOTAL_DENSITY).toDouble(),
@@ -96,7 +96,7 @@ TEST_F(TestParticleLayoutItem, densityValue)
 
     // changing square lattice length
     length = 200.0;
-    squareItem.setItemValue(SquareLatticeItem::P_LATTICE_LENGTH, length);
+    squareItem.setItemValue(SquareLattice2DItem::P_LATTICE_LENGTH, length);
     expectedDensity = 1. / (length * length);
     EXPECT_DOUBLE_EQ(layout->getItemValue(ParticleLayoutItem::P_TOTAL_DENSITY).toDouble(),
                      expectedDensity);
diff --git a/auto/Wrap/doxygenBase.i b/auto/Wrap/doxygenBase.i
index cd2956ee9006015f5a178be32b74cd2f67922ac9..cc0a38f05397b628bcd19a5ef16e9e13b3ec0744 100644
--- a/auto/Wrap/doxygenBase.i
+++ b/auto/Wrap/doxygenBase.i
@@ -937,7 +937,7 @@ Returns assigned  PolarizationHandler.
 %feature("docstring")  SimulationElement::getMeanKf "kvector_t SimulationElement::getMeanKf() const
 ";
 
-%feature("docstring")  SimulationElement::getMeanQ "kvector_t SimulationElement::getMeanQ() const
+%feature("docstring")  SimulationElement::meanQ "kvector_t SimulationElement::meanQ() const
 ";
 
 %feature("docstring")  SimulationElement::getQ "kvector_t SimulationElement::getQ(double x, double y) const
diff --git a/auto/Wrap/doxygenParam.i b/auto/Wrap/doxygenParam.i
index 1ec208aa17de078ba0de5f7e11c2b65bda4f258b..7ba27560eb5d6dfb6b4a260aec9ea4f5a64046df 100644
--- a/auto/Wrap/doxygenParam.i
+++ b/auto/Wrap/doxygenParam.i
@@ -484,7 +484,7 @@ C++ includes: INodeVisitor.h
 %feature("docstring")  INodeVisitor::~INodeVisitor "virtual INodeVisitor::~INodeVisitor()
 ";
 
-%feature("docstring")  INodeVisitor::visit "virtual void INodeVisitor::visit(const BasicLattice *)
+%feature("docstring")  INodeVisitor::visit "virtual void INodeVisitor::visit(const BasicLattice2D *)
 ";
 
 %feature("docstring")  INodeVisitor::visit "virtual void INodeVisitor::visit(const Beam *)
@@ -709,7 +709,7 @@ C++ includes: INodeVisitor.h
 %feature("docstring")  INodeVisitor::visit "virtual void INodeVisitor::visit(const GISASSimulation *)
 ";
 
-%feature("docstring")  INodeVisitor::visit "virtual void INodeVisitor::visit(const HexagonalLattice *)
+%feature("docstring")  INodeVisitor::visit "virtual void INodeVisitor::visit(const HexagonalLattice2D *)
 ";
 
 %feature("docstring")  INodeVisitor::visit "virtual void INodeVisitor::visit(const IAbstractParticle *)
@@ -850,7 +850,7 @@ C++ includes: INodeVisitor.h
 %feature("docstring")  INodeVisitor::visit "virtual void INodeVisitor::visit(const SphericalDetector *)
 ";
 
-%feature("docstring")  INodeVisitor::visit "virtual void INodeVisitor::visit(const SquareLattice *)
+%feature("docstring")  INodeVisitor::visit "virtual void INodeVisitor::visit(const SquareLattice2D *)
 ";
 
 %feature("docstring")  INodeVisitor::depth "int INodeVisitor::depth() const
diff --git a/auto/Wrap/doxygenSample.i b/auto/Wrap/doxygenSample.i
index 02230198739f71a2f7314ef1d951a37698589a29..f9a62be3c85d961613c90e913feb026b6718250d 100644
--- a/auto/Wrap/doxygenSample.i
+++ b/auto/Wrap/doxygenSample.i
@@ -139,28 +139,28 @@ C++ includes: ParaCrystalBuilder.h
 ";
 
 
-// File: classBasicLattice.xml
-%feature("docstring") BasicLattice "";
+// File: classBasicLattice2D.xml
+%feature("docstring") BasicLattice2D "";
 
-%feature("docstring")  BasicLattice::BasicLattice "BasicLattice::BasicLattice(double length1, double length2, double angle, double xi)
+%feature("docstring")  BasicLattice2D::BasicLattice2D "BasicLattice2D::BasicLattice2D(double length1, double length2, double angle, double xi)
 ";
 
-%feature("docstring")  BasicLattice::clone "BasicLattice * BasicLattice::clone() const
+%feature("docstring")  BasicLattice2D::clone "BasicLattice2D * BasicLattice2D::clone() const
 ";
 
-%feature("docstring")  BasicLattice::accept "void BasicLattice::accept(INodeVisitor *visitor) const final
+%feature("docstring")  BasicLattice2D::accept "void BasicLattice2D::accept(INodeVisitor *visitor) const final
 ";
 
-%feature("docstring")  BasicLattice::length1 "virtual double BasicLattice::length1() const
+%feature("docstring")  BasicLattice2D::length1 "virtual double BasicLattice2D::length1() const
 ";
 
-%feature("docstring")  BasicLattice::length2 "virtual double BasicLattice::length2() const
+%feature("docstring")  BasicLattice2D::length2 "virtual double BasicLattice2D::length2() const
 ";
 
-%feature("docstring")  BasicLattice::latticeAngle "virtual double BasicLattice::latticeAngle() const
+%feature("docstring")  BasicLattice2D::latticeAngle "virtual double BasicLattice2D::latticeAngle() const
 ";
 
-%feature("docstring")  BasicLattice::unitCellArea "double BasicLattice::unitCellArea() const
+%feature("docstring")  BasicLattice2D::unitCellArea "double BasicLattice2D::unitCellArea() const
 ";
 
 
@@ -222,15 +222,15 @@ C++ includes: BoxCompositionBuilder.h
 ";
 
 
-// File: classBoxesSquareLatticeBuilder.xml
-%feature("docstring") BoxesSquareLatticeBuilder "
+// File: classBoxesSquareLattice2DBuilder.xml
+%feature("docstring") BoxesSquareLattice2DBuilder "
 
 Builds sample: square boxes in a square lattice
 
 C++ includes: BoxesSquareLatticeBuilder.h
 ";
 
-%feature("docstring")  BoxesSquareLatticeBuilder::buildSample "MultiLayer * BoxesSquareLatticeBuilder::buildSample() const
+%feature("docstring")  BoxesSquareLattice2DBuilder::buildSample "MultiLayer * BoxesSquareLattice2DBuilder::buildSample() const
 ";
 
 
@@ -246,15 +246,15 @@ C++ includes: BoxCompositionBuilder.h
 ";
 
 
-// File: classCenteredSquareLatticeBuilder.xml
-%feature("docstring") CenteredSquareLatticeBuilder "
+// File: classCenteredSquareLattice2DBuilder.xml
+%feature("docstring") CenteredSquareLattice2DBuilder "
 
 Builds sample: 2D lattice with different disorder (IsGISAXS example #6).
 
 C++ includes: TwoDimLatticeBuilder.h
 ";
 
-%feature("docstring")  CenteredSquareLatticeBuilder::buildSample "MultiLayer * CenteredSquareLatticeBuilder::buildSample() const
+%feature("docstring")  CenteredSquareLattice2DBuilder::buildSample "MultiLayer * CenteredSquareLattice2DBuilder::buildSample() const
 ";
 
 
@@ -436,7 +436,7 @@ Strategy class to compute the total scattering from a particle layout in the dec
 C++ includes: DecouplingApproximationStrategy.h
 ";
 
-%feature("docstring")  DecouplingApproximationStrategy::DecouplingApproximationStrategy "DecouplingApproximationStrategy::DecouplingApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff, SimulationOptions sim_params, bool polarized)
+%feature("docstring")  DecouplingApproximationStrategy::DecouplingApproximationStrategy "DecouplingApproximationStrategy::DecouplingApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *iff, SimulationOptions sim_params, bool polarized)
 ";
 
 
@@ -582,15 +582,15 @@ C++ includes: DecouplingApproximationStrategy.h
 ";
 
 
-// File: classFiniteSquareLatticeBuilder.xml
-%feature("docstring") FiniteSquareLatticeBuilder "
+// File: classFiniteSquareLattice2DBuilder.xml
+%feature("docstring") FiniteSquareLattice2DBuilder "
 
 Builds sample: 2D finite lattice with thermal disorder.
 
 C++ includes: TwoDimLatticeBuilder.h
 ";
 
-%feature("docstring")  FiniteSquareLatticeBuilder::buildSample "MultiLayer * FiniteSquareLatticeBuilder::buildSample() const
+%feature("docstring")  FiniteSquareLattice2DBuilder::buildSample "MultiLayer * FiniteSquareLattice2DBuilder::buildSample() const
 ";
 
 
@@ -2921,28 +2921,28 @@ C++ includes: PercusYevickBuilder.h
 // File: classMatrixFresnelMap_1_1HashKVector.xml
 
 
-// File: classHexagonalLattice.xml
-%feature("docstring") HexagonalLattice "";
+// File: classHexagonalLattice2D.xml
+%feature("docstring") HexagonalLattice2D "";
 
-%feature("docstring")  HexagonalLattice::HexagonalLattice "HexagonalLattice::HexagonalLattice(double length, double xi)
+%feature("docstring")  HexagonalLattice2D::HexagonalLattice2D "HexagonalLattice2D::HexagonalLattice2D(double length, double xi)
 ";
 
-%feature("docstring")  HexagonalLattice::clone "HexagonalLattice * HexagonalLattice::clone() const
+%feature("docstring")  HexagonalLattice2D::clone "HexagonalLattice2D * HexagonalLattice2D::clone() const
 ";
 
-%feature("docstring")  HexagonalLattice::accept "void HexagonalLattice::accept(INodeVisitor *visitor) const final
+%feature("docstring")  HexagonalLattice2D::accept "void HexagonalLattice2D::accept(INodeVisitor *visitor) const final
 ";
 
-%feature("docstring")  HexagonalLattice::length1 "virtual double HexagonalLattice::length1() const
+%feature("docstring")  HexagonalLattice2D::length1 "virtual double HexagonalLattice2D::length1() const
 ";
 
-%feature("docstring")  HexagonalLattice::length2 "virtual double HexagonalLattice::length2() const
+%feature("docstring")  HexagonalLattice2D::length2 "virtual double HexagonalLattice2D::length2() const
 ";
 
-%feature("docstring")  HexagonalLattice::latticeAngle "double HexagonalLattice::latticeAngle() const
+%feature("docstring")  HexagonalLattice2D::latticeAngle "double HexagonalLattice2D::latticeAngle() const
 ";
 
-%feature("docstring")  HexagonalLattice::unitCellArea "double HexagonalLattice::unitCellArea() const
+%feature("docstring")  HexagonalLattice2D::unitCellArea "double HexagonalLattice2D::unitCellArea() const
 ";
 
 
@@ -3602,7 +3602,7 @@ Instantiation of child classes takes place in LayoutStrategyBuilder::createStrat
 C++ includes: IInterferenceFunctionStrategy.h
 ";
 
-%feature("docstring")  IInterferenceFunctionStrategy::IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff, const SimulationOptions &sim_params, bool polarized)
+%feature("docstring")  IInterferenceFunctionStrategy::IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::IInterferenceFunctionStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const SimulationOptions &sim_params, bool polarized)
 ";
 
 %feature("docstring")  IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy "IInterferenceFunctionStrategy::~IInterferenceFunctionStrategy()
@@ -3740,26 +3740,6 @@ Interference function of a 2D lattice.
 C++ includes: InterferenceFunction2DLattice.h
 ";
 
-%feature("docstring")  InterferenceFunction2DLattice::InterferenceFunction2DLattice "InterferenceFunction2DLattice::InterferenceFunction2DLattice(double length_1, double length_2, double alpha, double xi)
-
-Constructor of two-dimensional interference function.
-
-Parameters:
------------
-
-length_1: 
-length of the first basis vector in nanometers
-
-length_2: 
-length of the second basis vector in nanometers
-
-alpha: 
-angle between the basis vectors in radians
-
-xi: 
-rotation of the lattice with respect to the x-axis (beam direction) in radians 
-";
-
 %feature("docstring")  InterferenceFunction2DLattice::InterferenceFunction2DLattice "InterferenceFunction2DLattice::InterferenceFunction2DLattice(const Lattice2D &lattice)
 ";
 
@@ -3817,29 +3797,6 @@ C++ includes: InterferenceFunction2DParaCrystal.h
 %feature("docstring")  InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal "InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(const Lattice2D &lattice, double damping_length, double domain_size_1, double domain_size_2)
 ";
 
-%feature("docstring")  InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal "InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(double length_1, double length_2, double alpha, double xi, double damping_length)
-
-Constructor of interference function of two-dimensional paracrystal.
-
-Parameters:
------------
-
-length_1: 
-length of first lattice vector in nanometers
-
-length_2: 
-length of second lattice vector in nanometers
-
-alpha: 
-angle between lattice vectors in radians
-
-xi: 
-rotation of lattice with respect to x-axis (beam direction) in radians
-
-damping_length: 
-the damping (coherence) length of the paracrystal in nanometers 
-";
-
 %feature("docstring")  InterferenceFunction2DParaCrystal::~InterferenceFunction2DParaCrystal "InterferenceFunction2DParaCrystal::~InterferenceFunction2DParaCrystal() final
 ";
 
@@ -4071,32 +4028,6 @@ N_2:
 number of lattice cells in the second lattice direction 
 ";
 
-%feature("docstring")  InterferenceFunctionFinite2DLattice::InterferenceFunctionFinite2DLattice "InterferenceFunctionFinite2DLattice::InterferenceFunctionFinite2DLattice(double length_1, double length_2, double alpha, double xi, unsigned N_1, unsigned N_2)
-
-Constructor of two-dimensional finite lattice interference function.
-
-Parameters:
------------
-
-length_1: 
-length of first lattice vector in nanometers
-
-length_2: 
-length of second lattice vector in nanometers
-
-alpha: 
-angle between lattice vectors in radians
-
-xi: 
-rotation of lattice with respect to x-axis (beam direction) in radians
-
-N_1: 
-number of lattice cells in the first lattice direction
-
-N_2: 
-number of lattice cells in the second lattice direction 
-";
-
 %feature("docstring")  InterferenceFunctionFinite2DLattice::~InterferenceFunctionFinite2DLattice "InterferenceFunctionFinite2DLattice::~InterferenceFunctionFinite2DLattice() final
 ";
 
@@ -6570,15 +6501,15 @@ C++ includes: ParticleDistributionsBuilder.h
 ";
 
 
-// File: classRotatedSquareLatticeBuilder.xml
-%feature("docstring") RotatedSquareLatticeBuilder "
+// File: classRotatedSquareLattice2DBuilder.xml
+%feature("docstring") RotatedSquareLattice2DBuilder "
 
 Builds sample: 2D lattice with different disorder (IsGISAXS example #6).
 
 C++ includes: TwoDimLatticeBuilder.h
 ";
 
-%feature("docstring")  RotatedSquareLatticeBuilder::buildSample "MultiLayer * RotatedSquareLatticeBuilder::buildSample() const
+%feature("docstring")  RotatedSquareLattice2DBuilder::buildSample "MultiLayer * RotatedSquareLattice2DBuilder::buildSample() const
 ";
 
 
@@ -7349,73 +7280,43 @@ C++ includes: ParticleDistributionsBuilder.h
 ";
 
 
-// File: classSquareLattice.xml
-%feature("docstring") SquareLattice "";
+// File: classSquareLattice2D.xml
+%feature("docstring") SquareLattice2D "";
 
-%feature("docstring")  SquareLattice::SquareLattice "SquareLattice::SquareLattice(double length, double xi=0.0)
+%feature("docstring")  SquareLattice2D::SquareLattice2D "SquareLattice2D::SquareLattice2D(double length, double xi=0.0)
 ";
 
-%feature("docstring")  SquareLattice::clone "SquareLattice * SquareLattice::clone() const
+%feature("docstring")  SquareLattice2D::clone "SquareLattice2D * SquareLattice2D::clone() const
 ";
 
-%feature("docstring")  SquareLattice::accept "void SquareLattice::accept(INodeVisitor *visitor) const final
+%feature("docstring")  SquareLattice2D::accept "void SquareLattice2D::accept(INodeVisitor *visitor) const final
 ";
 
-%feature("docstring")  SquareLattice::length1 "virtual double SquareLattice::length1() const
+%feature("docstring")  SquareLattice2D::length1 "virtual double SquareLattice2D::length1() const
 ";
 
-%feature("docstring")  SquareLattice::length2 "virtual double SquareLattice::length2() const
+%feature("docstring")  SquareLattice2D::length2 "virtual double SquareLattice2D::length2() const
 ";
 
-%feature("docstring")  SquareLattice::latticeAngle "double SquareLattice::latticeAngle() const
+%feature("docstring")  SquareLattice2D::latticeAngle "double SquareLattice2D::latticeAngle() const
 ";
 
-%feature("docstring")  SquareLattice::unitCellArea "double SquareLattice::unitCellArea() const
+%feature("docstring")  SquareLattice2D::unitCellArea "double SquareLattice2D::unitCellArea() const
 ";
 
 
-// File: classSquareLatticeBuilder.xml
-%feature("docstring") SquareLatticeBuilder "
+// File: classSquareLattice2DBuilder.xml
+%feature("docstring") SquareLattice2DBuilder "
 
 Builds sample: 2D lattice with different disorder (IsGISAXS example #6).
 
 C++ includes: TwoDimLatticeBuilder.h
 ";
 
-%feature("docstring")  SquareLatticeBuilder::SquareLatticeBuilder "SquareLatticeBuilder::SquareLatticeBuilder()
-";
-
-%feature("docstring")  SquareLatticeBuilder::buildSample "MultiLayer * SquareLatticeBuilder::buildSample() const
-";
-
-
-// File: classSSCAHelper.xml
-%feature("docstring") SSCAHelper "
-
-Helper class for  SSCApproximationStrategy, offering some methods, shared between the scalar and polarized scattering calculations
-
-C++ includes: SSCAHelper.h
-";
-
-%feature("docstring")  SSCAHelper::SSCAHelper "SSCAHelper::SSCAHelper(double kappa)
-";
-
-%feature("docstring")  SSCAHelper::init "void SSCAHelper::init(const std::vector< FormFactorCoherentSum > &ff_wrappers)
-";
-
-%feature("docstring")  SSCAHelper::getCharacteristicSizeCoupling "complex_t SSCAHelper::getCharacteristicSizeCoupling(double qp, const std::vector< FormFactorCoherentSum > &ff_wrappers) const
-";
-
-%feature("docstring")  SSCAHelper::getCharacteristicDistribution "complex_t SSCAHelper::getCharacteristicDistribution(double qp, const IInterferenceFunction *p_iff) const
-";
-
-%feature("docstring")  SSCAHelper::calculatePositionOffsetPhase "complex_t SSCAHelper::calculatePositionOffsetPhase(double qp, double radial_extension) const
+%feature("docstring")  SquareLattice2DBuilder::SquareLattice2DBuilder "SquareLattice2DBuilder::SquareLattice2DBuilder()
 ";
 
-%feature("docstring")  SSCAHelper::getMeanFormfactorNorm "complex_t SSCAHelper::getMeanFormfactorNorm(double qp, const std::vector< complex_t > &precomputed_ff, const std::vector< FormFactorCoherentSum > &ff_wrappers) const
-";
-
-%feature("docstring")  SSCAHelper::getMeanFormfactors "void SSCAHelper::getMeanFormfactors(double qp, Eigen::Matrix2cd &ff_orig, Eigen::Matrix2cd &ff_conj, const FormFactorPrecompute::matrixFFVector_t &precomputed_ff, const std::vector< FormFactorCoherentSum > &ff_wrappers) const
+%feature("docstring")  SquareLattice2DBuilder::buildSample "MultiLayer * SquareLattice2DBuilder::buildSample() const
 ";
 
 
@@ -7427,7 +7328,7 @@ Strategy class to compute the total scattering from a particle layout in the siz
 C++ includes: SSCApproximationStrategy.h
 ";
 
-%feature("docstring")  SSCApproximationStrategy::SSCApproximationStrategy "SSCApproximationStrategy::SSCApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const IInterferenceFunction *p_iff, SimulationOptions sim_params, bool polarized, double kappa)
+%feature("docstring")  SSCApproximationStrategy::SSCApproximationStrategy "SSCApproximationStrategy::SSCApproximationStrategy(const std::vector< FormFactorCoherentSum > &weighted_formfactors, const InterferenceFunctionRadialParaCrystal *iff, SimulationOptions sim_params, bool polarized, double kappa)
 ";
 
 
@@ -7619,13 +7520,16 @@ C++ includes: ZLimits.h
 // File: namespace_0d115.xml
 
 
-// File: namespace_0d141.xml
+// File: namespace_0d139.xml
+
 
+// File: namespace_0d143.xml
 
-// File: namespace_0d145.xml
 
+// File: namespace_0d147.xml
 
-// File: namespace_0d149.xml
+
+// File: namespace_0d157.xml
 
 
 // File: namespace_0d159.xml
@@ -7637,40 +7541,40 @@ C++ includes: ZLimits.h
 // File: namespace_0d161.xml
 
 
-// File: namespace_0d163.xml
+// File: namespace_0d171.xml
 
 
-// File: namespace_0d173.xml
+// File: namespace_0d192.xml
 
 
 // File: namespace_0d194.xml
 
 
-// File: namespace_0d196.xml
+// File: namespace_0d2.xml
 
 
-// File: namespace_0d2.xml
+// File: namespace_0d204.xml
 
 
-// File: namespace_0d206.xml
+// File: namespace_0d220.xml
 
 
 // File: namespace_0d222.xml
 
 
-// File: namespace_0d224.xml
+// File: namespace_0d229.xml
 
 
-// File: namespace_0d231.xml
+// File: namespace_0d247.xml
 
 
-// File: namespace_0d249.xml
+// File: namespace_0d25.xml
 
 
-// File: namespace_0d25.xml
+// File: namespace_0d255.xml
 
 
-// File: namespace_0d257.xml
+// File: namespace_0d265.xml
 
 
 // File: namespace_0d267.xml
@@ -7685,7 +7589,7 @@ C++ includes: ZLimits.h
 // File: namespace_0d273.xml
 
 
-// File: namespace_0d275.xml
+// File: namespace_0d277.xml
 
 
 // File: namespace_0d279.xml
@@ -7694,25 +7598,22 @@ C++ includes: ZLimits.h
 // File: namespace_0d281.xml
 
 
-// File: namespace_0d283.xml
-
+// File: namespace_0d293.xml
 
-// File: namespace_0d295.xml
 
+// File: namespace_0d299.xml
 
-// File: namespace_0d301.xml
 
-
-// File: namespace_0d305.xml
+// File: namespace_0d303.xml
 
 
 // File: namespace_0d31.xml
 
 
-// File: namespace_0d323.xml
+// File: namespace_0d321.xml
 
 
-// File: namespace_0d342.xml
+// File: namespace_0d340.xml
 
 
 // File: namespace_0d37.xml
@@ -7725,32 +7626,32 @@ C++ includes: ZLimits.h
 
 
 // File: namespacebake.xml
-%feature("docstring")  bake::createCubicLattice "Lattice3D bake::createCubicLattice(double a)
+%feature("docstring")  bake::CubicLattice "Lattice3D bake::CubicLattice(double a)
 
 Returns a primitive cubic (cP) lattice with edge length a. 
 ";
 
-%feature("docstring")  bake::createFCCLattice "Lattice3D bake::createFCCLattice(double a)
+%feature("docstring")  bake::FCCLattice "Lattice3D bake::FCCLattice(double a)
 
 Returns a face-centered cubic (cF) lattice with edge length a. 
 ";
 
-%feature("docstring")  bake::createHexagonalLattice "Lattice3D bake::createHexagonalLattice(double a, double c)
+%feature("docstring")  bake::HexagonalLattice "Lattice3D bake::HexagonalLattice(double a, double c)
 
 Returns a primitive hexagonal (hP) lattice with hexagonal edge a and height c. 
 ";
 
-%feature("docstring")  bake::createHCPLattice "Lattice3D bake::createHCPLattice(double a, double c)
+%feature("docstring")  bake::HCPLattice "Lattice3D bake::HCPLattice(double a, double c)
 
 TODO: Clarify how this is meant: HCP is not a Bravais lattice. 
 ";
 
-%feature("docstring")  bake::createTetragonalLattice "Lattice3D bake::createTetragonalLattice(double a, double c)
+%feature("docstring")  bake::TetragonalLattice "Lattice3D bake::TetragonalLattice(double a, double c)
 
 Returns a primitive tetragonal (tP) lattice with square base edge a and height c. 
 ";
 
-%feature("docstring")  bake::createBCTLattice "Lattice3D bake::createBCTLattice(double a, double c)
+%feature("docstring")  bake::BCTLattice "Lattice3D bake::BCTLattice(double a, double c)
 
 Returns a body-centered cubic (cI) lattice with edge length a. TODO: Clarify meaning of c 
 ";
@@ -8287,12 +8188,6 @@ Used by the hard sphere and by several soft sphere classes.
 // File: IInterferenceFunctionStrategy_8h.xml
 
 
-// File: SSCAHelper_8cpp.xml
-
-
-// File: SSCAHelper_8h.xml
-
-
 // File: SSCApproximationStrategy_8cpp.xml
 
 
diff --git a/auto/Wrap/libBornAgainParam.py b/auto/Wrap/libBornAgainParam.py
index eb21700ad62a1840d19f50014b7fa8d5a8a0a743..f5671728a2a6e0b4682340405a6bf243fb8ac97f 100644
--- a/auto/Wrap/libBornAgainParam.py
+++ b/auto/Wrap/libBornAgainParam.py
@@ -3295,7 +3295,7 @@ class INodeVisitor(object):
 
     def visit(self, *args):
         r"""
-        visit(INodeVisitor self, BasicLattice const * arg2)
+        visit(INodeVisitor self, BasicLattice2D const * arg2)
         visit(INodeVisitor self, Beam const * arg2)
         visit(INodeVisitor self, ConstantBackground const * arg2)
         visit(INodeVisitor self, ConvolutionDetectorResolution const * arg2)
@@ -3370,7 +3370,7 @@ class INodeVisitor(object):
         visit(INodeVisitor self, FTDistribution2DGauss const * arg2)
         visit(INodeVisitor self, FTDistribution2DVoigt const * arg2)
         visit(INodeVisitor self, GISASSimulation const * arg2)
-        visit(INodeVisitor self, HexagonalLattice const * arg2)
+        visit(INodeVisitor self, HexagonalLattice2D const * arg2)
         visit(INodeVisitor self, IAbstractParticle const * arg2)
         visit(INodeVisitor self, IClusteredParticles const * arg2)
         visit(INodeVisitor self, IdentityRotation const * arg2)
@@ -3417,8 +3417,8 @@ class INodeVisitor(object):
         visit(INodeVisitor self, SpecularDetector1D const * arg2)
         visit(INodeVisitor self, SpecularSimulation const * arg2)
         visit(INodeVisitor self, SphericalDetector const * arg2)
-        visit(INodeVisitor self, SquareLattice const * arg2)
-        virtual void INodeVisitor::visit(const SquareLattice *)
+        visit(INodeVisitor self, SquareLattice2D const * arg2)
+        virtual void INodeVisitor::visit(const SquareLattice2D *)
 
         """
         return _libBornAgainParam.INodeVisitor_visit(self, *args)
diff --git a/auto/Wrap/libBornAgainParam_wrap.cpp b/auto/Wrap/libBornAgainParam_wrap.cpp
index 29087bfebd50fd9fab8bd1879376f7dafe6d8c05..2d17b834aa6522fe53413359091d2e922a6b6156 100644
--- a/auto/Wrap/libBornAgainParam_wrap.cpp
+++ b/auto/Wrap/libBornAgainParam_wrap.cpp
@@ -3098,7 +3098,7 @@ namespace Swig {
 /* -------- TYPES TABLE (BEGIN) -------- */
 
 #define SWIGTYPE_p_Attributes swig_types[0]
-#define SWIGTYPE_p_BasicLattice swig_types[1]
+#define SWIGTYPE_p_BasicLattice2D swig_types[1]
 #define SWIGTYPE_p_BasicVector3DT_double_t swig_types[2]
 #define SWIGTYPE_p_BasicVector3DT_int_t swig_types[3]
 #define SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t swig_types[4]
@@ -3176,7 +3176,7 @@ namespace Swig {
 #define SWIGTYPE_p_FormFactorTruncatedSpheroid swig_types[76]
 #define SWIGTYPE_p_FormFactorWeighted swig_types[77]
 #define SWIGTYPE_p_GISASSimulation swig_types[78]
-#define SWIGTYPE_p_HexagonalLattice swig_types[79]
+#define SWIGTYPE_p_HexagonalLattice2D swig_types[79]
 #define SWIGTYPE_p_IAbstractParticle swig_types[80]
 #define SWIGTYPE_p_ICloneable swig_types[81]
 #define SWIGTYPE_p_IClusteredParticles swig_types[82]
@@ -3241,7 +3241,7 @@ namespace Swig {
 #define SWIGTYPE_p_SpecularDetector1D swig_types[141]
 #define SWIGTYPE_p_SpecularSimulation swig_types[142]
 #define SWIGTYPE_p_SphericalDetector swig_types[143]
-#define SWIGTYPE_p_SquareLattice swig_types[144]
+#define SWIGTYPE_p_SquareLattice2D swig_types[144]
 #define SWIGTYPE_p_allocator_type swig_types[145]
 #define SWIGTYPE_p_char swig_types[146]
 #define SWIGTYPE_p_difference_type swig_types[147]
@@ -36892,7 +36892,7 @@ fail:
 SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
-  BasicLattice *arg2 = (BasicLattice *) 0 ;
+  BasicLattice2D *arg2 = (BasicLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 = 0 ;
@@ -36904,12 +36904,12 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_0(PyObject *SWIGUNUSEDPARM(s
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "INodeVisitor_visit" "', argument " "1"" of type '" "INodeVisitor *""'"); 
   }
   arg1 = reinterpret_cast< INodeVisitor * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_BasicLattice, 0 |  0 );
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_BasicLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "INodeVisitor_visit" "', argument " "2"" of type '" "BasicLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "INodeVisitor_visit" "', argument " "2"" of type '" "BasicLattice2D const *""'"); 
   }
-  arg2 = reinterpret_cast< BasicLattice * >(argp2);
-  (arg1)->visit((BasicLattice const *)arg2);
+  arg2 = reinterpret_cast< BasicLattice2D * >(argp2);
+  (arg1)->visit((BasicLattice2D const *)arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -38992,7 +38992,7 @@ fail:
 SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_75(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
-  HexagonalLattice *arg2 = (HexagonalLattice *) 0 ;
+  HexagonalLattice2D *arg2 = (HexagonalLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 = 0 ;
@@ -39004,12 +39004,12 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_75(PyObject *SWIGUNUSEDPARM(
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "INodeVisitor_visit" "', argument " "1"" of type '" "INodeVisitor *""'"); 
   }
   arg1 = reinterpret_cast< INodeVisitor * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_HexagonalLattice, 0 |  0 );
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_HexagonalLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "INodeVisitor_visit" "', argument " "2"" of type '" "HexagonalLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "INodeVisitor_visit" "', argument " "2"" of type '" "HexagonalLattice2D const *""'"); 
   }
-  arg2 = reinterpret_cast< HexagonalLattice * >(argp2);
-  (arg1)->visit((HexagonalLattice const *)arg2);
+  arg2 = reinterpret_cast< HexagonalLattice2D * >(argp2);
+  (arg1)->visit((HexagonalLattice2D const *)arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -40308,7 +40308,7 @@ fail:
 SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_122(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   INodeVisitor *arg1 = (INodeVisitor *) 0 ;
-  SquareLattice *arg2 = (SquareLattice *) 0 ;
+  SquareLattice2D *arg2 = (SquareLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 = 0 ;
@@ -40320,12 +40320,12 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit__SWIG_122(PyObject *SWIGUNUSEDPARM
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "INodeVisitor_visit" "', argument " "1"" of type '" "INodeVisitor *""'"); 
   }
   arg1 = reinterpret_cast< INodeVisitor * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_SquareLattice, 0 |  0 );
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_SquareLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "INodeVisitor_visit" "', argument " "2"" of type '" "SquareLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "INodeVisitor_visit" "', argument " "2"" of type '" "SquareLattice2D const *""'"); 
   }
-  arg2 = reinterpret_cast< SquareLattice * >(argp2);
-  (arg1)->visit((SquareLattice const *)arg2);
+  arg2 = reinterpret_cast< SquareLattice2D * >(argp2);
+  (arg1)->visit((SquareLattice2D const *)arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -40348,7 +40348,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
     _v = SWIG_CheckState(res);
     if (_v) {
       void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_BasicLattice, 0);
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_BasicLattice2D, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
         return _wrap_INodeVisitor_visit__SWIG_0(self, argc, argv);
@@ -41398,7 +41398,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
     _v = SWIG_CheckState(res);
     if (_v) {
       void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_HexagonalLattice, 0);
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_HexagonalLattice2D, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
         return _wrap_INodeVisitor_visit__SWIG_75(self, argc, argv);
@@ -42056,7 +42056,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
     _v = SWIG_CheckState(res);
     if (_v) {
       void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_SquareLattice, 0);
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_SquareLattice2D, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
         return _wrap_INodeVisitor_visit__SWIG_122(self, argc, argv);
@@ -42067,7 +42067,7 @@ SWIGINTERN PyObject *_wrap_INodeVisitor_visit(PyObject *self, PyObject *args) {
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'INodeVisitor_visit'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    INodeVisitor::visit(BasicLattice const *)\n"
+    "    INodeVisitor::visit(BasicLattice2D const *)\n"
     "    INodeVisitor::visit(Beam const *)\n"
     "    INodeVisitor::visit(ConstantBackground const *)\n"
     "    INodeVisitor::visit(ConvolutionDetectorResolution const *)\n"
@@ -42142,7 +42142,7 @@ fail:
     "    INodeVisitor::visit(FTDistribution2DGauss const *)\n"
     "    INodeVisitor::visit(FTDistribution2DVoigt const *)\n"
     "    INodeVisitor::visit(GISASSimulation const *)\n"
-    "    INodeVisitor::visit(HexagonalLattice const *)\n"
+    "    INodeVisitor::visit(HexagonalLattice2D const *)\n"
     "    INodeVisitor::visit(IAbstractParticle const *)\n"
     "    INodeVisitor::visit(IClusteredParticles const *)\n"
     "    INodeVisitor::visit(IdentityRotation const *)\n"
@@ -42189,7 +42189,7 @@ fail:
     "    INodeVisitor::visit(SpecularDetector1D const *)\n"
     "    INodeVisitor::visit(SpecularSimulation const *)\n"
     "    INodeVisitor::visit(SphericalDetector const *)\n"
-    "    INodeVisitor::visit(SquareLattice const *)\n");
+    "    INodeVisitor::visit(SquareLattice2D const *)\n");
   return 0;
 }
 
@@ -51147,7 +51147,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "INodeVisitor_visit", _wrap_INodeVisitor_visit, METH_VARARGS, "\n"
-		"INodeVisitor_visit(INodeVisitor self, BasicLattice const * arg2)\n"
+		"INodeVisitor_visit(INodeVisitor self, BasicLattice2D const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, Beam const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, ConstantBackground const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, ConvolutionDetectorResolution const * arg2)\n"
@@ -51222,7 +51222,7 @@ static PyMethodDef SwigMethods[] = {
 		"INodeVisitor_visit(INodeVisitor self, FTDistribution2DGauss const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, FTDistribution2DVoigt const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, GISASSimulation const * arg2)\n"
-		"INodeVisitor_visit(INodeVisitor self, HexagonalLattice const * arg2)\n"
+		"INodeVisitor_visit(INodeVisitor self, HexagonalLattice2D const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, IAbstractParticle const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, IClusteredParticles const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, IdentityRotation const * arg2)\n"
@@ -51269,8 +51269,8 @@ static PyMethodDef SwigMethods[] = {
 		"INodeVisitor_visit(INodeVisitor self, SpecularDetector1D const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, SpecularSimulation const * arg2)\n"
 		"INodeVisitor_visit(INodeVisitor self, SphericalDetector const * arg2)\n"
-		"INodeVisitor_visit(INodeVisitor self, SquareLattice const * arg2)\n"
-		"virtual void INodeVisitor::visit(const SquareLattice *)\n"
+		"INodeVisitor_visit(INodeVisitor self, SquareLattice2D const * arg2)\n"
+		"virtual void INodeVisitor::visit(const SquareLattice2D *)\n"
 		"\n"
 		""},
 	 { "INodeVisitor_depth", _wrap_INodeVisitor_depth, METH_O, "\n"
@@ -52104,7 +52104,7 @@ static void *_p_DistributionLogNormalTo_p_IDistribution1D(void *x, int *SWIGUNUS
     return (void *)((IDistribution1D *)  ((DistributionLogNormal *) x));
 }
 static swig_type_info _swigt__p_Attributes = {"_p_Attributes", "Attributes *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_BasicLattice = {"_p_BasicLattice", "BasicLattice *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_BasicLattice2D = {"_p_BasicLattice2D", "BasicLattice2D *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BasicVector3DT_double_t = {"_p_BasicVector3DT_double_t", "std::vector< BasicVector3D< double > >::value_type *|kvector_t *|BasicVector3D< double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BasicVector3DT_int_t = {"_p_BasicVector3DT_int_t", "ivector_t *|BasicVector3D< int > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BasicVector3DT_std__complexT_double_t_t = {"_p_BasicVector3DT_std__complexT_double_t_t", "BasicVector3D< std::complex< double > > *|std::vector< BasicVector3D< std::complex< double > > >::value_type *|cvector_t *", 0, 0, (void*)0, 0};
@@ -52182,7 +52182,7 @@ static swig_type_info _swigt__p_FormFactorTruncatedSphere = {"_p_FormFactorTrunc
 static swig_type_info _swigt__p_FormFactorTruncatedSpheroid = {"_p_FormFactorTruncatedSpheroid", "FormFactorTruncatedSpheroid *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FormFactorWeighted = {"_p_FormFactorWeighted", "FormFactorWeighted *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_GISASSimulation = {"_p_GISASSimulation", "GISASSimulation *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_HexagonalLattice = {"_p_HexagonalLattice", "HexagonalLattice *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_HexagonalLattice2D = {"_p_HexagonalLattice2D", "HexagonalLattice2D *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IAbstractParticle = {"_p_IAbstractParticle", "IAbstractParticle *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ICloneable = {"_p_ICloneable", "ICloneable *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IClusteredParticles = {"_p_IClusteredParticles", "IClusteredParticles *", 0, 0, (void*)0, 0};
@@ -52247,7 +52247,7 @@ static swig_type_info _swigt__p_RotationZ = {"_p_RotationZ", "RotationZ *", 0, 0
 static swig_type_info _swigt__p_SpecularDetector1D = {"_p_SpecularDetector1D", "SpecularDetector1D *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SpecularSimulation = {"_p_SpecularSimulation", "SpecularSimulation *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SphericalDetector = {"_p_SphericalDetector", "SphericalDetector *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_SquareLattice = {"_p_SquareLattice", "SquareLattice *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_SquareLattice2D = {"_p_SquareLattice2D", "SquareLattice2D *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_allocator_type = {"_p_allocator_type", "allocator_type *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_difference_type = {"_p_difference_type", "difference_type *", 0, 0, (void*)0, 0};
@@ -52306,7 +52306,7 @@ static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0
 
 static swig_type_info *swig_type_initial[] = {
   &_swigt__p_Attributes,
-  &_swigt__p_BasicLattice,
+  &_swigt__p_BasicLattice2D,
   &_swigt__p_BasicVector3DT_double_t,
   &_swigt__p_BasicVector3DT_int_t,
   &_swigt__p_BasicVector3DT_std__complexT_double_t_t,
@@ -52384,7 +52384,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_FormFactorTruncatedSpheroid,
   &_swigt__p_FormFactorWeighted,
   &_swigt__p_GISASSimulation,
-  &_swigt__p_HexagonalLattice,
+  &_swigt__p_HexagonalLattice2D,
   &_swigt__p_IAbstractParticle,
   &_swigt__p_ICloneable,
   &_swigt__p_IClusteredParticles,
@@ -52449,7 +52449,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_SpecularDetector1D,
   &_swigt__p_SpecularSimulation,
   &_swigt__p_SphericalDetector,
-  &_swigt__p_SquareLattice,
+  &_swigt__p_SquareLattice2D,
   &_swigt__p_allocator_type,
   &_swigt__p_char,
   &_swigt__p_difference_type,
@@ -52508,7 +52508,7 @@ static swig_type_info *swig_type_initial[] = {
 };
 
 static swig_cast_info _swigc__p_Attributes[] = {  {&_swigt__p_Attributes, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_BasicLattice[] = {  {&_swigt__p_BasicLattice, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_BasicLattice2D[] = {  {&_swigt__p_BasicLattice2D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_BasicVector3DT_double_t[] = {  {&_swigt__p_BasicVector3DT_double_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_BasicVector3DT_int_t[] = {  {&_swigt__p_BasicVector3DT_int_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_BasicVector3DT_std__complexT_double_t_t[] = {  {&_swigt__p_BasicVector3DT_std__complexT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -52586,7 +52586,7 @@ static swig_cast_info _swigc__p_FormFactorTruncatedSphere[] = {  {&_swigt__p_For
 static swig_cast_info _swigc__p_FormFactorTruncatedSpheroid[] = {  {&_swigt__p_FormFactorTruncatedSpheroid, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorWeighted[] = {  {&_swigt__p_FormFactorWeighted, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_GISASSimulation[] = {  {&_swigt__p_GISASSimulation, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_HexagonalLattice[] = {  {&_swigt__p_HexagonalLattice, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_HexagonalLattice2D[] = {  {&_swigt__p_HexagonalLattice2D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IAbstractParticle[] = {  {&_swigt__p_IAbstractParticle, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_RangedDistributionGate, _p_RangedDistributionGateTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionGate, _p_DistributionGateTo_p_ICloneable, 0, 0},  {&_swigt__p_IDistribution1D, _p_IDistribution1DTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionTrapezoid, _p_DistributionTrapezoidTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_RangedDistributionGaussian, _p_RangedDistributionGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionGaussian, _p_DistributionGaussianTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionCosine, _p_RangedDistributionCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionCosine, _p_DistributionCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionLorentz, _p_RangedDistributionLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionLorentz, _p_DistributionLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistributionLogNormal, _p_RangedDistributionLogNormalTo_p_ICloneable, 0, 0},  {&_swigt__p_DistributionLogNormal, _p_DistributionLogNormalTo_p_ICloneable, 0, 0},  {&_swigt__p_RangedDistribution, _p_RangedDistributionTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IClusteredParticles[] = {  {&_swigt__p_IClusteredParticles, 0, 0, 0},{0, 0, 0, 0}};
@@ -52651,7 +52651,7 @@ static swig_cast_info _swigc__p_RotationZ[] = {  {&_swigt__p_RotationZ, 0, 0, 0}
 static swig_cast_info _swigc__p_SpecularDetector1D[] = {  {&_swigt__p_SpecularDetector1D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SpecularSimulation[] = {  {&_swigt__p_SpecularSimulation, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SphericalDetector[] = {  {&_swigt__p_SphericalDetector, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_SquareLattice[] = {  {&_swigt__p_SquareLattice, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_SquareLattice2D[] = {  {&_swigt__p_SquareLattice2D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_allocator_type[] = {  {&_swigt__p_allocator_type, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_char[] = {  {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_difference_type[] = {  {&_swigt__p_difference_type, 0, 0, 0},{0, 0, 0, 0}};
@@ -52710,7 +52710,7 @@ static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0,
 
 static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_Attributes,
-  _swigc__p_BasicLattice,
+  _swigc__p_BasicLattice2D,
   _swigc__p_BasicVector3DT_double_t,
   _swigc__p_BasicVector3DT_int_t,
   _swigc__p_BasicVector3DT_std__complexT_double_t_t,
@@ -52788,7 +52788,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_FormFactorTruncatedSpheroid,
   _swigc__p_FormFactorWeighted,
   _swigc__p_GISASSimulation,
-  _swigc__p_HexagonalLattice,
+  _swigc__p_HexagonalLattice2D,
   _swigc__p_IAbstractParticle,
   _swigc__p_ICloneable,
   _swigc__p_IClusteredParticles,
@@ -52853,7 +52853,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_SpecularDetector1D,
   _swigc__p_SpecularSimulation,
   _swigc__p_SphericalDetector,
-  _swigc__p_SquareLattice,
+  _swigc__p_SquareLattice2D,
   _swigc__p_allocator_type,
   _swigc__p_char,
   _swigc__p_difference_type,
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index a2d99c80baa8328bb5576bd3903270acce4682ae..1438c02517ca13ef7e4b68ca56110cd7886d2f0c 100644
--- a/auto/Wrap/libBornAgainSample.py
+++ b/auto/Wrap/libBornAgainSample.py
@@ -6906,14 +6906,13 @@ class InterferenceFunction2DLattice(IInterferenceFunction):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, *args):
+    def __init__(self, lattice):
         r"""
-        __init__(InterferenceFunction2DLattice self, double length_1, double length_2, double alpha, double xi) -> InterferenceFunction2DLattice
         __init__(InterferenceFunction2DLattice self, Lattice2D lattice) -> InterferenceFunction2DLattice
         InterferenceFunction2DLattice::InterferenceFunction2DLattice(const Lattice2D &lattice)
 
         """
-        _libBornAgainSample.InterferenceFunction2DLattice_swiginit(self, _libBornAgainSample.new_InterferenceFunction2DLattice(*args))
+        _libBornAgainSample.InterferenceFunction2DLattice_swiginit(self, _libBornAgainSample.new_InterferenceFunction2DLattice(lattice))
     __swig_destroy__ = _libBornAgainSample.delete_InterferenceFunction2DLattice
 
     def clone(self):
@@ -7016,34 +7015,13 @@ class InterferenceFunction2DParaCrystal(IInterferenceFunction):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, *args):
+    def __init__(self, lattice, damping_length, domain_size_1, domain_size_2):
         r"""
         __init__(InterferenceFunction2DParaCrystal self, Lattice2D lattice, double damping_length, double domain_size_1, double domain_size_2) -> InterferenceFunction2DParaCrystal
-        __init__(InterferenceFunction2DParaCrystal self, double length_1, double length_2, double alpha, double xi, double damping_length) -> InterferenceFunction2DParaCrystal
-        InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(double length_1, double length_2, double alpha, double xi, double damping_length)
-
-        Constructor of interference function of two-dimensional paracrystal.
-
-        Parameters:
-        -----------
-
-        length_1: 
-        length of first lattice vector in nanometers
-
-        length_2: 
-        length of second lattice vector in nanometers
-
-        alpha: 
-        angle between lattice vectors in radians
-
-        xi: 
-        rotation of lattice with respect to x-axis (beam direction) in radians
-
-        damping_length: 
-        the damping (coherence) length of the paracrystal in nanometers 
+        InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(const Lattice2D &lattice, double damping_length, double domain_size_1, double domain_size_2)
 
         """
-        _libBornAgainSample.InterferenceFunction2DParaCrystal_swiginit(self, _libBornAgainSample.new_InterferenceFunction2DParaCrystal(*args))
+        _libBornAgainSample.InterferenceFunction2DParaCrystal_swiginit(self, _libBornAgainSample.new_InterferenceFunction2DParaCrystal(lattice, damping_length, domain_size_1, domain_size_2))
     __swig_destroy__ = _libBornAgainSample.delete_InterferenceFunction2DParaCrystal
 
     def clone(self):
@@ -7442,28 +7420,18 @@ class InterferenceFunctionFinite2DLattice(IInterferenceFunction):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, *args):
+    def __init__(self, lattice, N_1, N_2):
         r"""
         __init__(InterferenceFunctionFinite2DLattice self, Lattice2D lattice, unsigned int N_1, unsigned int N_2) -> InterferenceFunctionFinite2DLattice
-        __init__(InterferenceFunctionFinite2DLattice self, double length_1, double length_2, double alpha, double xi, unsigned int N_1, unsigned int N_2) -> InterferenceFunctionFinite2DLattice
-        InterferenceFunctionFinite2DLattice::InterferenceFunctionFinite2DLattice(double length_1, double length_2, double alpha, double xi, unsigned N_1, unsigned N_2)
+        InterferenceFunctionFinite2DLattice::InterferenceFunctionFinite2DLattice(const Lattice2D &lattice, unsigned N_1, unsigned N_2)
 
         Constructor of two-dimensional finite lattice interference function.
 
         Parameters:
         -----------
 
-        length_1: 
-        length of first lattice vector in nanometers
-
-        length_2: 
-        length of second lattice vector in nanometers
-
-        alpha: 
-        angle between lattice vectors in radians
-
-        xi: 
-        rotation of lattice with respect to x-axis (beam direction) in radians
+        lattice: 
+        object specifying a 2d lattice structure
 
         N_1: 
         number of lattice cells in the first lattice direction
@@ -7472,7 +7440,7 @@ class InterferenceFunctionFinite2DLattice(IInterferenceFunction):
         number of lattice cells in the second lattice direction 
 
         """
-        _libBornAgainSample.InterferenceFunctionFinite2DLattice_swiginit(self, _libBornAgainSample.new_InterferenceFunctionFinite2DLattice(*args))
+        _libBornAgainSample.InterferenceFunctionFinite2DLattice_swiginit(self, _libBornAgainSample.new_InterferenceFunctionFinite2DLattice(lattice, N_1, N_2))
     __swig_destroy__ = _libBornAgainSample.delete_InterferenceFunctionFinite2DLattice
 
     def clone(self):
@@ -11461,264 +11429,264 @@ class Lattice2D(libBornAgainBase.ICloneable, libBornAgainParam.INode):
 # Register Lattice2D in _libBornAgainSample:
 _libBornAgainSample.Lattice2D_swigregister(Lattice2D)
 
-class BasicLattice(Lattice2D):
-    r"""Proxy of C++ BasicLattice class."""
+class BasicLattice2D(Lattice2D):
+    r"""Proxy of C++ BasicLattice2D class."""
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
     def __init__(self, length1, length2, angle, xi):
         r"""
-        __init__(BasicLattice self, double length1, double length2, double angle, double xi) -> BasicLattice
-        BasicLattice::BasicLattice(double length1, double length2, double angle, double xi)
+        __init__(BasicLattice2D self, double length1, double length2, double angle, double xi) -> BasicLattice2D
+        BasicLattice2D::BasicLattice2D(double length1, double length2, double angle, double xi)
 
         """
-        _libBornAgainSample.BasicLattice_swiginit(self, _libBornAgainSample.new_BasicLattice(length1, length2, angle, xi))
+        _libBornAgainSample.BasicLattice2D_swiginit(self, _libBornAgainSample.new_BasicLattice2D(length1, length2, angle, xi))
 
     def clone(self):
         r"""
-        clone(BasicLattice self) -> BasicLattice
-        BasicLattice * BasicLattice::clone() const
+        clone(BasicLattice2D self) -> BasicLattice2D
+        BasicLattice2D * BasicLattice2D::clone() const
 
         """
-        return _libBornAgainSample.BasicLattice_clone(self)
+        return _libBornAgainSample.BasicLattice2D_clone(self)
 
     def accept(self, visitor):
         r"""
-        accept(BasicLattice self, INodeVisitor * visitor)
-        void BasicLattice::accept(INodeVisitor *visitor) const final
+        accept(BasicLattice2D self, INodeVisitor * visitor)
+        void BasicLattice2D::accept(INodeVisitor *visitor) const final
 
         """
-        return _libBornAgainSample.BasicLattice_accept(self, visitor)
+        return _libBornAgainSample.BasicLattice2D_accept(self, visitor)
 
     def length1(self):
         r"""
-        length1(BasicLattice self) -> double
-        virtual double BasicLattice::length1() const
+        length1(BasicLattice2D self) -> double
+        virtual double BasicLattice2D::length1() const
 
         """
-        return _libBornAgainSample.BasicLattice_length1(self)
+        return _libBornAgainSample.BasicLattice2D_length1(self)
 
     def length2(self):
         r"""
-        length2(BasicLattice self) -> double
-        virtual double BasicLattice::length2() const
+        length2(BasicLattice2D self) -> double
+        virtual double BasicLattice2D::length2() const
 
         """
-        return _libBornAgainSample.BasicLattice_length2(self)
+        return _libBornAgainSample.BasicLattice2D_length2(self)
 
     def latticeAngle(self):
         r"""
-        latticeAngle(BasicLattice self) -> double
-        virtual double BasicLattice::latticeAngle() const
+        latticeAngle(BasicLattice2D self) -> double
+        virtual double BasicLattice2D::latticeAngle() const
 
         """
-        return _libBornAgainSample.BasicLattice_latticeAngle(self)
+        return _libBornAgainSample.BasicLattice2D_latticeAngle(self)
 
     def unitCellArea(self):
         r"""
-        unitCellArea(BasicLattice self) -> double
-        double BasicLattice::unitCellArea() const
+        unitCellArea(BasicLattice2D self) -> double
+        double BasicLattice2D::unitCellArea() const
 
         """
-        return _libBornAgainSample.BasicLattice_unitCellArea(self)
-    __swig_destroy__ = _libBornAgainSample.delete_BasicLattice
+        return _libBornAgainSample.BasicLattice2D_unitCellArea(self)
+    __swig_destroy__ = _libBornAgainSample.delete_BasicLattice2D
 
-# Register BasicLattice in _libBornAgainSample:
-_libBornAgainSample.BasicLattice_swigregister(BasicLattice)
+# Register BasicLattice2D in _libBornAgainSample:
+_libBornAgainSample.BasicLattice2D_swigregister(BasicLattice2D)
 
-class SquareLattice(Lattice2D):
-    r"""Proxy of C++ SquareLattice class."""
+class SquareLattice2D(Lattice2D):
+    r"""Proxy of C++ SquareLattice2D class."""
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
     def __init__(self, length, xi=0.0):
         r"""
-        __init__(SquareLattice self, double length, double xi=0.0) -> SquareLattice
-        SquareLattice::SquareLattice(double length, double xi=0.0)
+        __init__(SquareLattice2D self, double length, double xi=0.0) -> SquareLattice2D
+        SquareLattice2D::SquareLattice2D(double length, double xi=0.0)
 
         """
-        _libBornAgainSample.SquareLattice_swiginit(self, _libBornAgainSample.new_SquareLattice(length, xi))
+        _libBornAgainSample.SquareLattice2D_swiginit(self, _libBornAgainSample.new_SquareLattice2D(length, xi))
 
     def clone(self):
         r"""
-        clone(SquareLattice self) -> SquareLattice
-        SquareLattice * SquareLattice::clone() const
+        clone(SquareLattice2D self) -> SquareLattice2D
+        SquareLattice2D * SquareLattice2D::clone() const
 
         """
-        return _libBornAgainSample.SquareLattice_clone(self)
+        return _libBornAgainSample.SquareLattice2D_clone(self)
 
     def accept(self, visitor):
         r"""
-        accept(SquareLattice self, INodeVisitor * visitor)
-        void SquareLattice::accept(INodeVisitor *visitor) const final
+        accept(SquareLattice2D self, INodeVisitor * visitor)
+        void SquareLattice2D::accept(INodeVisitor *visitor) const final
 
         """
-        return _libBornAgainSample.SquareLattice_accept(self, visitor)
+        return _libBornAgainSample.SquareLattice2D_accept(self, visitor)
 
     def length1(self):
         r"""
-        length1(SquareLattice self) -> double
-        virtual double SquareLattice::length1() const
+        length1(SquareLattice2D self) -> double
+        virtual double SquareLattice2D::length1() const
 
         """
-        return _libBornAgainSample.SquareLattice_length1(self)
+        return _libBornAgainSample.SquareLattice2D_length1(self)
 
     def length2(self):
         r"""
-        length2(SquareLattice self) -> double
-        virtual double SquareLattice::length2() const
+        length2(SquareLattice2D self) -> double
+        virtual double SquareLattice2D::length2() const
 
         """
-        return _libBornAgainSample.SquareLattice_length2(self)
+        return _libBornAgainSample.SquareLattice2D_length2(self)
 
     def latticeAngle(self):
         r"""
-        latticeAngle(SquareLattice self) -> double
-        double SquareLattice::latticeAngle() const
+        latticeAngle(SquareLattice2D self) -> double
+        double SquareLattice2D::latticeAngle() const
 
         """
-        return _libBornAgainSample.SquareLattice_latticeAngle(self)
+        return _libBornAgainSample.SquareLattice2D_latticeAngle(self)
 
     def unitCellArea(self):
         r"""
-        unitCellArea(SquareLattice self) -> double
-        double SquareLattice::unitCellArea() const
+        unitCellArea(SquareLattice2D self) -> double
+        double SquareLattice2D::unitCellArea() const
 
         """
-        return _libBornAgainSample.SquareLattice_unitCellArea(self)
-    __swig_destroy__ = _libBornAgainSample.delete_SquareLattice
+        return _libBornAgainSample.SquareLattice2D_unitCellArea(self)
+    __swig_destroy__ = _libBornAgainSample.delete_SquareLattice2D
 
-# Register SquareLattice in _libBornAgainSample:
-_libBornAgainSample.SquareLattice_swigregister(SquareLattice)
+# Register SquareLattice2D in _libBornAgainSample:
+_libBornAgainSample.SquareLattice2D_swigregister(SquareLattice2D)
 
-class HexagonalLattice(Lattice2D):
-    r"""Proxy of C++ HexagonalLattice class."""
+class HexagonalLattice2D(Lattice2D):
+    r"""Proxy of C++ HexagonalLattice2D class."""
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
     def __init__(self, length, xi):
         r"""
-        __init__(HexagonalLattice self, double length, double xi) -> HexagonalLattice
-        HexagonalLattice::HexagonalLattice(double length, double xi)
+        __init__(HexagonalLattice2D self, double length, double xi) -> HexagonalLattice2D
+        HexagonalLattice2D::HexagonalLattice2D(double length, double xi)
 
         """
-        _libBornAgainSample.HexagonalLattice_swiginit(self, _libBornAgainSample.new_HexagonalLattice(length, xi))
+        _libBornAgainSample.HexagonalLattice2D_swiginit(self, _libBornAgainSample.new_HexagonalLattice2D(length, xi))
 
     def clone(self):
         r"""
-        clone(HexagonalLattice self) -> HexagonalLattice
-        HexagonalLattice * HexagonalLattice::clone() const
+        clone(HexagonalLattice2D self) -> HexagonalLattice2D
+        HexagonalLattice2D * HexagonalLattice2D::clone() const
 
         """
-        return _libBornAgainSample.HexagonalLattice_clone(self)
+        return _libBornAgainSample.HexagonalLattice2D_clone(self)
 
     def accept(self, visitor):
         r"""
-        accept(HexagonalLattice self, INodeVisitor * visitor)
-        void HexagonalLattice::accept(INodeVisitor *visitor) const final
+        accept(HexagonalLattice2D self, INodeVisitor * visitor)
+        void HexagonalLattice2D::accept(INodeVisitor *visitor) const final
 
         """
-        return _libBornAgainSample.HexagonalLattice_accept(self, visitor)
+        return _libBornAgainSample.HexagonalLattice2D_accept(self, visitor)
 
     def length1(self):
         r"""
-        length1(HexagonalLattice self) -> double
-        virtual double HexagonalLattice::length1() const
+        length1(HexagonalLattice2D self) -> double
+        virtual double HexagonalLattice2D::length1() const
 
         """
-        return _libBornAgainSample.HexagonalLattice_length1(self)
+        return _libBornAgainSample.HexagonalLattice2D_length1(self)
 
     def length2(self):
         r"""
-        length2(HexagonalLattice self) -> double
-        virtual double HexagonalLattice::length2() const
+        length2(HexagonalLattice2D self) -> double
+        virtual double HexagonalLattice2D::length2() const
 
         """
-        return _libBornAgainSample.HexagonalLattice_length2(self)
+        return _libBornAgainSample.HexagonalLattice2D_length2(self)
 
     def latticeAngle(self):
         r"""
-        latticeAngle(HexagonalLattice self) -> double
-        double HexagonalLattice::latticeAngle() const
+        latticeAngle(HexagonalLattice2D self) -> double
+        double HexagonalLattice2D::latticeAngle() const
 
         """
-        return _libBornAgainSample.HexagonalLattice_latticeAngle(self)
+        return _libBornAgainSample.HexagonalLattice2D_latticeAngle(self)
 
     def unitCellArea(self):
         r"""
-        unitCellArea(HexagonalLattice self) -> double
-        double HexagonalLattice::unitCellArea() const
+        unitCellArea(HexagonalLattice2D self) -> double
+        double HexagonalLattice2D::unitCellArea() const
 
         """
-        return _libBornAgainSample.HexagonalLattice_unitCellArea(self)
-    __swig_destroy__ = _libBornAgainSample.delete_HexagonalLattice
+        return _libBornAgainSample.HexagonalLattice2D_unitCellArea(self)
+    __swig_destroy__ = _libBornAgainSample.delete_HexagonalLattice2D
 
-# Register HexagonalLattice in _libBornAgainSample:
-_libBornAgainSample.HexagonalLattice_swigregister(HexagonalLattice)
+# Register HexagonalLattice2D in _libBornAgainSample:
+_libBornAgainSample.HexagonalLattice2D_swigregister(HexagonalLattice2D)
 
 
-def createCubicLattice(a):
+def CubicLattice(a):
     r"""
-    createCubicLattice(double a) -> Lattice3D
-    Lattice3D bake::createCubicLattice(double a)
+    CubicLattice(double a) -> Lattice3D
+    Lattice3D bake::CubicLattice(double a)
 
     Returns a primitive cubic (cP) lattice with edge length a. 
 
     """
-    return _libBornAgainSample.createCubicLattice(a)
+    return _libBornAgainSample.CubicLattice(a)
 
-def createFCCLattice(a):
+def FCCLattice(a):
     r"""
-    createFCCLattice(double a) -> Lattice3D
-    Lattice3D bake::createFCCLattice(double a)
+    FCCLattice(double a) -> Lattice3D
+    Lattice3D bake::FCCLattice(double a)
 
     Returns a face-centered cubic (cF) lattice with edge length a. 
 
     """
-    return _libBornAgainSample.createFCCLattice(a)
+    return _libBornAgainSample.FCCLattice(a)
 
-def createHexagonalLattice(a, c):
+def HexagonalLattice(a, c):
     r"""
-    createHexagonalLattice(double a, double c) -> Lattice3D
-    Lattice3D bake::createHexagonalLattice(double a, double c)
+    HexagonalLattice(double a, double c) -> Lattice3D
+    Lattice3D bake::HexagonalLattice(double a, double c)
 
     Returns a primitive hexagonal (hP) lattice with hexagonal edge a and height c. 
 
     """
-    return _libBornAgainSample.createHexagonalLattice(a, c)
+    return _libBornAgainSample.HexagonalLattice(a, c)
 
-def createHCPLattice(a, c):
+def HCPLattice(a, c):
     r"""
-    createHCPLattice(double a, double c) -> Lattice3D
-    Lattice3D bake::createHCPLattice(double a, double c)
+    HCPLattice(double a, double c) -> Lattice3D
+    Lattice3D bake::HCPLattice(double a, double c)
 
     TODO: Clarify how this is meant: HCP is not a Bravais lattice. 
 
     """
-    return _libBornAgainSample.createHCPLattice(a, c)
+    return _libBornAgainSample.HCPLattice(a, c)
 
-def createTetragonalLattice(a, c):
+def TetragonalLattice(a, c):
     r"""
-    createTetragonalLattice(double a, double c) -> Lattice3D
-    Lattice3D bake::createTetragonalLattice(double a, double c)
+    TetragonalLattice(double a, double c) -> Lattice3D
+    Lattice3D bake::TetragonalLattice(double a, double c)
 
     Returns a primitive tetragonal (tP) lattice with square base edge a and height c. 
 
     """
-    return _libBornAgainSample.createTetragonalLattice(a, c)
+    return _libBornAgainSample.TetragonalLattice(a, c)
 
-def createBCTLattice(a, c):
+def BCTLattice(a, c):
     r"""
-    createBCTLattice(double a, double c) -> Lattice3D
-    Lattice3D bake::createBCTLattice(double a, double c)
+    BCTLattice(double a, double c) -> Lattice3D
+    Lattice3D bake::BCTLattice(double a, double c)
 
     Returns a body-centered cubic (cI) lattice with edge length a. TODO: Clarify meaning of c 
 
     """
-    return _libBornAgainSample.createBCTLattice(a, c)
+    return _libBornAgainSample.BCTLattice(a, c)
 class ISampleBuilder(libBornAgainParam.IParameterized):
     r"""
 
diff --git a/auto/Wrap/libBornAgainSample_wrap.cpp b/auto/Wrap/libBornAgainSample_wrap.cpp
index 7ee98b2a221e8bca86032db23fa98ee46f5b97b9..7409cb0e87d1244eedb993ba4f220b93e0ca3278 100644
--- a/auto/Wrap/libBornAgainSample_wrap.cpp
+++ b/auto/Wrap/libBornAgainSample_wrap.cpp
@@ -3097,7 +3097,7 @@ namespace Swig {
 
 /* -------- TYPES TABLE (BEGIN) -------- */
 
-#define SWIGTYPE_p_BasicLattice swig_types[0]
+#define SWIGTYPE_p_BasicLattice2D swig_types[0]
 #define SWIGTYPE_p_BasicVector3DT_double_t swig_types[1]
 #define SWIGTYPE_p_BasicVector3DT_int_t swig_types[2]
 #define SWIGTYPE_p_BasicVector3DT_std__complexT_double_t_t swig_types[3]
@@ -3158,7 +3158,7 @@ namespace Swig {
 #define SWIGTYPE_p_FormFactorTruncatedSpheroid swig_types[58]
 #define SWIGTYPE_p_FormFactorWeighted swig_types[59]
 #define SWIGTYPE_p_GaussFisherPeakShape swig_types[60]
-#define SWIGTYPE_p_HexagonalLattice swig_types[61]
+#define SWIGTYPE_p_HexagonalLattice2D swig_types[61]
 #define SWIGTYPE_p_IAbstractParticle swig_types[62]
 #define SWIGTYPE_p_ICloneable swig_types[63]
 #define SWIGTYPE_p_ICosineRipple swig_types[64]
@@ -3233,7 +3233,7 @@ namespace Swig {
 #define SWIGTYPE_p_SimulationOptions swig_types[133]
 #define SWIGTYPE_p_SlicedParticle swig_types[134]
 #define SWIGTYPE_p_SlicingEffects swig_types[135]
-#define SWIGTYPE_p_SquareLattice swig_types[136]
+#define SWIGTYPE_p_SquareLattice2D swig_types[136]
 #define SWIGTYPE_p_ThreadInfo swig_types[137]
 #define SWIGTYPE_p_Transform3D swig_types[138]
 #define SWIGTYPE_p_WavevectorInfo swig_types[139]
@@ -52114,59 +52114,16 @@ SWIGINTERN PyObject *InterferenceFunction1DLattice_swiginit(PyObject *SWIGUNUSED
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DLattice__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double arg3 ;
-  double arg4 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  double val4 ;
-  int ecode4 = 0 ;
-  InterferenceFunction2DLattice *result = 0 ;
-  
-  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_InterferenceFunction2DLattice" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_InterferenceFunction2DLattice" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_InterferenceFunction2DLattice" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  ecode4 = SWIG_AsVal_double(swig_obj[3], &val4);
-  if (!SWIG_IsOK(ecode4)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_InterferenceFunction2DLattice" "', argument " "4"" of type '" "double""'");
-  } 
-  arg4 = static_cast< double >(val4);
-  result = (InterferenceFunction2DLattice *)new InterferenceFunction2DLattice(arg1,arg2,arg3,arg4);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DLattice, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DLattice__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Lattice2D *arg1 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  PyObject *swig_obj[1] ;
   InterferenceFunction2DLattice *result = 0 ;
   
-  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Lattice2D,  0  | 0);
   if (!SWIG_IsOK(res1)) {
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_InterferenceFunction2DLattice" "', argument " "1"" of type '" "Lattice2D const &""'"); 
@@ -52183,60 +52140,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DLattice(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[5] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_InterferenceFunction2DLattice", 0, 4, argv))) SWIG_fail;
-  --argc;
-  if (argc == 1) {
-    int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Lattice2D, SWIG_POINTER_NO_NULL | 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_new_InterferenceFunction2DLattice__SWIG_1(self, argc, argv);
-    }
-  }
-  if (argc == 4) {
-    int _v;
-    {
-      int res = SWIG_AsVal_double(argv[0], NULL);
-      _v = SWIG_CheckState(res);
-    }
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          {
-            int res = SWIG_AsVal_double(argv[3], NULL);
-            _v = SWIG_CheckState(res);
-          }
-          if (_v) {
-            return _wrap_new_InterferenceFunction2DLattice__SWIG_0(self, argc, argv);
-          }
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_InterferenceFunction2DLattice'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    InterferenceFunction2DLattice::InterferenceFunction2DLattice(double,double,double,double)\n"
-    "    InterferenceFunction2DLattice::InterferenceFunction2DLattice(Lattice2D const &)\n");
-  return 0;
-}
-
-
 SWIGINTERN PyObject *_wrap_delete_InterferenceFunction2DLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   InterferenceFunction2DLattice *arg1 = (InterferenceFunction2DLattice *) 0 ;
@@ -52497,7 +52400,7 @@ SWIGINTERN PyObject *InterferenceFunction2DLattice_swiginit(PyObject *SWIGUNUSED
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DParaCrystal__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DParaCrystal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Lattice2D *arg1 = 0 ;
   double arg2 ;
@@ -52511,9 +52414,10 @@ SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DParaCrystal__SWIG_0(PyObjec
   int ecode3 = 0 ;
   double val4 ;
   int ecode4 = 0 ;
+  PyObject *swig_obj[4] ;
   InterferenceFunction2DParaCrystal *result = 0 ;
   
-  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "new_InterferenceFunction2DParaCrystal", 4, 4, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Lattice2D,  0  | 0);
   if (!SWIG_IsOK(res1)) {
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "1"" of type '" "Lattice2D const &""'"); 
@@ -52545,137 +52449,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DParaCrystal__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double arg3 ;
-  double arg4 ;
-  double arg5 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  double val4 ;
-  int ecode4 = 0 ;
-  double val5 ;
-  int ecode5 = 0 ;
-  InterferenceFunction2DParaCrystal *result = 0 ;
-  
-  if ((nobjs < 5) || (nobjs > 5)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  ecode4 = SWIG_AsVal_double(swig_obj[3], &val4);
-  if (!SWIG_IsOK(ecode4)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "4"" of type '" "double""'");
-  } 
-  arg4 = static_cast< double >(val4);
-  ecode5 = SWIG_AsVal_double(swig_obj[4], &val5);
-  if (!SWIG_IsOK(ecode5)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_InterferenceFunction2DParaCrystal" "', argument " "5"" of type '" "double""'");
-  } 
-  arg5 = static_cast< double >(val5);
-  result = (InterferenceFunction2DParaCrystal *)new InterferenceFunction2DParaCrystal(arg1,arg2,arg3,arg4,arg5);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DParaCrystal, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_InterferenceFunction2DParaCrystal(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[6] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_InterferenceFunction2DParaCrystal", 0, 5, argv))) SWIG_fail;
-  --argc;
-  if (argc == 4) {
-    int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Lattice2D, SWIG_POINTER_NO_NULL | 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          {
-            int res = SWIG_AsVal_double(argv[3], NULL);
-            _v = SWIG_CheckState(res);
-          }
-          if (_v) {
-            return _wrap_new_InterferenceFunction2DParaCrystal__SWIG_0(self, argc, argv);
-          }
-        }
-      }
-    }
-  }
-  if (argc == 5) {
-    int _v;
-    {
-      int res = SWIG_AsVal_double(argv[0], NULL);
-      _v = SWIG_CheckState(res);
-    }
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          {
-            int res = SWIG_AsVal_double(argv[3], NULL);
-            _v = SWIG_CheckState(res);
-          }
-          if (_v) {
-            {
-              int res = SWIG_AsVal_double(argv[4], NULL);
-              _v = SWIG_CheckState(res);
-            }
-            if (_v) {
-              return _wrap_new_InterferenceFunction2DParaCrystal__SWIG_1(self, argc, argv);
-            }
-          }
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_InterferenceFunction2DParaCrystal'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(Lattice2D const &,double,double,double)\n"
-    "    InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(double,double,double,double,double)\n");
-  return 0;
-}
-
-
 SWIGINTERN PyObject *_wrap_delete_InterferenceFunction2DParaCrystal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   InterferenceFunction2DParaCrystal *arg1 = (InterferenceFunction2DParaCrystal *) 0 ;
@@ -53912,7 +53685,7 @@ SWIGINTERN PyObject *InterferenceFunction3DLattice_swiginit(PyObject *SWIGUNUSED
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_InterferenceFunctionFinite2DLattice__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_InterferenceFunctionFinite2DLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Lattice2D *arg1 = 0 ;
   unsigned int arg2 ;
@@ -53923,9 +53696,10 @@ SWIGINTERN PyObject *_wrap_new_InterferenceFunctionFinite2DLattice__SWIG_0(PyObj
   int ecode2 = 0 ;
   unsigned int val3 ;
   int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
   InterferenceFunctionFinite2DLattice *result = 0 ;
   
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "new_InterferenceFunctionFinite2DLattice", 3, 3, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Lattice2D,  0  | 0);
   if (!SWIG_IsOK(res1)) {
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_InterferenceFunctionFinite2DLattice" "', argument " "1"" of type '" "Lattice2D const &""'"); 
@@ -53952,145 +53726,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_InterferenceFunctionFinite2DLattice__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double arg3 ;
-  double arg4 ;
-  unsigned int arg5 ;
-  unsigned int arg6 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  double val4 ;
-  int ecode4 = 0 ;
-  unsigned int val5 ;
-  int ecode5 = 0 ;
-  unsigned int val6 ;
-  int ecode6 = 0 ;
-  InterferenceFunctionFinite2DLattice *result = 0 ;
-  
-  if ((nobjs < 6) || (nobjs > 6)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_InterferenceFunctionFinite2DLattice" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_InterferenceFunctionFinite2DLattice" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_InterferenceFunctionFinite2DLattice" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  ecode4 = SWIG_AsVal_double(swig_obj[3], &val4);
-  if (!SWIG_IsOK(ecode4)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_InterferenceFunctionFinite2DLattice" "', argument " "4"" of type '" "double""'");
-  } 
-  arg4 = static_cast< double >(val4);
-  ecode5 = SWIG_AsVal_unsigned_SS_int(swig_obj[4], &val5);
-  if (!SWIG_IsOK(ecode5)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_InterferenceFunctionFinite2DLattice" "', argument " "5"" of type '" "unsigned int""'");
-  } 
-  arg5 = static_cast< unsigned int >(val5);
-  ecode6 = SWIG_AsVal_unsigned_SS_int(swig_obj[5], &val6);
-  if (!SWIG_IsOK(ecode6)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "new_InterferenceFunctionFinite2DLattice" "', argument " "6"" of type '" "unsigned int""'");
-  } 
-  arg6 = static_cast< unsigned int >(val6);
-  result = (InterferenceFunctionFinite2DLattice *)new InterferenceFunctionFinite2DLattice(arg1,arg2,arg3,arg4,arg5,arg6);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunctionFinite2DLattice, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_InterferenceFunctionFinite2DLattice(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[7] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_InterferenceFunctionFinite2DLattice", 0, 6, argv))) SWIG_fail;
-  --argc;
-  if (argc == 3) {
-    int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Lattice2D, SWIG_POINTER_NO_NULL | 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        {
-          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_new_InterferenceFunctionFinite2DLattice__SWIG_0(self, argc, argv);
-        }
-      }
-    }
-  }
-  if (argc == 6) {
-    int _v;
-    {
-      int res = SWIG_AsVal_double(argv[0], NULL);
-      _v = SWIG_CheckState(res);
-    }
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          {
-            int res = SWIG_AsVal_double(argv[3], NULL);
-            _v = SWIG_CheckState(res);
-          }
-          if (_v) {
-            {
-              int res = SWIG_AsVal_unsigned_SS_int(argv[4], NULL);
-              _v = SWIG_CheckState(res);
-            }
-            if (_v) {
-              {
-                int res = SWIG_AsVal_unsigned_SS_int(argv[5], NULL);
-                _v = SWIG_CheckState(res);
-              }
-              if (_v) {
-                return _wrap_new_InterferenceFunctionFinite2DLattice__SWIG_1(self, argc, argv);
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_InterferenceFunctionFinite2DLattice'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    InterferenceFunctionFinite2DLattice::InterferenceFunctionFinite2DLattice(Lattice2D const &,unsigned int,unsigned int)\n"
-    "    InterferenceFunctionFinite2DLattice::InterferenceFunctionFinite2DLattice(double,double,double,double,unsigned int,unsigned int)\n");
-  return 0;
-}
-
-
 SWIGINTERN PyObject *_wrap_delete_InterferenceFunctionFinite2DLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   InterferenceFunctionFinite2DLattice *arg1 = (InterferenceFunctionFinite2DLattice *) 0 ;
@@ -68163,7 +67798,7 @@ SWIGINTERN PyObject *Lattice2D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyOb
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_new_BasicLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_BasicLattice2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -68178,63 +67813,63 @@ SWIGINTERN PyObject *_wrap_new_BasicLattice(PyObject *SWIGUNUSEDPARM(self), PyOb
   double val4 ;
   int ecode4 = 0 ;
   PyObject *swig_obj[4] ;
-  BasicLattice *result = 0 ;
+  BasicLattice2D *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_BasicLattice", 4, 4, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "new_BasicLattice2D", 4, 4, swig_obj)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_BasicLattice" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_BasicLattice2D" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_BasicLattice" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_BasicLattice2D" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_BasicLattice" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_BasicLattice2D" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
   ecode4 = SWIG_AsVal_double(swig_obj[3], &val4);
   if (!SWIG_IsOK(ecode4)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_BasicLattice" "', argument " "4"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_BasicLattice2D" "', argument " "4"" of type '" "double""'");
   } 
   arg4 = static_cast< double >(val4);
-  result = (BasicLattice *)new BasicLattice(arg1,arg2,arg3,arg4);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicLattice, SWIG_POINTER_NEW |  0 );
+  result = (BasicLattice2D *)new BasicLattice2D(arg1,arg2,arg3,arg4);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicLattice2D, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_BasicLattice_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_BasicLattice2D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  BasicLattice *arg1 = (BasicLattice *) 0 ;
+  BasicLattice2D *arg1 = (BasicLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  BasicLattice *result = 0 ;
+  BasicLattice2D *result = 0 ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BasicLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BasicLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BasicLattice_clone" "', argument " "1"" of type '" "BasicLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BasicLattice2D_clone" "', argument " "1"" of type '" "BasicLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< BasicLattice * >(argp1);
-  result = (BasicLattice *)((BasicLattice const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicLattice, 0 |  0 );
+  arg1 = reinterpret_cast< BasicLattice2D * >(argp1);
+  result = (BasicLattice2D *)((BasicLattice2D const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_BasicLattice2D, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_BasicLattice_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_BasicLattice2D_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  BasicLattice *arg1 = (BasicLattice *) 0 ;
+  BasicLattice2D *arg1 = (BasicLattice2D *) 0 ;
   INodeVisitor *arg2 = (INodeVisitor *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -68242,18 +67877,18 @@ SWIGINTERN PyObject *_wrap_BasicLattice_accept(PyObject *SWIGUNUSEDPARM(self), P
   int res2 = 0 ;
   PyObject *swig_obj[2] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "BasicLattice_accept", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BasicLattice, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "BasicLattice2D_accept", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BasicLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BasicLattice_accept" "', argument " "1"" of type '" "BasicLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BasicLattice2D_accept" "', argument " "1"" of type '" "BasicLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< BasicLattice * >(argp1);
+  arg1 = reinterpret_cast< BasicLattice2D * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INodeVisitor, 0 |  0 );
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BasicLattice_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "BasicLattice2D_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
   }
   arg2 = reinterpret_cast< INodeVisitor * >(argp2);
-  ((BasicLattice const *)arg1)->accept(arg2);
+  ((BasicLattice2D const *)arg1)->accept(arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -68261,9 +67896,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_BasicLattice_length1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_BasicLattice2D_length1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  BasicLattice *arg1 = (BasicLattice *) 0 ;
+  BasicLattice2D *arg1 = (BasicLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -68271,12 +67906,12 @@ SWIGINTERN PyObject *_wrap_BasicLattice_length1(PyObject *SWIGUNUSEDPARM(self),
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BasicLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BasicLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BasicLattice_length1" "', argument " "1"" of type '" "BasicLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BasicLattice2D_length1" "', argument " "1"" of type '" "BasicLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< BasicLattice * >(argp1);
-  result = (double)((BasicLattice const *)arg1)->length1();
+  arg1 = reinterpret_cast< BasicLattice2D * >(argp1);
+  result = (double)((BasicLattice2D const *)arg1)->length1();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -68284,9 +67919,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_BasicLattice_length2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_BasicLattice2D_length2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  BasicLattice *arg1 = (BasicLattice *) 0 ;
+  BasicLattice2D *arg1 = (BasicLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -68294,12 +67929,12 @@ SWIGINTERN PyObject *_wrap_BasicLattice_length2(PyObject *SWIGUNUSEDPARM(self),
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BasicLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BasicLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BasicLattice_length2" "', argument " "1"" of type '" "BasicLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BasicLattice2D_length2" "', argument " "1"" of type '" "BasicLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< BasicLattice * >(argp1);
-  result = (double)((BasicLattice const *)arg1)->length2();
+  arg1 = reinterpret_cast< BasicLattice2D * >(argp1);
+  result = (double)((BasicLattice2D const *)arg1)->length2();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -68307,9 +67942,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_BasicLattice_latticeAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_BasicLattice2D_latticeAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  BasicLattice *arg1 = (BasicLattice *) 0 ;
+  BasicLattice2D *arg1 = (BasicLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -68317,12 +67952,12 @@ SWIGINTERN PyObject *_wrap_BasicLattice_latticeAngle(PyObject *SWIGUNUSEDPARM(se
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BasicLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BasicLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BasicLattice_latticeAngle" "', argument " "1"" of type '" "BasicLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BasicLattice2D_latticeAngle" "', argument " "1"" of type '" "BasicLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< BasicLattice * >(argp1);
-  result = (double)((BasicLattice const *)arg1)->latticeAngle();
+  arg1 = reinterpret_cast< BasicLattice2D * >(argp1);
+  result = (double)((BasicLattice2D const *)arg1)->latticeAngle();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -68330,9 +67965,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_BasicLattice_unitCellArea(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_BasicLattice2D_unitCellArea(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  BasicLattice *arg1 = (BasicLattice *) 0 ;
+  BasicLattice2D *arg1 = (BasicLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -68340,12 +67975,12 @@ SWIGINTERN PyObject *_wrap_BasicLattice_unitCellArea(PyObject *SWIGUNUSEDPARM(se
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BasicLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BasicLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BasicLattice_unitCellArea" "', argument " "1"" of type '" "BasicLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "BasicLattice2D_unitCellArea" "', argument " "1"" of type '" "BasicLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< BasicLattice * >(argp1);
-  result = (double)((BasicLattice const *)arg1)->unitCellArea();
+  arg1 = reinterpret_cast< BasicLattice2D * >(argp1);
+  result = (double)((BasicLattice2D const *)arg1)->unitCellArea();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -68353,20 +67988,20 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_BasicLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_BasicLattice2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  BasicLattice *arg1 = (BasicLattice *) 0 ;
+  BasicLattice2D *arg1 = (BasicLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BasicLattice, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_BasicLattice2D, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_BasicLattice" "', argument " "1"" of type '" "BasicLattice *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_BasicLattice2D" "', argument " "1"" of type '" "BasicLattice2D *""'"); 
   }
-  arg1 = reinterpret_cast< BasicLattice * >(argp1);
+  arg1 = reinterpret_cast< BasicLattice2D * >(argp1);
   delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
@@ -68375,18 +68010,18 @@ fail:
 }
 
 
-SWIGINTERN PyObject *BasicLattice_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *BasicLattice2D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_BasicLattice, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_BasicLattice2D, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *BasicLattice_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *BasicLattice2D_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_SquareLattice__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_SquareLattice2D__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -68394,55 +68029,55 @@ SWIGINTERN PyObject *_wrap_new_SquareLattice__SWIG_0(PyObject *SWIGUNUSEDPARM(se
   int ecode1 = 0 ;
   double val2 ;
   int ecode2 = 0 ;
-  SquareLattice *result = 0 ;
+  SquareLattice2D *result = 0 ;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SquareLattice" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SquareLattice2D" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SquareLattice" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SquareLattice2D" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  result = (SquareLattice *)new SquareLattice(arg1,arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquareLattice, SWIG_POINTER_NEW |  0 );
+  result = (SquareLattice2D *)new SquareLattice2D(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquareLattice2D, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_new_SquareLattice__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_SquareLattice2D__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
   double val1 ;
   int ecode1 = 0 ;
-  SquareLattice *result = 0 ;
+  SquareLattice2D *result = 0 ;
   
   if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SquareLattice" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SquareLattice2D" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
-  result = (SquareLattice *)new SquareLattice(arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquareLattice, SWIG_POINTER_NEW |  0 );
+  result = (SquareLattice2D *)new SquareLattice2D(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquareLattice2D, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_new_SquareLattice(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_SquareLattice2D(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[3] = {
     0
   };
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_SquareLattice", 0, 2, argv))) SWIG_fail;
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_SquareLattice2D", 0, 2, argv))) SWIG_fail;
   --argc;
   if (argc == 1) {
     int _v;
@@ -68451,7 +68086,7 @@ SWIGINTERN PyObject *_wrap_new_SquareLattice(PyObject *self, PyObject *args) {
       _v = SWIG_CheckState(res);
     }
     if (_v) {
-      return _wrap_new_SquareLattice__SWIG_1(self, argc, argv);
+      return _wrap_new_SquareLattice2D__SWIG_1(self, argc, argv);
     }
   }
   if (argc == 2) {
@@ -68466,46 +68101,46 @@ SWIGINTERN PyObject *_wrap_new_SquareLattice(PyObject *self, PyObject *args) {
         _v = SWIG_CheckState(res);
       }
       if (_v) {
-        return _wrap_new_SquareLattice__SWIG_0(self, argc, argv);
+        return _wrap_new_SquareLattice2D__SWIG_0(self, argc, argv);
       }
     }
   }
   
 fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_SquareLattice'.\n"
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_SquareLattice2D'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    SquareLattice::SquareLattice(double,double)\n"
-    "    SquareLattice::SquareLattice(double)\n");
+    "    SquareLattice2D::SquareLattice2D(double,double)\n"
+    "    SquareLattice2D::SquareLattice2D(double)\n");
   return 0;
 }
 
 
-SWIGINTERN PyObject *_wrap_SquareLattice_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquareLattice2D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquareLattice *arg1 = (SquareLattice *) 0 ;
+  SquareLattice2D *arg1 = (SquareLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  SquareLattice *result = 0 ;
+  SquareLattice2D *result = 0 ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SquareLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SquareLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquareLattice_clone" "', argument " "1"" of type '" "SquareLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquareLattice2D_clone" "', argument " "1"" of type '" "SquareLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< SquareLattice * >(argp1);
-  result = (SquareLattice *)((SquareLattice const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquareLattice, 0 |  0 );
+  arg1 = reinterpret_cast< SquareLattice2D * >(argp1);
+  result = (SquareLattice2D *)((SquareLattice2D const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SquareLattice2D, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_SquareLattice_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquareLattice2D_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquareLattice *arg1 = (SquareLattice *) 0 ;
+  SquareLattice2D *arg1 = (SquareLattice2D *) 0 ;
   INodeVisitor *arg2 = (INodeVisitor *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -68513,18 +68148,18 @@ SWIGINTERN PyObject *_wrap_SquareLattice_accept(PyObject *SWIGUNUSEDPARM(self),
   int res2 = 0 ;
   PyObject *swig_obj[2] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "SquareLattice_accept", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SquareLattice, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "SquareLattice2D_accept", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SquareLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquareLattice_accept" "', argument " "1"" of type '" "SquareLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquareLattice2D_accept" "', argument " "1"" of type '" "SquareLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< SquareLattice * >(argp1);
+  arg1 = reinterpret_cast< SquareLattice2D * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INodeVisitor, 0 |  0 );
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SquareLattice_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SquareLattice2D_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
   }
   arg2 = reinterpret_cast< INodeVisitor * >(argp2);
-  ((SquareLattice const *)arg1)->accept(arg2);
+  ((SquareLattice2D const *)arg1)->accept(arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -68532,9 +68167,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_SquareLattice_length1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquareLattice2D_length1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquareLattice *arg1 = (SquareLattice *) 0 ;
+  SquareLattice2D *arg1 = (SquareLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -68542,12 +68177,12 @@ SWIGINTERN PyObject *_wrap_SquareLattice_length1(PyObject *SWIGUNUSEDPARM(self),
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SquareLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SquareLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquareLattice_length1" "', argument " "1"" of type '" "SquareLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquareLattice2D_length1" "', argument " "1"" of type '" "SquareLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< SquareLattice * >(argp1);
-  result = (double)((SquareLattice const *)arg1)->length1();
+  arg1 = reinterpret_cast< SquareLattice2D * >(argp1);
+  result = (double)((SquareLattice2D const *)arg1)->length1();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -68555,9 +68190,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_SquareLattice_length2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquareLattice2D_length2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquareLattice *arg1 = (SquareLattice *) 0 ;
+  SquareLattice2D *arg1 = (SquareLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -68565,12 +68200,12 @@ SWIGINTERN PyObject *_wrap_SquareLattice_length2(PyObject *SWIGUNUSEDPARM(self),
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SquareLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SquareLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquareLattice_length2" "', argument " "1"" of type '" "SquareLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquareLattice2D_length2" "', argument " "1"" of type '" "SquareLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< SquareLattice * >(argp1);
-  result = (double)((SquareLattice const *)arg1)->length2();
+  arg1 = reinterpret_cast< SquareLattice2D * >(argp1);
+  result = (double)((SquareLattice2D const *)arg1)->length2();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -68578,9 +68213,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_SquareLattice_latticeAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquareLattice2D_latticeAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquareLattice *arg1 = (SquareLattice *) 0 ;
+  SquareLattice2D *arg1 = (SquareLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -68588,12 +68223,12 @@ SWIGINTERN PyObject *_wrap_SquareLattice_latticeAngle(PyObject *SWIGUNUSEDPARM(s
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SquareLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SquareLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquareLattice_latticeAngle" "', argument " "1"" of type '" "SquareLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquareLattice2D_latticeAngle" "', argument " "1"" of type '" "SquareLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< SquareLattice * >(argp1);
-  result = (double)((SquareLattice const *)arg1)->latticeAngle();
+  arg1 = reinterpret_cast< SquareLattice2D * >(argp1);
+  result = (double)((SquareLattice2D const *)arg1)->latticeAngle();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -68601,9 +68236,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_SquareLattice_unitCellArea(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_SquareLattice2D_unitCellArea(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquareLattice *arg1 = (SquareLattice *) 0 ;
+  SquareLattice2D *arg1 = (SquareLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -68611,12 +68246,12 @@ SWIGINTERN PyObject *_wrap_SquareLattice_unitCellArea(PyObject *SWIGUNUSEDPARM(s
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SquareLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SquareLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquareLattice_unitCellArea" "', argument " "1"" of type '" "SquareLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SquareLattice2D_unitCellArea" "', argument " "1"" of type '" "SquareLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< SquareLattice * >(argp1);
-  result = (double)((SquareLattice const *)arg1)->unitCellArea();
+  arg1 = reinterpret_cast< SquareLattice2D * >(argp1);
+  result = (double)((SquareLattice2D const *)arg1)->unitCellArea();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -68624,20 +68259,20 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_SquareLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_SquareLattice2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  SquareLattice *arg1 = (SquareLattice *) 0 ;
+  SquareLattice2D *arg1 = (SquareLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SquareLattice, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_SquareLattice2D, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquareLattice" "', argument " "1"" of type '" "SquareLattice *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SquareLattice2D" "', argument " "1"" of type '" "SquareLattice2D *""'"); 
   }
-  arg1 = reinterpret_cast< SquareLattice * >(argp1);
+  arg1 = reinterpret_cast< SquareLattice2D * >(argp1);
   delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
@@ -68646,18 +68281,18 @@ fail:
 }
 
 
-SWIGINTERN PyObject *SquareLattice_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *SquareLattice2D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_SquareLattice, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_SquareLattice2D, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *SquareLattice_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *SquareLattice2D_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_HexagonalLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_HexagonalLattice2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -68666,53 +68301,53 @@ SWIGINTERN PyObject *_wrap_new_HexagonalLattice(PyObject *SWIGUNUSEDPARM(self),
   double val2 ;
   int ecode2 = 0 ;
   PyObject *swig_obj[2] ;
-  HexagonalLattice *result = 0 ;
+  HexagonalLattice2D *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_HexagonalLattice", 2, 2, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "new_HexagonalLattice2D", 2, 2, swig_obj)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_HexagonalLattice" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_HexagonalLattice2D" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_HexagonalLattice" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_HexagonalLattice2D" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  result = (HexagonalLattice *)new HexagonalLattice(arg1,arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_HexagonalLattice, SWIG_POINTER_NEW |  0 );
+  result = (HexagonalLattice2D *)new HexagonalLattice2D(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_HexagonalLattice2D, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_HexagonalLattice_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_HexagonalLattice2D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  HexagonalLattice *arg1 = (HexagonalLattice *) 0 ;
+  HexagonalLattice2D *arg1 = (HexagonalLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  HexagonalLattice *result = 0 ;
+  HexagonalLattice2D *result = 0 ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_HexagonalLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_HexagonalLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HexagonalLattice_clone" "', argument " "1"" of type '" "HexagonalLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HexagonalLattice2D_clone" "', argument " "1"" of type '" "HexagonalLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< HexagonalLattice * >(argp1);
-  result = (HexagonalLattice *)((HexagonalLattice const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_HexagonalLattice, 0 |  0 );
+  arg1 = reinterpret_cast< HexagonalLattice2D * >(argp1);
+  result = (HexagonalLattice2D *)((HexagonalLattice2D const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_HexagonalLattice2D, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_HexagonalLattice_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_HexagonalLattice2D_accept(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  HexagonalLattice *arg1 = (HexagonalLattice *) 0 ;
+  HexagonalLattice2D *arg1 = (HexagonalLattice2D *) 0 ;
   INodeVisitor *arg2 = (INodeVisitor *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -68720,18 +68355,18 @@ SWIGINTERN PyObject *_wrap_HexagonalLattice_accept(PyObject *SWIGUNUSEDPARM(self
   int res2 = 0 ;
   PyObject *swig_obj[2] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "HexagonalLattice_accept", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_HexagonalLattice, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "HexagonalLattice2D_accept", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_HexagonalLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HexagonalLattice_accept" "', argument " "1"" of type '" "HexagonalLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HexagonalLattice2D_accept" "', argument " "1"" of type '" "HexagonalLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< HexagonalLattice * >(argp1);
+  arg1 = reinterpret_cast< HexagonalLattice2D * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_INodeVisitor, 0 |  0 );
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "HexagonalLattice_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "HexagonalLattice2D_accept" "', argument " "2"" of type '" "INodeVisitor *""'"); 
   }
   arg2 = reinterpret_cast< INodeVisitor * >(argp2);
-  ((HexagonalLattice const *)arg1)->accept(arg2);
+  ((HexagonalLattice2D const *)arg1)->accept(arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -68739,9 +68374,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_HexagonalLattice_length1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_HexagonalLattice2D_length1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  HexagonalLattice *arg1 = (HexagonalLattice *) 0 ;
+  HexagonalLattice2D *arg1 = (HexagonalLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -68749,12 +68384,12 @@ SWIGINTERN PyObject *_wrap_HexagonalLattice_length1(PyObject *SWIGUNUSEDPARM(sel
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_HexagonalLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_HexagonalLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HexagonalLattice_length1" "', argument " "1"" of type '" "HexagonalLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HexagonalLattice2D_length1" "', argument " "1"" of type '" "HexagonalLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< HexagonalLattice * >(argp1);
-  result = (double)((HexagonalLattice const *)arg1)->length1();
+  arg1 = reinterpret_cast< HexagonalLattice2D * >(argp1);
+  result = (double)((HexagonalLattice2D const *)arg1)->length1();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -68762,9 +68397,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_HexagonalLattice_length2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_HexagonalLattice2D_length2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  HexagonalLattice *arg1 = (HexagonalLattice *) 0 ;
+  HexagonalLattice2D *arg1 = (HexagonalLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -68772,12 +68407,12 @@ SWIGINTERN PyObject *_wrap_HexagonalLattice_length2(PyObject *SWIGUNUSEDPARM(sel
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_HexagonalLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_HexagonalLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HexagonalLattice_length2" "', argument " "1"" of type '" "HexagonalLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HexagonalLattice2D_length2" "', argument " "1"" of type '" "HexagonalLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< HexagonalLattice * >(argp1);
-  result = (double)((HexagonalLattice const *)arg1)->length2();
+  arg1 = reinterpret_cast< HexagonalLattice2D * >(argp1);
+  result = (double)((HexagonalLattice2D const *)arg1)->length2();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -68785,9 +68420,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_HexagonalLattice_latticeAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_HexagonalLattice2D_latticeAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  HexagonalLattice *arg1 = (HexagonalLattice *) 0 ;
+  HexagonalLattice2D *arg1 = (HexagonalLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -68795,12 +68430,12 @@ SWIGINTERN PyObject *_wrap_HexagonalLattice_latticeAngle(PyObject *SWIGUNUSEDPAR
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_HexagonalLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_HexagonalLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HexagonalLattice_latticeAngle" "', argument " "1"" of type '" "HexagonalLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HexagonalLattice2D_latticeAngle" "', argument " "1"" of type '" "HexagonalLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< HexagonalLattice * >(argp1);
-  result = (double)((HexagonalLattice const *)arg1)->latticeAngle();
+  arg1 = reinterpret_cast< HexagonalLattice2D * >(argp1);
+  result = (double)((HexagonalLattice2D const *)arg1)->latticeAngle();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -68808,9 +68443,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_HexagonalLattice_unitCellArea(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_HexagonalLattice2D_unitCellArea(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  HexagonalLattice *arg1 = (HexagonalLattice *) 0 ;
+  HexagonalLattice2D *arg1 = (HexagonalLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -68818,12 +68453,12 @@ SWIGINTERN PyObject *_wrap_HexagonalLattice_unitCellArea(PyObject *SWIGUNUSEDPAR
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_HexagonalLattice, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_HexagonalLattice2D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HexagonalLattice_unitCellArea" "', argument " "1"" of type '" "HexagonalLattice const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "HexagonalLattice2D_unitCellArea" "', argument " "1"" of type '" "HexagonalLattice2D const *""'"); 
   }
-  arg1 = reinterpret_cast< HexagonalLattice * >(argp1);
-  result = (double)((HexagonalLattice const *)arg1)->unitCellArea();
+  arg1 = reinterpret_cast< HexagonalLattice2D * >(argp1);
+  result = (double)((HexagonalLattice2D const *)arg1)->unitCellArea();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -68831,20 +68466,20 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_HexagonalLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_HexagonalLattice2D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  HexagonalLattice *arg1 = (HexagonalLattice *) 0 ;
+  HexagonalLattice2D *arg1 = (HexagonalLattice2D *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_HexagonalLattice, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_HexagonalLattice2D, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_HexagonalLattice" "', argument " "1"" of type '" "HexagonalLattice *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_HexagonalLattice2D" "', argument " "1"" of type '" "HexagonalLattice2D *""'"); 
   }
-  arg1 = reinterpret_cast< HexagonalLattice * >(argp1);
+  arg1 = reinterpret_cast< HexagonalLattice2D * >(argp1);
   delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
@@ -68853,18 +68488,18 @@ fail:
 }
 
 
-SWIGINTERN PyObject *HexagonalLattice_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *HexagonalLattice2D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_HexagonalLattice, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_HexagonalLattice2D, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *HexagonalLattice_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *HexagonalLattice2D_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_createCubicLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_CubicLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double val1 ;
@@ -68876,10 +68511,10 @@ SWIGINTERN PyObject *_wrap_createCubicLattice(PyObject *SWIGUNUSEDPARM(self), Py
   swig_obj[0] = args;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "createCubicLattice" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "CubicLattice" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
-  result = bake::createCubicLattice(arg1);
+  result = bake::CubicLattice(arg1);
   resultobj = SWIG_NewPointerObj((new Lattice3D(static_cast< const Lattice3D& >(result))), SWIGTYPE_p_Lattice3D, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
@@ -68887,7 +68522,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_createFCCLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_FCCLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double val1 ;
@@ -68899,10 +68534,10 @@ SWIGINTERN PyObject *_wrap_createFCCLattice(PyObject *SWIGUNUSEDPARM(self), PyOb
   swig_obj[0] = args;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "createFCCLattice" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "FCCLattice" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
-  result = bake::createFCCLattice(arg1);
+  result = bake::FCCLattice(arg1);
   resultobj = SWIG_NewPointerObj((new Lattice3D(static_cast< const Lattice3D& >(result))), SWIGTYPE_p_Lattice3D, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
@@ -68910,7 +68545,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_createHexagonalLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_HexagonalLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -68921,18 +68556,18 @@ SWIGINTERN PyObject *_wrap_createHexagonalLattice(PyObject *SWIGUNUSEDPARM(self)
   PyObject *swig_obj[2] ;
   SwigValueWrapper< Lattice3D > result;
   
-  if (!SWIG_Python_UnpackTuple(args, "createHexagonalLattice", 2, 2, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "HexagonalLattice", 2, 2, swig_obj)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "createHexagonalLattice" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "HexagonalLattice" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "createHexagonalLattice" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "HexagonalLattice" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  result = bake::createHexagonalLattice(arg1,arg2);
+  result = bake::HexagonalLattice(arg1,arg2);
   resultobj = SWIG_NewPointerObj((new Lattice3D(static_cast< const Lattice3D& >(result))), SWIGTYPE_p_Lattice3D, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
@@ -68940,7 +68575,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_createHCPLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_HCPLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -68951,18 +68586,18 @@ SWIGINTERN PyObject *_wrap_createHCPLattice(PyObject *SWIGUNUSEDPARM(self), PyOb
   PyObject *swig_obj[2] ;
   SwigValueWrapper< Lattice3D > result;
   
-  if (!SWIG_Python_UnpackTuple(args, "createHCPLattice", 2, 2, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "HCPLattice", 2, 2, swig_obj)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "createHCPLattice" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "HCPLattice" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "createHCPLattice" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "HCPLattice" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  result = bake::createHCPLattice(arg1,arg2);
+  result = bake::HCPLattice(arg1,arg2);
   resultobj = SWIG_NewPointerObj((new Lattice3D(static_cast< const Lattice3D& >(result))), SWIGTYPE_p_Lattice3D, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
@@ -68970,7 +68605,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_createTetragonalLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_TetragonalLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -68981,18 +68616,18 @@ SWIGINTERN PyObject *_wrap_createTetragonalLattice(PyObject *SWIGUNUSEDPARM(self
   PyObject *swig_obj[2] ;
   SwigValueWrapper< Lattice3D > result;
   
-  if (!SWIG_Python_UnpackTuple(args, "createTetragonalLattice", 2, 2, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "TetragonalLattice", 2, 2, swig_obj)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "createTetragonalLattice" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "TetragonalLattice" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "createTetragonalLattice" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TetragonalLattice" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  result = bake::createTetragonalLattice(arg1,arg2);
+  result = bake::TetragonalLattice(arg1,arg2);
   resultobj = SWIG_NewPointerObj((new Lattice3D(static_cast< const Lattice3D& >(result))), SWIGTYPE_p_Lattice3D, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
@@ -69000,7 +68635,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_createBCTLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_BCTLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -69011,18 +68646,18 @@ SWIGINTERN PyObject *_wrap_createBCTLattice(PyObject *SWIGUNUSEDPARM(self), PyOb
   PyObject *swig_obj[2] ;
   SwigValueWrapper< Lattice3D > result;
   
-  if (!SWIG_Python_UnpackTuple(args, "createBCTLattice", 2, 2, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "BCTLattice", 2, 2, swig_obj)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "createBCTLattice" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "BCTLattice" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "createBCTLattice" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "BCTLattice" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  result = bake::createBCTLattice(arg1,arg2);
+  result = bake::BCTLattice(arg1,arg2);
   resultobj = SWIG_NewPointerObj((new Lattice3D(static_cast< const Lattice3D& >(result))), SWIGTYPE_p_Lattice3D, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
@@ -72919,8 +72554,7 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "InterferenceFunction1DLattice_swigregister", InterferenceFunction1DLattice_swigregister, METH_O, NULL},
 	 { "InterferenceFunction1DLattice_swiginit", InterferenceFunction1DLattice_swiginit, METH_VARARGS, NULL},
-	 { "new_InterferenceFunction2DLattice", _wrap_new_InterferenceFunction2DLattice, METH_VARARGS, "\n"
-		"InterferenceFunction2DLattice(double length_1, double length_2, double alpha, double xi)\n"
+	 { "new_InterferenceFunction2DLattice", _wrap_new_InterferenceFunction2DLattice, METH_O, "\n"
 		"new_InterferenceFunction2DLattice(Lattice2D lattice) -> InterferenceFunction2DLattice\n"
 		"InterferenceFunction2DLattice::InterferenceFunction2DLattice(const Lattice2D &lattice)\n"
 		"\n"
@@ -72990,29 +72624,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "InterferenceFunction2DLattice_swigregister", InterferenceFunction2DLattice_swigregister, METH_O, NULL},
 	 { "InterferenceFunction2DLattice_swiginit", InterferenceFunction2DLattice_swiginit, METH_VARARGS, NULL},
 	 { "new_InterferenceFunction2DParaCrystal", _wrap_new_InterferenceFunction2DParaCrystal, METH_VARARGS, "\n"
-		"InterferenceFunction2DParaCrystal(Lattice2D lattice, double damping_length, double domain_size_1, double domain_size_2)\n"
-		"new_InterferenceFunction2DParaCrystal(double length_1, double length_2, double alpha, double xi, double damping_length) -> InterferenceFunction2DParaCrystal\n"
-		"InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(double length_1, double length_2, double alpha, double xi, double damping_length)\n"
-		"\n"
-		"Constructor of interference function of two-dimensional paracrystal.\n"
-		"\n"
-		"Parameters:\n"
-		"-----------\n"
-		"\n"
-		"length_1: \n"
-		"length of first lattice vector in nanometers\n"
-		"\n"
-		"length_2: \n"
-		"length of second lattice vector in nanometers\n"
-		"\n"
-		"alpha: \n"
-		"angle between lattice vectors in radians\n"
-		"\n"
-		"xi: \n"
-		"rotation of lattice with respect to x-axis (beam direction) in radians\n"
-		"\n"
-		"damping_length: \n"
-		"the damping (coherence) length of the paracrystal in nanometers \n"
+		"new_InterferenceFunction2DParaCrystal(Lattice2D lattice, double damping_length, double domain_size_1, double domain_size_2) -> InterferenceFunction2DParaCrystal\n"
+		"InterferenceFunction2DParaCrystal::InterferenceFunction2DParaCrystal(const Lattice2D &lattice, double damping_length, double domain_size_1, double domain_size_2)\n"
 		"\n"
 		""},
 	 { "delete_InterferenceFunction2DParaCrystal", _wrap_delete_InterferenceFunction2DParaCrystal, METH_O, "\n"
@@ -73281,26 +72894,16 @@ static PyMethodDef SwigMethods[] = {
 	 { "InterferenceFunction3DLattice_swigregister", InterferenceFunction3DLattice_swigregister, METH_O, NULL},
 	 { "InterferenceFunction3DLattice_swiginit", InterferenceFunction3DLattice_swiginit, METH_VARARGS, NULL},
 	 { "new_InterferenceFunctionFinite2DLattice", _wrap_new_InterferenceFunctionFinite2DLattice, METH_VARARGS, "\n"
-		"InterferenceFunctionFinite2DLattice(Lattice2D lattice, unsigned int N_1, unsigned int N_2)\n"
-		"new_InterferenceFunctionFinite2DLattice(double length_1, double length_2, double alpha, double xi, unsigned int N_1, unsigned int N_2) -> InterferenceFunctionFinite2DLattice\n"
-		"InterferenceFunctionFinite2DLattice::InterferenceFunctionFinite2DLattice(double length_1, double length_2, double alpha, double xi, unsigned N_1, unsigned N_2)\n"
+		"new_InterferenceFunctionFinite2DLattice(Lattice2D lattice, unsigned int N_1, unsigned int N_2) -> InterferenceFunctionFinite2DLattice\n"
+		"InterferenceFunctionFinite2DLattice::InterferenceFunctionFinite2DLattice(const Lattice2D &lattice, unsigned N_1, unsigned N_2)\n"
 		"\n"
 		"Constructor of two-dimensional finite lattice interference function.\n"
 		"\n"
 		"Parameters:\n"
 		"-----------\n"
 		"\n"
-		"length_1: \n"
-		"length of first lattice vector in nanometers\n"
-		"\n"
-		"length_2: \n"
-		"length of second lattice vector in nanometers\n"
-		"\n"
-		"alpha: \n"
-		"angle between lattice vectors in radians\n"
-		"\n"
-		"xi: \n"
-		"rotation of lattice with respect to x-axis (beam direction) in radians\n"
+		"lattice: \n"
+		"object specifying a 2d lattice structure\n"
 		"\n"
 		"N_1: \n"
 		"number of lattice cells in the first lattice direction\n"
@@ -75559,158 +75162,158 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "delete_Lattice2D", _wrap_delete_Lattice2D, METH_O, "delete_Lattice2D(Lattice2D self)"},
 	 { "Lattice2D_swigregister", Lattice2D_swigregister, METH_O, NULL},
-	 { "new_BasicLattice", _wrap_new_BasicLattice, METH_VARARGS, "\n"
-		"new_BasicLattice(double length1, double length2, double angle, double xi) -> BasicLattice\n"
-		"BasicLattice::BasicLattice(double length1, double length2, double angle, double xi)\n"
+	 { "new_BasicLattice2D", _wrap_new_BasicLattice2D, METH_VARARGS, "\n"
+		"new_BasicLattice2D(double length1, double length2, double angle, double xi) -> BasicLattice2D\n"
+		"BasicLattice2D::BasicLattice2D(double length1, double length2, double angle, double xi)\n"
 		"\n"
 		""},
-	 { "BasicLattice_clone", _wrap_BasicLattice_clone, METH_O, "\n"
-		"BasicLattice_clone(BasicLattice self) -> BasicLattice\n"
-		"BasicLattice * BasicLattice::clone() const\n"
+	 { "BasicLattice2D_clone", _wrap_BasicLattice2D_clone, METH_O, "\n"
+		"BasicLattice2D_clone(BasicLattice2D self) -> BasicLattice2D\n"
+		"BasicLattice2D * BasicLattice2D::clone() const\n"
 		"\n"
 		""},
-	 { "BasicLattice_accept", _wrap_BasicLattice_accept, METH_VARARGS, "\n"
-		"BasicLattice_accept(BasicLattice self, INodeVisitor * visitor)\n"
-		"void BasicLattice::accept(INodeVisitor *visitor) const final\n"
+	 { "BasicLattice2D_accept", _wrap_BasicLattice2D_accept, METH_VARARGS, "\n"
+		"BasicLattice2D_accept(BasicLattice2D self, INodeVisitor * visitor)\n"
+		"void BasicLattice2D::accept(INodeVisitor *visitor) const final\n"
 		"\n"
 		""},
-	 { "BasicLattice_length1", _wrap_BasicLattice_length1, METH_O, "\n"
-		"BasicLattice_length1(BasicLattice self) -> double\n"
-		"virtual double BasicLattice::length1() const\n"
+	 { "BasicLattice2D_length1", _wrap_BasicLattice2D_length1, METH_O, "\n"
+		"BasicLattice2D_length1(BasicLattice2D self) -> double\n"
+		"virtual double BasicLattice2D::length1() const\n"
 		"\n"
 		""},
-	 { "BasicLattice_length2", _wrap_BasicLattice_length2, METH_O, "\n"
-		"BasicLattice_length2(BasicLattice self) -> double\n"
-		"virtual double BasicLattice::length2() const\n"
+	 { "BasicLattice2D_length2", _wrap_BasicLattice2D_length2, METH_O, "\n"
+		"BasicLattice2D_length2(BasicLattice2D self) -> double\n"
+		"virtual double BasicLattice2D::length2() const\n"
 		"\n"
 		""},
-	 { "BasicLattice_latticeAngle", _wrap_BasicLattice_latticeAngle, METH_O, "\n"
-		"BasicLattice_latticeAngle(BasicLattice self) -> double\n"
-		"virtual double BasicLattice::latticeAngle() const\n"
+	 { "BasicLattice2D_latticeAngle", _wrap_BasicLattice2D_latticeAngle, METH_O, "\n"
+		"BasicLattice2D_latticeAngle(BasicLattice2D self) -> double\n"
+		"virtual double BasicLattice2D::latticeAngle() const\n"
 		"\n"
 		""},
-	 { "BasicLattice_unitCellArea", _wrap_BasicLattice_unitCellArea, METH_O, "\n"
-		"BasicLattice_unitCellArea(BasicLattice self) -> double\n"
-		"double BasicLattice::unitCellArea() const\n"
+	 { "BasicLattice2D_unitCellArea", _wrap_BasicLattice2D_unitCellArea, METH_O, "\n"
+		"BasicLattice2D_unitCellArea(BasicLattice2D self) -> double\n"
+		"double BasicLattice2D::unitCellArea() const\n"
 		"\n"
 		""},
-	 { "delete_BasicLattice", _wrap_delete_BasicLattice, METH_O, "delete_BasicLattice(BasicLattice self)"},
-	 { "BasicLattice_swigregister", BasicLattice_swigregister, METH_O, NULL},
-	 { "BasicLattice_swiginit", BasicLattice_swiginit, METH_VARARGS, NULL},
-	 { "new_SquareLattice", _wrap_new_SquareLattice, METH_VARARGS, "\n"
-		"SquareLattice(double length, double xi=0.0)\n"
-		"SquareLattice::SquareLattice(double length, double xi=0.0)\n"
+	 { "delete_BasicLattice2D", _wrap_delete_BasicLattice2D, METH_O, "delete_BasicLattice2D(BasicLattice2D self)"},
+	 { "BasicLattice2D_swigregister", BasicLattice2D_swigregister, METH_O, NULL},
+	 { "BasicLattice2D_swiginit", BasicLattice2D_swiginit, METH_VARARGS, NULL},
+	 { "new_SquareLattice2D", _wrap_new_SquareLattice2D, METH_VARARGS, "\n"
+		"SquareLattice2D(double length, double xi=0.0)\n"
+		"SquareLattice2D::SquareLattice2D(double length, double xi=0.0)\n"
 		"\n"
 		""},
-	 { "SquareLattice_clone", _wrap_SquareLattice_clone, METH_O, "\n"
-		"SquareLattice_clone(SquareLattice self) -> SquareLattice\n"
-		"SquareLattice * SquareLattice::clone() const\n"
+	 { "SquareLattice2D_clone", _wrap_SquareLattice2D_clone, METH_O, "\n"
+		"SquareLattice2D_clone(SquareLattice2D self) -> SquareLattice2D\n"
+		"SquareLattice2D * SquareLattice2D::clone() const\n"
 		"\n"
 		""},
-	 { "SquareLattice_accept", _wrap_SquareLattice_accept, METH_VARARGS, "\n"
-		"SquareLattice_accept(SquareLattice self, INodeVisitor * visitor)\n"
-		"void SquareLattice::accept(INodeVisitor *visitor) const final\n"
+	 { "SquareLattice2D_accept", _wrap_SquareLattice2D_accept, METH_VARARGS, "\n"
+		"SquareLattice2D_accept(SquareLattice2D self, INodeVisitor * visitor)\n"
+		"void SquareLattice2D::accept(INodeVisitor *visitor) const final\n"
 		"\n"
 		""},
-	 { "SquareLattice_length1", _wrap_SquareLattice_length1, METH_O, "\n"
-		"SquareLattice_length1(SquareLattice self) -> double\n"
-		"virtual double SquareLattice::length1() const\n"
+	 { "SquareLattice2D_length1", _wrap_SquareLattice2D_length1, METH_O, "\n"
+		"SquareLattice2D_length1(SquareLattice2D self) -> double\n"
+		"virtual double SquareLattice2D::length1() const\n"
 		"\n"
 		""},
-	 { "SquareLattice_length2", _wrap_SquareLattice_length2, METH_O, "\n"
-		"SquareLattice_length2(SquareLattice self) -> double\n"
-		"virtual double SquareLattice::length2() const\n"
+	 { "SquareLattice2D_length2", _wrap_SquareLattice2D_length2, METH_O, "\n"
+		"SquareLattice2D_length2(SquareLattice2D self) -> double\n"
+		"virtual double SquareLattice2D::length2() const\n"
 		"\n"
 		""},
-	 { "SquareLattice_latticeAngle", _wrap_SquareLattice_latticeAngle, METH_O, "\n"
-		"SquareLattice_latticeAngle(SquareLattice self) -> double\n"
-		"double SquareLattice::latticeAngle() const\n"
+	 { "SquareLattice2D_latticeAngle", _wrap_SquareLattice2D_latticeAngle, METH_O, "\n"
+		"SquareLattice2D_latticeAngle(SquareLattice2D self) -> double\n"
+		"double SquareLattice2D::latticeAngle() const\n"
 		"\n"
 		""},
-	 { "SquareLattice_unitCellArea", _wrap_SquareLattice_unitCellArea, METH_O, "\n"
-		"SquareLattice_unitCellArea(SquareLattice self) -> double\n"
-		"double SquareLattice::unitCellArea() const\n"
+	 { "SquareLattice2D_unitCellArea", _wrap_SquareLattice2D_unitCellArea, METH_O, "\n"
+		"SquareLattice2D_unitCellArea(SquareLattice2D self) -> double\n"
+		"double SquareLattice2D::unitCellArea() const\n"
 		"\n"
 		""},
-	 { "delete_SquareLattice", _wrap_delete_SquareLattice, METH_O, "delete_SquareLattice(SquareLattice self)"},
-	 { "SquareLattice_swigregister", SquareLattice_swigregister, METH_O, NULL},
-	 { "SquareLattice_swiginit", SquareLattice_swiginit, METH_VARARGS, NULL},
-	 { "new_HexagonalLattice", _wrap_new_HexagonalLattice, METH_VARARGS, "\n"
-		"new_HexagonalLattice(double length, double xi) -> HexagonalLattice\n"
-		"HexagonalLattice::HexagonalLattice(double length, double xi)\n"
+	 { "delete_SquareLattice2D", _wrap_delete_SquareLattice2D, METH_O, "delete_SquareLattice2D(SquareLattice2D self)"},
+	 { "SquareLattice2D_swigregister", SquareLattice2D_swigregister, METH_O, NULL},
+	 { "SquareLattice2D_swiginit", SquareLattice2D_swiginit, METH_VARARGS, NULL},
+	 { "new_HexagonalLattice2D", _wrap_new_HexagonalLattice2D, METH_VARARGS, "\n"
+		"new_HexagonalLattice2D(double length, double xi) -> HexagonalLattice2D\n"
+		"HexagonalLattice2D::HexagonalLattice2D(double length, double xi)\n"
 		"\n"
 		""},
-	 { "HexagonalLattice_clone", _wrap_HexagonalLattice_clone, METH_O, "\n"
-		"HexagonalLattice_clone(HexagonalLattice self) -> HexagonalLattice\n"
-		"HexagonalLattice * HexagonalLattice::clone() const\n"
+	 { "HexagonalLattice2D_clone", _wrap_HexagonalLattice2D_clone, METH_O, "\n"
+		"HexagonalLattice2D_clone(HexagonalLattice2D self) -> HexagonalLattice2D\n"
+		"HexagonalLattice2D * HexagonalLattice2D::clone() const\n"
 		"\n"
 		""},
-	 { "HexagonalLattice_accept", _wrap_HexagonalLattice_accept, METH_VARARGS, "\n"
-		"HexagonalLattice_accept(HexagonalLattice self, INodeVisitor * visitor)\n"
-		"void HexagonalLattice::accept(INodeVisitor *visitor) const final\n"
+	 { "HexagonalLattice2D_accept", _wrap_HexagonalLattice2D_accept, METH_VARARGS, "\n"
+		"HexagonalLattice2D_accept(HexagonalLattice2D self, INodeVisitor * visitor)\n"
+		"void HexagonalLattice2D::accept(INodeVisitor *visitor) const final\n"
 		"\n"
 		""},
-	 { "HexagonalLattice_length1", _wrap_HexagonalLattice_length1, METH_O, "\n"
-		"HexagonalLattice_length1(HexagonalLattice self) -> double\n"
-		"virtual double HexagonalLattice::length1() const\n"
+	 { "HexagonalLattice2D_length1", _wrap_HexagonalLattice2D_length1, METH_O, "\n"
+		"HexagonalLattice2D_length1(HexagonalLattice2D self) -> double\n"
+		"virtual double HexagonalLattice2D::length1() const\n"
 		"\n"
 		""},
-	 { "HexagonalLattice_length2", _wrap_HexagonalLattice_length2, METH_O, "\n"
-		"HexagonalLattice_length2(HexagonalLattice self) -> double\n"
-		"virtual double HexagonalLattice::length2() const\n"
+	 { "HexagonalLattice2D_length2", _wrap_HexagonalLattice2D_length2, METH_O, "\n"
+		"HexagonalLattice2D_length2(HexagonalLattice2D self) -> double\n"
+		"virtual double HexagonalLattice2D::length2() const\n"
 		"\n"
 		""},
-	 { "HexagonalLattice_latticeAngle", _wrap_HexagonalLattice_latticeAngle, METH_O, "\n"
-		"HexagonalLattice_latticeAngle(HexagonalLattice self) -> double\n"
-		"double HexagonalLattice::latticeAngle() const\n"
+	 { "HexagonalLattice2D_latticeAngle", _wrap_HexagonalLattice2D_latticeAngle, METH_O, "\n"
+		"HexagonalLattice2D_latticeAngle(HexagonalLattice2D self) -> double\n"
+		"double HexagonalLattice2D::latticeAngle() const\n"
 		"\n"
 		""},
-	 { "HexagonalLattice_unitCellArea", _wrap_HexagonalLattice_unitCellArea, METH_O, "\n"
-		"HexagonalLattice_unitCellArea(HexagonalLattice self) -> double\n"
-		"double HexagonalLattice::unitCellArea() const\n"
+	 { "HexagonalLattice2D_unitCellArea", _wrap_HexagonalLattice2D_unitCellArea, METH_O, "\n"
+		"HexagonalLattice2D_unitCellArea(HexagonalLattice2D self) -> double\n"
+		"double HexagonalLattice2D::unitCellArea() const\n"
 		"\n"
 		""},
-	 { "delete_HexagonalLattice", _wrap_delete_HexagonalLattice, METH_O, "delete_HexagonalLattice(HexagonalLattice self)"},
-	 { "HexagonalLattice_swigregister", HexagonalLattice_swigregister, METH_O, NULL},
-	 { "HexagonalLattice_swiginit", HexagonalLattice_swiginit, METH_VARARGS, NULL},
-	 { "createCubicLattice", _wrap_createCubicLattice, METH_O, "\n"
-		"createCubicLattice(double a) -> Lattice3D\n"
-		"Lattice3D bake::createCubicLattice(double a)\n"
+	 { "delete_HexagonalLattice2D", _wrap_delete_HexagonalLattice2D, METH_O, "delete_HexagonalLattice2D(HexagonalLattice2D self)"},
+	 { "HexagonalLattice2D_swigregister", HexagonalLattice2D_swigregister, METH_O, NULL},
+	 { "HexagonalLattice2D_swiginit", HexagonalLattice2D_swiginit, METH_VARARGS, NULL},
+	 { "CubicLattice", _wrap_CubicLattice, METH_O, "\n"
+		"CubicLattice(double a) -> Lattice3D\n"
+		"Lattice3D bake::CubicLattice(double a)\n"
 		"\n"
 		"Returns a primitive cubic (cP) lattice with edge length a. \n"
 		"\n"
 		""},
-	 { "createFCCLattice", _wrap_createFCCLattice, METH_O, "\n"
-		"createFCCLattice(double a) -> Lattice3D\n"
-		"Lattice3D bake::createFCCLattice(double a)\n"
+	 { "FCCLattice", _wrap_FCCLattice, METH_O, "\n"
+		"FCCLattice(double a) -> Lattice3D\n"
+		"Lattice3D bake::FCCLattice(double a)\n"
 		"\n"
 		"Returns a face-centered cubic (cF) lattice with edge length a. \n"
 		"\n"
 		""},
-	 { "createHexagonalLattice", _wrap_createHexagonalLattice, METH_VARARGS, "\n"
-		"createHexagonalLattice(double a, double c) -> Lattice3D\n"
-		"Lattice3D bake::createHexagonalLattice(double a, double c)\n"
+	 { "HexagonalLattice", _wrap_HexagonalLattice, METH_VARARGS, "\n"
+		"HexagonalLattice(double a, double c) -> Lattice3D\n"
+		"Lattice3D bake::HexagonalLattice(double a, double c)\n"
 		"\n"
 		"Returns a primitive hexagonal (hP) lattice with hexagonal edge a and height c. \n"
 		"\n"
 		""},
-	 { "createHCPLattice", _wrap_createHCPLattice, METH_VARARGS, "\n"
-		"createHCPLattice(double a, double c) -> Lattice3D\n"
-		"Lattice3D bake::createHCPLattice(double a, double c)\n"
+	 { "HCPLattice", _wrap_HCPLattice, METH_VARARGS, "\n"
+		"HCPLattice(double a, double c) -> Lattice3D\n"
+		"Lattice3D bake::HCPLattice(double a, double c)\n"
 		"\n"
 		"TODO: Clarify how this is meant: HCP is not a Bravais lattice. \n"
 		"\n"
 		""},
-	 { "createTetragonalLattice", _wrap_createTetragonalLattice, METH_VARARGS, "\n"
-		"createTetragonalLattice(double a, double c) -> Lattice3D\n"
-		"Lattice3D bake::createTetragonalLattice(double a, double c)\n"
+	 { "TetragonalLattice", _wrap_TetragonalLattice, METH_VARARGS, "\n"
+		"TetragonalLattice(double a, double c) -> Lattice3D\n"
+		"Lattice3D bake::TetragonalLattice(double a, double c)\n"
 		"\n"
 		"Returns a primitive tetragonal (tP) lattice with square base edge a and height c. \n"
 		"\n"
 		""},
-	 { "createBCTLattice", _wrap_createBCTLattice, METH_VARARGS, "\n"
-		"createBCTLattice(double a, double c) -> Lattice3D\n"
-		"Lattice3D bake::createBCTLattice(double a, double c)\n"
+	 { "BCTLattice", _wrap_BCTLattice, METH_VARARGS, "\n"
+		"BCTLattice(double a, double c) -> Lattice3D\n"
+		"Lattice3D bake::BCTLattice(double a, double c)\n"
 		"\n"
 		"Returns a body-centered cubic (cI) lattice with edge length a. TODO: Clarify meaning of c \n"
 		"\n"
@@ -76134,6 +75737,15 @@ static void *_p_ParticleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemo
 static void *_p_Lattice2DTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *) ((Lattice2D *) x));
 }
+static void *_p_BasicLattice2DTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (INode *)(Lattice2D *) ((BasicLattice2D *) x));
+}
+static void *_p_SquareLattice2DTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (INode *)(Lattice2D *) ((SquareLattice2D *) x));
+}
+static void *_p_HexagonalLattice2DTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((IParameterized *) (INode *)(Lattice2D *) ((HexagonalLattice2D *) x));
+}
 static void *_p_IFTDecayFunction1DTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *) ((IFTDecayFunction1D *) x));
 }
@@ -76281,15 +75893,6 @@ static void *_p_FormFactorLongBoxLorentzTo_p_IParameterized(void *x, int *SWIGUN
 static void *_p_FormFactorSawtoothRippleLorentzTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *)(ISample *)(IFormFactor *)(IFormFactorBorn *)(IProfileRipple *)(ISawtoothRipple *) ((FormFactorSawtoothRippleLorentz *) x));
 }
-static void *_p_BasicLatticeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(Lattice2D *) ((BasicLattice *) x));
-}
-static void *_p_SquareLatticeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(Lattice2D *) ((SquareLattice *) x));
-}
-static void *_p_HexagonalLatticeTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((IParameterized *) (INode *)(Lattice2D *) ((HexagonalLattice *) x));
-}
 static void *_p_FTDistribution1DTriangleTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *)(IFTDistribution1D *) ((FTDistribution1DTriangle *) x));
 }
@@ -76299,14 +75902,14 @@ static void *_p_FTDecayFunction1DTriangleTo_p_IParameterized(void *x, int *SWIGU
 static void *_p_RotationEulerTo_p_IParameterized(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParameterized *) (INode *)(IRotation *) ((RotationEuler *) x));
 }
-static void *_p_BasicLatticeTo_p_Lattice2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((Lattice2D *)  ((BasicLattice *) x));
+static void *_p_BasicLattice2DTo_p_Lattice2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((Lattice2D *)  ((BasicLattice2D *) x));
 }
-static void *_p_SquareLatticeTo_p_Lattice2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((Lattice2D *)  ((SquareLattice *) x));
+static void *_p_SquareLattice2DTo_p_Lattice2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((Lattice2D *)  ((SquareLattice2D *) x));
 }
-static void *_p_HexagonalLatticeTo_p_Lattice2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((Lattice2D *)  ((HexagonalLattice *) x));
+static void *_p_HexagonalLattice2DTo_p_Lattice2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((Lattice2D *)  ((HexagonalLattice2D *) x));
 }
 static void *_p_ParticleCompositionTo_p_IParticle(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IParticle *)  ((ParticleComposition *) x));
@@ -76518,6 +76121,15 @@ static void *_p_ParticleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory))
 static void *_p_Lattice2DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((Lattice2D *) x));
 }
+static void *_p_BasicLattice2DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Lattice2D *) ((BasicLattice2D *) x));
+}
+static void *_p_SquareLattice2DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Lattice2D *) ((SquareLattice2D *) x));
+}
+static void *_p_HexagonalLattice2DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (Lattice2D *) ((HexagonalLattice2D *) x));
+}
 static void *_p_IFTDecayFunction1DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *)  ((IFTDecayFunction1D *) x));
 }
@@ -76665,15 +76277,6 @@ static void *_p_FormFactorLongBoxLorentzTo_p_ICloneable(void *x, int *SWIGUNUSED
 static void *_p_FormFactorSawtoothRippleLorentzTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IProfileRipple *)(ISawtoothRipple *) ((FormFactorSawtoothRippleLorentz *) x));
 }
-static void *_p_BasicLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (Lattice2D *) ((BasicLattice *) x));
-}
-static void *_p_SquareLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (Lattice2D *) ((SquareLattice *) x));
-}
-static void *_p_HexagonalLatticeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (Lattice2D *) ((HexagonalLattice *) x));
-}
 static void *_p_FTDistribution1DTriangleTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IFTDistribution1D *) ((FTDistribution1DTriangle *) x));
 }
@@ -76884,6 +76487,15 @@ static void *_p_ParticleTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
 static void *_p_Lattice2DTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *)  ((Lattice2D *) x));
 }
+static void *_p_BasicLattice2DTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INode *) (Lattice2D *) ((BasicLattice2D *) x));
+}
+static void *_p_SquareLattice2DTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INode *) (Lattice2D *) ((SquareLattice2D *) x));
+}
+static void *_p_HexagonalLattice2DTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INode *) (Lattice2D *) ((HexagonalLattice2D *) x));
+}
 static void *_p_IFTDecayFunction1DTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *)  ((IFTDecayFunction1D *) x));
 }
@@ -77031,15 +76643,6 @@ static void *_p_FormFactorLongBoxLorentzTo_p_INode(void *x, int *SWIGUNUSEDPARM(
 static void *_p_FormFactorSawtoothRippleLorentzTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISample *)(IFormFactor *)(IFormFactorBorn *)(IProfileRipple *)(ISawtoothRipple *) ((FormFactorSawtoothRippleLorentz *) x));
 }
-static void *_p_BasicLatticeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (Lattice2D *) ((BasicLattice *) x));
-}
-static void *_p_SquareLatticeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (Lattice2D *) ((SquareLattice *) x));
-}
-static void *_p_HexagonalLatticeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (Lattice2D *) ((HexagonalLattice *) x));
-}
 static void *_p_FTDecayFunction1DTriangleTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (IFTDecayFunction1D *) ((FTDecayFunction1DTriangle *) x));
 }
@@ -77481,7 +77084,7 @@ static void *_p_FTDistribution2DGateTo_p_IFTDistribution2D(void *x, int *SWIGUNU
 static void *_p_FTDistribution2DConeTo_p_IFTDistribution2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IFTDistribution2D *)  ((FTDistribution2DCone *) x));
 }
-static swig_type_info _swigt__p_BasicLattice = {"_p_BasicLattice", "BasicLattice *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_BasicLattice2D = {"_p_BasicLattice2D", "BasicLattice2D *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BasicVector3DT_double_t = {"_p_BasicVector3DT_double_t", "std::vector< BasicVector3D< double > >::value_type *|kvector_t *|BasicVector3D< double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BasicVector3DT_int_t = {"_p_BasicVector3DT_int_t", "ivector_t *|BasicVector3D< int > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BasicVector3DT_std__complexT_double_t_t = {"_p_BasicVector3DT_std__complexT_double_t_t", "BasicVector3D< std::complex< double > > *|std::vector< BasicVector3D< std::complex< double > > >::value_type *|cvector_t *", 0, 0, (void*)0, 0};
@@ -77542,7 +77145,7 @@ static swig_type_info _swigt__p_FormFactorTruncatedSphere = {"_p_FormFactorTrunc
 static swig_type_info _swigt__p_FormFactorTruncatedSpheroid = {"_p_FormFactorTruncatedSpheroid", "FormFactorTruncatedSpheroid *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FormFactorWeighted = {"_p_FormFactorWeighted", "FormFactorWeighted *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_GaussFisherPeakShape = {"_p_GaussFisherPeakShape", "GaussFisherPeakShape *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_HexagonalLattice = {"_p_HexagonalLattice", "HexagonalLattice *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_HexagonalLattice2D = {"_p_HexagonalLattice2D", "HexagonalLattice2D *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IAbstractParticle = {"_p_IAbstractParticle", "IAbstractParticle *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ICloneable = {"_p_ICloneable", "ICloneable *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ICosineRipple = {"_p_ICosineRipple", "ICosineRipple *", 0, 0, (void*)0, 0};
@@ -77617,7 +77220,7 @@ static swig_type_info _swigt__p_SimpleSelectionRule = {"_p_SimpleSelectionRule",
 static swig_type_info _swigt__p_SimulationOptions = {"_p_SimulationOptions", "SimulationOptions *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SlicedParticle = {"_p_SlicedParticle", "SlicedParticle *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SlicingEffects = {"_p_SlicingEffects", "SlicingEffects *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_SquareLattice = {"_p_SquareLattice", "SquareLattice *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_SquareLattice2D = {"_p_SquareLattice2D", "SquareLattice2D *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ThreadInfo = {"_p_ThreadInfo", "ThreadInfo *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Transform3D = {"_p_Transform3D", "Transform3D *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_WavevectorInfo = {"_p_WavevectorInfo", "WavevectorInfo *", 0, 0, (void*)0, 0};
@@ -77680,7 +77283,7 @@ static swig_type_info _swigt__p_unsigned_short = {"_p_unsigned_short", "unsigned
 static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0, 0, (void*)0, 0};
 
 static swig_type_info *swig_type_initial[] = {
-  &_swigt__p_BasicLattice,
+  &_swigt__p_BasicLattice2D,
   &_swigt__p_BasicVector3DT_double_t,
   &_swigt__p_BasicVector3DT_int_t,
   &_swigt__p_BasicVector3DT_std__complexT_double_t_t,
@@ -77741,7 +77344,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_FormFactorTruncatedSpheroid,
   &_swigt__p_FormFactorWeighted,
   &_swigt__p_GaussFisherPeakShape,
-  &_swigt__p_HexagonalLattice,
+  &_swigt__p_HexagonalLattice2D,
   &_swigt__p_IAbstractParticle,
   &_swigt__p_ICloneable,
   &_swigt__p_ICosineRipple,
@@ -77816,7 +77419,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_SimulationOptions,
   &_swigt__p_SlicedParticle,
   &_swigt__p_SlicingEffects,
-  &_swigt__p_SquareLattice,
+  &_swigt__p_SquareLattice2D,
   &_swigt__p_ThreadInfo,
   &_swigt__p_Transform3D,
   &_swigt__p_WavevectorInfo,
@@ -77879,7 +77482,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_value_type,
 };
 
-static swig_cast_info _swigc__p_BasicLattice[] = {  {&_swigt__p_BasicLattice, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_BasicLattice2D[] = {  {&_swigt__p_BasicLattice2D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_BasicVector3DT_double_t[] = {  {&_swigt__p_BasicVector3DT_double_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_BasicVector3DT_int_t[] = {  {&_swigt__p_BasicVector3DT_int_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_BasicVector3DT_std__complexT_double_t_t[] = {  {&_swigt__p_BasicVector3DT_std__complexT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -77940,9 +77543,9 @@ static swig_cast_info _swigc__p_FormFactorTruncatedSphere[] = {  {&_swigt__p_For
 static swig_cast_info _swigc__p_FormFactorTruncatedSpheroid[] = {  {&_swigt__p_FormFactorTruncatedSpheroid, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FormFactorWeighted[] = {  {&_swigt__p_FormFactorWeighted, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_GaussFisherPeakShape[] = {  {&_swigt__p_GaussFisherPeakShape, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_HexagonalLattice[] = {  {&_swigt__p_HexagonalLattice, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_HexagonalLattice2D[] = {  {&_swigt__p_HexagonalLattice2D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IAbstractParticle[] = {  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_IAbstractParticle, 0, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IAbstractParticle, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IAbstractParticle, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ICloneable, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_ICloneable, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_ICloneable, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_ICloneable, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_ICloneable, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_HexagonalLattice2D, _p_HexagonalLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_SquareLattice2D, _p_SquareLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_BasicLattice2D, _p_BasicLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_ICloneable, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_ICloneable, 0, 0},  {&_swigt__p_ParameterPool, _p_ParameterPoolTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_ICloneable, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_ICloneable, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ICosineRipple[] = {  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_ICosineRipple, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_ICosineRipple, 0, 0},  {&_swigt__p_ICosineRipple, 0, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_ICosineRipple, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFTDecayFunction1D[] = {  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_IFTDecayFunction1D, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IFTDecayFunction1D, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_IFTDecayFunction1D, 0, 0},  {&_swigt__p_IFTDecayFunction1D, 0, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IFTDecayFunction1D, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFTDecayFunction2D[] = {  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_IFTDecayFunction2D, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_IFTDecayFunction2D, 0, 0},  {&_swigt__p_IFTDecayFunction2D, 0, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_IFTDecayFunction2D, 0, 0},{0, 0, 0, 0}};
@@ -77955,9 +77558,9 @@ static swig_cast_info _swigc__p_IFormFactorDecorator[] = {  {&_swigt__p_IFormFac
 static swig_cast_info _swigc__p_IFormFactorPolyhedron[] = {  {&_swigt__p_IFormFactorPolyhedron, 0, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IFormFactorPolyhedron, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IFormFactorPolyhedron, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFormFactorPrism[] = {  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IFormFactorPrism, 0, 0},  {&_swigt__p_IFormFactorPrism, 0, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IFormFactorPrism, 0, 0},  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IFormFactorPrism, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IInterferenceFunction[] = {  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_IInterferenceFunction, 0, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IInterferenceFunction, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_IInterferenceFunction, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_INode[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INode, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INode, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_INode, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_INode, 0, 0},  {&_swigt__p_INode, 0, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_INode, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_INode, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_INode, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_INode, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_INode, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_INode, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INode, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_INode, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_INode, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_INode, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_INode, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INode, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INode, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_INode, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_INode, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INode, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_INode, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_INode, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_INode, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_INode, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INode, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_INode, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_INode, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INode, 0, 0},  {&_swigt__p_Lattice3D, _p_Lattice3DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_INode, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_INode, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INode, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_INode[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_INode, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INode, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_INode, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_INode, 0, 0},  {&_swigt__p_INode, 0, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_INode, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_INode, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_INode, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_INode, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_INode, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_INode, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INode, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_INode, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_INode, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_INode, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_INode, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INode, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_INode, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INode, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INode, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_INode, 0, 0},  {&_swigt__p_HexagonalLattice2D, _p_HexagonalLattice2DTo_p_INode, 0, 0},  {&_swigt__p_SquareLattice2D, _p_SquareLattice2DTo_p_INode, 0, 0},  {&_swigt__p_BasicLattice2D, _p_BasicLattice2DTo_p_INode, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_INode, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INode, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_INode, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_INode, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_INode, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_INode, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_INode, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INode, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_INode, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_INode, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_INode, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INode, 0, 0},  {&_swigt__p_Lattice3D, _p_Lattice3DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_INode, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_INode, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_INode, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_INode, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_INode, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_INode, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INode, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_INodeVisitor[] = {  {&_swigt__p_INodeVisitor, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_IParameterized[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_IParameterized, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IParameterized, 0, 0},  {&_swigt__p_INode, _p_INodeTo_p_IParameterized, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParameterized, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IParameterized, 0, 0},  {&_swigt__p_ISampleBuilder, _p_ISampleBuilderTo_p_IParameterized, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_IParameterized, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_IParameterized, 0, 0},  {&_swigt__p_IParameterized, 0, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_IParameterized, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_Lattice3D, _p_Lattice3DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IParameterized, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_IParameterized[] = {  {&_swigt__p_FormFactorBox, _p_FormFactorBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereGaussianRadius, _p_FormFactorSphereGaussianRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSphereLogNormalRadius, _p_FormFactorSphereLogNormalRadiusTo_p_IParameterized, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_IParameterized, 0, 0},  {&_swigt__p_ParameterDistribution, _p_ParameterDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleDistribution, _p_ParticleDistributionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DGauss, _p_FTDecayFunction1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGauss, _p_FTDistribution1DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionNone, _p_InterferenceFunctionNoneTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHemiEllipsoid, _p_FormFactorHemiEllipsoidTo_p_IParameterized, 0, 0},  {&_swigt__p_INode, _p_INodeTo_p_IParameterized, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism3, _p_FormFactorPrism3To_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorPolyhedron, _p_IFormFactorPolyhedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCuboctahedron, _p_FormFactorCuboctahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorDodecahedron, _p_FormFactorDodecahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorIcosahedron, _p_FormFactorIcosahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTetrahedron, _p_FormFactorTetrahedronTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorPrism, _p_IFormFactorPrismTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPrism6, _p_FormFactorPrism6To_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCone, _p_FTDistribution2DConeTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParameterized, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSphere, _p_FormFactorTruncatedSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSphere, _p_FormFactorFullSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactor, _p_IFormFactorTo_p_IParameterized, 0, 0},  {&_swigt__p_ISample, _p_ISampleTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxGauss, _p_FormFactorLongBoxGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionHardDisk, _p_InterferenceFunctionHardDiskTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGate, _p_FTDistribution2DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DVoigt, _p_FTDecayFunction1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DVoigt, _p_FTDistribution1DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedSpheroid, _p_FormFactorTruncatedSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorFullSpheroid, _p_FormFactorFullSpheroidTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCantellatedCube, _p_FormFactorCantellatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorTruncatedCube, _p_FormFactorTruncatedCubeTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DGauss, _p_FTDecayFunction2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DGauss, _p_FTDistribution2DGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorBorn, _p_IFormFactorBornTo_p_IParameterized, 0, 0},  {&_swigt__p_ISampleBuilder, _p_ISampleBuilderTo_p_IParameterized, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_IAbstractParticle, _p_IAbstractParticleTo_p_IParameterized, 0, 0},  {&_swigt__p_HexagonalLattice2D, _p_HexagonalLattice2DTo_p_IParameterized, 0, 0},  {&_swigt__p_SquareLattice2D, _p_SquareLattice2DTo_p_IParameterized, 0, 0},  {&_swigt__p_BasicLattice2D, _p_BasicLattice2DTo_p_IParameterized, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution1D, _p_IFTDistribution1DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction1D, _p_IFTDecayFunction1DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone, _p_FormFactorConeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionTwin, _p_InterferenceFunctionTwinTo_p_IParameterized, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorAnisoPyramid, _p_FormFactorAnisoPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorPyramid, _p_FormFactorPyramidTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorEllipsoidalCylinder, _p_FormFactorEllipsoidalCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCylinder, _p_FormFactorCylinderTo_p_IParameterized, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCosine, _p_FTDistribution1DCosineTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DGate, _p_FTDistribution1DGateTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DVoigt, _p_FTDecayFunction2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DVoigt, _p_FTDistribution2DVoigtTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DCauchy, _p_FTDistribution1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DCauchy, _p_FTDecayFunction1DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution2DCauchy, _p_FTDistribution2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction2DCauchy, _p_FTDecayFunction2DCauchyTo_p_IParameterized, 0, 0},  {&_swigt__p_IInterferenceFunction, _p_IInterferenceFunctionTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCone6, _p_FormFactorCone6To_p_IParameterized, 0, 0},  {&_swigt__p_IFormFactorDecorator, _p_IFormFactorDecoratorTo_p_IParameterized, 0, 0},  {&_swigt__p_IParameterized, 0, 0, 0},  {&_swigt__p_FormFactorDot, _p_FormFactorDotTo_p_IParameterized, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_IParameterized, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCrystal, _p_FormFactorCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DParaCrystal, _p_InterferenceFunction2DParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionRadialParaCrystal, _p_InterferenceFunctionRadialParaCrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_IParameterized, 0, 0},  {&_swigt__p_Lattice3D, _p_Lattice3DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorHollowSphere, _p_FormFactorHollowSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorGaussSphere, _p_FormFactorGaussSphereTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDistribution2D, _p_IFTDistribution2DTo_p_IParameterized, 0, 0},  {&_swigt__p_IFTDecayFunction2D, _p_IFTDecayFunction2DTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorWeighted, _p_FormFactorWeightedTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorLongBoxLorentz, _p_FormFactorLongBoxLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DLattice, _p_InterferenceFunction2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction1DLattice, _p_InterferenceFunction1DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction2DSuperLattice, _p_InterferenceFunction2DSuperLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunction3DLattice, _p_InterferenceFunction3DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionFinite2DLattice, _p_InterferenceFunctionFinite2DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_InterferenceFunctionFinite3DLattice, _p_InterferenceFunctionFinite3DLatticeTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDistribution1DTriangle, _p_FTDistribution1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_FTDecayFunction1DTriangle, _p_FTDecayFunction1DTriangleTo_p_IParameterized, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IParameterized, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IParticle[] = {  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_IParticle, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_IParticle, 0, 0},  {&_swigt__p_IParticle, 0, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParticle, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_IParticle, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IPeakShape[] = {  {&_swigt__p_IPeakShape, 0, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_IPeakShape, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IProfileRectangularRipple[] = {  {&_swigt__p_IProfileRectangularRipple, 0, 0, 0},{0, 0, 0, 0}};
@@ -77981,7 +77584,7 @@ static swig_cast_info _swigc__p_InterferenceFunctionRadialParaCrystal[] = {  {&_
 static swig_cast_info _swigc__p_InterferenceFunctionTwin[] = {  {&_swigt__p_InterferenceFunctionTwin, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IsotropicGaussPeakShape[] = {  {&_swigt__p_IsotropicGaussPeakShape, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IsotropicLorentzPeakShape[] = {  {&_swigt__p_IsotropicLorentzPeakShape, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_Lattice2D[] = {  {&_swigt__p_Lattice2D, 0, 0, 0},  {&_swigt__p_BasicLattice, _p_BasicLatticeTo_p_Lattice2D, 0, 0},  {&_swigt__p_SquareLattice, _p_SquareLatticeTo_p_Lattice2D, 0, 0},  {&_swigt__p_HexagonalLattice, _p_HexagonalLatticeTo_p_Lattice2D, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_Lattice2D[] = {  {&_swigt__p_Lattice2D, 0, 0, 0},  {&_swigt__p_BasicLattice2D, _p_BasicLattice2DTo_p_Lattice2D, 0, 0},  {&_swigt__p_SquareLattice2D, _p_SquareLattice2DTo_p_Lattice2D, 0, 0},  {&_swigt__p_HexagonalLattice2D, _p_HexagonalLattice2DTo_p_Lattice2D, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Lattice2D__ReciprocalBases[] = {  {&_swigt__p_Lattice2D__ReciprocalBases, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Lattice3D[] = {  {&_swigt__p_Lattice3D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Layer[] = {  {&_swigt__p_Layer, 0, 0, 0},{0, 0, 0, 0}};
@@ -78015,7 +77618,7 @@ static swig_cast_info _swigc__p_SimpleSelectionRule[] = {  {&_swigt__p_SimpleSel
 static swig_cast_info _swigc__p_SimulationOptions[] = {  {&_swigt__p_SimulationOptions, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SlicedParticle[] = {  {&_swigt__p_SlicedParticle, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SlicingEffects[] = {  {&_swigt__p_SlicingEffects, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_SquareLattice[] = {  {&_swigt__p_SquareLattice, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_SquareLattice2D[] = {  {&_swigt__p_SquareLattice2D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ThreadInfo[] = {  {&_swigt__p_ThreadInfo, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Transform3D[] = {  {&_swigt__p_Transform3D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_WavevectorInfo[] = {  {&_swigt__p_WavevectorInfo, 0, 0, 0},{0, 0, 0, 0}};
@@ -78078,7 +77681,7 @@ static swig_cast_info _swigc__p_unsigned_short[] = {  {&_swigt__p_unsigned_short
 static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0, 0},{0, 0, 0, 0}};
 
 static swig_cast_info *swig_cast_initial[] = {
-  _swigc__p_BasicLattice,
+  _swigc__p_BasicLattice2D,
   _swigc__p_BasicVector3DT_double_t,
   _swigc__p_BasicVector3DT_int_t,
   _swigc__p_BasicVector3DT_std__complexT_double_t_t,
@@ -78139,7 +77742,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_FormFactorTruncatedSpheroid,
   _swigc__p_FormFactorWeighted,
   _swigc__p_GaussFisherPeakShape,
-  _swigc__p_HexagonalLattice,
+  _swigc__p_HexagonalLattice2D,
   _swigc__p_IAbstractParticle,
   _swigc__p_ICloneable,
   _swigc__p_ICosineRipple,
@@ -78214,7 +77817,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_SimulationOptions,
   _swigc__p_SlicedParticle,
   _swigc__p_SlicingEffects,
-  _swigc__p_SquareLattice,
+  _swigc__p_SquareLattice2D,
   _swigc__p_ThreadInfo,
   _swigc__p_Transform3D,
   _swigc__p_WavevectorInfo,