diff --git a/Base/Vector/Transform3D.cpp b/Base/Vector/RotMatrix.cpp
similarity index 65%
rename from Base/Vector/Transform3D.cpp
rename to Base/Vector/RotMatrix.cpp
index 57b198977024e3a5cacb8f5b5fe5eb676f12b2ea..194899c7cd4280d834268a8d073a53dc3936f431 100644
--- a/Base/Vector/Transform3D.cpp
+++ b/Base/Vector/RotMatrix.cpp
@@ -2,8 +2,8 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Base/Vector/Transform3D.cpp
-//! @brief      Implements template class Transform3D.
+//! @file      Base/Vector/RotMatrix.cpp
+//! @brief      Implements template class RotMatrix.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -12,22 +12,22 @@
 //
 //  ************************************************************************************************
 
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include <Eigen/LU>
 #include <utility>
 
-Transform3D::Transform3D()
+RotMatrix::RotMatrix()
 {
     m_matrix.setIdentity();
     m_inverse_matrix.setIdentity();
 }
 
-Transform3D::Transform3D(Eigen::Matrix3d matrix) : m_matrix(std::move(matrix))
+RotMatrix::RotMatrix(Eigen::Matrix3d matrix) : m_matrix(std::move(matrix))
 {
     m_inverse_matrix = m_matrix.inverse();
 }
 
-Transform3D Transform3D::createRotateX(double phi)
+RotMatrix RotMatrix::createRotateX(double phi)
 {
     double cosine = std::cos(phi);
     double sine = std::sin(phi);
@@ -37,10 +37,10 @@ Transform3D Transform3D::createRotateX(double phi)
     matrix(1, 2) = -sine;
     matrix(2, 1) = sine;
     matrix(2, 2) = cosine;
-    return Transform3D(matrix);
+    return RotMatrix(matrix);
 }
 
-Transform3D Transform3D::createRotateY(double phi)
+RotMatrix RotMatrix::createRotateY(double phi)
 {
     double cosine = std::cos(phi);
     double sine = std::sin(phi);
@@ -50,10 +50,10 @@ Transform3D Transform3D::createRotateY(double phi)
     matrix(0, 2) = sine;
     matrix(2, 0) = -sine;
     matrix(2, 2) = cosine;
-    return Transform3D(matrix);
+    return RotMatrix(matrix);
 }
 
-Transform3D Transform3D::createRotateZ(double phi)
+RotMatrix RotMatrix::createRotateZ(double phi)
 {
     double cosine = std::cos(phi);
     double sine = std::sin(phi);
@@ -63,18 +63,18 @@ Transform3D Transform3D::createRotateZ(double phi)
     matrix(0, 1) = -sine;
     matrix(1, 0) = sine;
     matrix(1, 1) = cosine;
-    return Transform3D(matrix);
+    return RotMatrix(matrix);
 }
 
-Transform3D Transform3D::createRotateEuler(double alpha, double beta, double gamma)
+RotMatrix RotMatrix::createRotateEuler(double alpha, double beta, double gamma)
 {
-    Transform3D zrot = createRotateZ(alpha);
-    Transform3D xrot = createRotateX(beta);
-    Transform3D zrot2 = createRotateZ(gamma);
+    RotMatrix zrot = createRotateZ(alpha);
+    RotMatrix xrot = createRotateX(beta);
+    RotMatrix zrot2 = createRotateZ(gamma);
     return zrot * xrot * zrot2;
 }
 
-void Transform3D::calculateEulerAngles(double* p_alpha, double* p_beta, double* p_gamma) const
+void RotMatrix::calculateEulerAngles(double* p_alpha, double* p_beta, double* p_gamma) const
 {
     *p_beta = std::acos(m_matrix(2, 2));
     // First check if second angle is zero or pi
@@ -87,39 +87,39 @@ void Transform3D::calculateEulerAngles(double* p_alpha, double* p_beta, double*
     }
 }
 
-double Transform3D::calculateRotateXAngle() const
+double RotMatrix::calculateRotateXAngle() const
 {
     return std::atan2(m_matrix(2, 1), m_matrix(1, 1));
 }
 
-double Transform3D::calculateRotateYAngle() const
+double RotMatrix::calculateRotateYAngle() const
 {
     return std::atan2(m_matrix(0, 2), m_matrix(2, 2));
 }
 
-double Transform3D::calculateRotateZAngle() const
+double RotMatrix::calculateRotateZAngle() const
 {
     return std::atan2(m_matrix(1, 0), m_matrix(0, 0));
 }
 
-Transform3D Transform3D::getInverse() const
+RotMatrix RotMatrix::getInverse() const
 {
-    Transform3D result(m_inverse_matrix);
+    RotMatrix result(m_inverse_matrix);
     return result;
 }
 
-template <class I3> I3 Transform3D::transformed(const I3& v) const
+template <class T> T RotMatrix::transformed(const T& v) const
 {
     auto x = m_matrix(0, 0) * v.x() + m_matrix(0, 1) * v.y() + m_matrix(0, 2) * v.z();
     auto y = m_matrix(1, 0) * v.x() + m_matrix(1, 1) * v.y() + m_matrix(1, 2) * v.z();
     auto z = m_matrix(2, 0) * v.x() + m_matrix(2, 1) * v.y() + m_matrix(2, 2) * v.z();
-    return I3(x, y, z);
+    return T(x, y, z);
 }
 
-template R3 Transform3D::transformed<R3>(const R3& v) const;
-template C3 Transform3D::transformed<C3>(const C3& v) const;
+template R3 RotMatrix::transformed<R3>(const R3& v) const;
+template C3 RotMatrix::transformed<C3>(const C3& v) const;
 
-template <class I3> I3 Transform3D::transformedInverse(const I3& v) const
+template <class T> T RotMatrix::transformedInverse(const T& v) const
 {
     auto x = m_inverse_matrix(0, 0) * v.x() + m_inverse_matrix(0, 1) * v.y()
              + m_inverse_matrix(0, 2) * v.z();
@@ -127,29 +127,29 @@ template <class I3> I3 Transform3D::transformedInverse(const I3& v) const
              + m_inverse_matrix(1, 2) * v.z();
     auto z = m_inverse_matrix(2, 0) * v.x() + m_inverse_matrix(2, 1) * v.y()
              + m_inverse_matrix(2, 2) * v.z();
-    return I3(x, y, z);
+    return T(x, y, z);
 }
 
-template R3 Transform3D::transformedInverse<R3>(const R3& v) const;
-template C3 Transform3D::transformedInverse<C3>(const C3& v) const;
+template R3 RotMatrix::transformedInverse<R3>(const R3& v) const;
+template C3 RotMatrix::transformedInverse<C3>(const C3& v) const;
 
-Transform3D* Transform3D::clone() const
+RotMatrix* RotMatrix::clone() const
 {
-    return new Transform3D(m_matrix);
+    return new RotMatrix(m_matrix);
 }
 
-Transform3D Transform3D::operator*(const Transform3D& other) const
+RotMatrix RotMatrix::operator*(const RotMatrix& other) const
 {
     Eigen::Matrix3d product_matrix = this->m_matrix * other.m_matrix;
-    return Transform3D(product_matrix);
+    return RotMatrix(product_matrix);
 }
 
-bool Transform3D::operator==(const Transform3D& other) const
+bool RotMatrix::operator==(const RotMatrix& other) const
 {
     return this->m_matrix == other.m_matrix;
 }
 
-Transform3D::ERotationType Transform3D::getRotationType() const
+RotMatrix::ERotationType RotMatrix::getRotationType() const
 {
     if (isXRotation())
         return XAXIS;
@@ -160,19 +160,19 @@ Transform3D::ERotationType Transform3D::getRotationType() const
     return EULER;
 }
 
-bool Transform3D::isIdentity() const
+bool RotMatrix::isIdentity() const
 {
     double alpha, beta, gamma;
     calculateEulerAngles(&alpha, &beta, &gamma);
     return (alpha == 0.0 && beta == 0.0 && gamma == 0.0);
 }
 
-void Transform3D::print(std::ostream& ostr) const
+void RotMatrix::print(std::ostream& ostr) const
 {
-    ostr << "Transform3D: " << m_matrix;
+    ostr << "RotMatrix: " << m_matrix;
 }
 
-bool Transform3D::isXRotation() const
+bool RotMatrix::isXRotation() const
 {
     if (m_matrix(0, 0) != 1.0)
         return false;
@@ -187,7 +187,7 @@ bool Transform3D::isXRotation() const
     return true;
 }
 
-bool Transform3D::isYRotation() const
+bool RotMatrix::isYRotation() const
 {
     if (m_matrix(1, 1) != 1.0)
         return false;
@@ -202,7 +202,7 @@ bool Transform3D::isYRotation() const
     return true;
 }
 
-bool Transform3D::isZRotation() const
+bool RotMatrix::isZRotation() const
 {
     if (m_matrix(2, 2) != 1.0)
         return false;
diff --git a/Base/Vector/Transform3D.h b/Base/Vector/RotMatrix.h
similarity index 70%
rename from Base/Vector/Transform3D.h
rename to Base/Vector/RotMatrix.h
index 2903131eafd00161f6df9b42649162362d18f94c..7c3eb7f3234b5faefa9806457d39b312073e2fa5 100644
--- a/Base/Vector/Transform3D.h
+++ b/Base/Vector/RotMatrix.h
@@ -2,8 +2,8 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Base/Vector/Transform3D.h
-//! @brief      Declares class Transform3D.
+//! @file      Base/Vector/RotMatrix.h
+//! @brief     Declares class RotMatrix.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -12,45 +12,45 @@
 //
 //  ************************************************************************************************
 
-#ifndef BORNAGAIN_BASE_VECTOR_TRANSFORM3D_H
-#define BORNAGAIN_BASE_VECTOR_TRANSFORM3D_H
+#ifndef BORNAGAIN_BASE_VECTOR_ROTMATRIX_H
+#define BORNAGAIN_BASE_VECTOR_ROTMATRIX_H
 
 #include "Base/Vector/EigenCore.h"
 #include <heinz/Vectors3D.h>
 
 #include <vector>
 
-//! Vector transformations in three dimensions.
+//! Rotation matrix in three dimensions.
 
-class Transform3D {
+class RotMatrix {
 public:
     enum ERotationType { EULER, XAXIS, YAXIS, ZAXIS };
 
     //! Constructs unit transformation
-    Transform3D();
+    RotMatrix();
 
 #ifndef SWIG
     //! Constructor from matrix (no checks if this is an element of SO(3)!)
-    explicit Transform3D(Eigen::Matrix3d matrix);
+    explicit RotMatrix(Eigen::Matrix3d matrix);
 #endif
 
     //! Destructor
-    ~Transform3D() = default;
+    ~RotMatrix() = default;
 
     //! Clones the transformation
-    Transform3D* clone() const;
+    RotMatrix* clone() const;
 
     //! Creates rotation around x-axis
-    static Transform3D createRotateX(double phi);
+    static RotMatrix createRotateX(double phi);
 
     //! Creates rotation around y-axis
-    static Transform3D createRotateY(double phi);
+    static RotMatrix createRotateY(double phi);
 
     //! Creates rotation around z-axis
-    static Transform3D createRotateZ(double phi);
+    static RotMatrix createRotateZ(double phi);
 
     //! Creates rotation defined by Euler angles
-    static Transform3D createRotateEuler(double alpha, double beta, double gamma);
+    static RotMatrix createRotateEuler(double alpha, double beta, double gamma);
 
     //! Calculates the Euler angles corresponding to the rotation
     void calculateEulerAngles(double* p_alpha, double* p_beta, double* p_gamma) const;
@@ -68,19 +68,19 @@ public:
     double calculateRotateZAngle() const;
 
     //! Returns the inverse transformation.
-    Transform3D getInverse() const;
+    RotMatrix getInverse() const;
 
     //! Return transformed vector _v_.
-    template <class I3> I3 transformed(const I3& v) const;
+    template <class T> T transformed(const T& v) const;
 
     //! Return transformed vector _v_.
-    template <class I3> I3 transformedInverse(const I3& v) const;
+    template <class T> T transformedInverse(const T& v) const;
 
     //! Composes two transformations
-    Transform3D operator*(const Transform3D& other) const;
+    RotMatrix operator*(const RotMatrix& other) const;
 
     //! Provides equality operator
-    bool operator==(const Transform3D& other) const;
+    bool operator==(const RotMatrix& other) const;
 
     //! Retrieve the rotation type (general, around x, y or z-axis)
     ERotationType getRotationType() const;
@@ -88,7 +88,7 @@ public:
     //! Determine if the transformation is trivial (identity)
     bool isIdentity() const;
 
-    friend std::ostream& operator<<(std::ostream& ostr, const Transform3D& m)
+    friend std::ostream& operator<<(std::ostream& ostr, const RotMatrix& m)
     {
         m.print(ostr);
         return ostr;
@@ -107,4 +107,4 @@ private:
 #endif
 };
 
-#endif // BORNAGAIN_BASE_VECTOR_TRANSFORM3D_H
+#endif // BORNAGAIN_BASE_VECTOR_ROTMATRIX_H
diff --git a/Base/Vector/WavevectorInfo.cpp b/Base/Vector/WavevectorInfo.cpp
index b5f6513c32791b8ad4c390154501c24d159dbbfa..66298ed8ba602690d2d1fa2373fc84fcd610d59f 100644
--- a/Base/Vector/WavevectorInfo.cpp
+++ b/Base/Vector/WavevectorInfo.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Base/Vector/WavevectorInfo.h"
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 
 WavevectorInfo::WavevectorInfo(C3 ki, C3 kf, double wavelength)
     : m_ki(ki), m_kf(kf), m_vacuum_wavelength(wavelength)
@@ -32,7 +32,7 @@ WavevectorInfo WavevectorInfo::makeZeroQ()
     return {R3{1, 0, 0}, R3{1, 0, 0}, 1.0};
 }
 
-WavevectorInfo WavevectorInfo::transformed(const Transform3D& transform) const
+WavevectorInfo WavevectorInfo::transformed(const RotMatrix& transform) const
 {
     return WavevectorInfo(transform.transformed(m_ki), transform.transformed(m_kf),
                           m_vacuum_wavelength);
diff --git a/Base/Vector/WavevectorInfo.h b/Base/Vector/WavevectorInfo.h
index 81d7df39230d3cd78883489378c724e561a631f6..279c1b5cf0a856715aad552c6631bce528b526f4 100644
--- a/Base/Vector/WavevectorInfo.h
+++ b/Base/Vector/WavevectorInfo.h
@@ -22,7 +22,7 @@
 
 #include <heinz/Vectors3D.h>
 
-class Transform3D;
+class RotMatrix;
 
 //! Holds all wavevector information relevant for calculating form factors.
 
@@ -32,7 +32,7 @@ public:
     WavevectorInfo(C3 ki, C3 kf, double wavelength);
     WavevectorInfo(R3 ki, R3 kf, double wavelength);
 
-    WavevectorInfo transformed(const Transform3D& transform) const;
+    WavevectorInfo transformed(const RotMatrix& transform) const;
     C3 getKi() const { return m_ki; }
     C3 getKf() const { return m_kf; }
     C3 getQ() const { return m_ki - m_kf; }
diff --git a/Core/Export/SampleToPython.cpp b/Core/Export/SampleToPython.cpp
index 037d4ea6e30082a96c2fb5d79d377df441994f02..1a4607551ca2f2009dc7862382e8052fbbcb95f0 100644
--- a/Core/Export/SampleToPython.cpp
+++ b/Core/Export/SampleToPython.cpp
@@ -15,7 +15,7 @@
 #include "Core/Export/SampleToPython.h"
 #include "Base/Util/Assert.h"
 #include "Base/Util/PyFmt.h"
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include "Core/Export/ComponentKeyHandler.h"
 #include "Core/Export/MaterialKeyHandler.h"
 #include "Core/Export/PyFmt2.h"
@@ -44,29 +44,29 @@ namespace {
 void setRotationInformation(const IParticle* particle, std::string name, std::ostringstream& result)
 {
     if (particle->rotation()) {
-        switch (particle->rotation()->getTransform3D().getRotationType()) {
-        case Transform3D::EULER: {
+        switch (particle->rotation()->getRotMatrix().getRotationType()) {
+        case RotMatrix::EULER: {
             double alpha, beta, gamma;
-            particle->rotation()->getTransform3D().calculateEulerAngles(&alpha, &beta, &gamma);
+            particle->rotation()->getRotMatrix().calculateEulerAngles(&alpha, &beta, &gamma);
             result << indent() << name << "_rotation = ba.RotationEuler("
                    << Py::Fmt::printDegrees(alpha) << ", " << Py::Fmt::printDegrees(beta) << ", "
                    << Py::Fmt::printDegrees(gamma) << ")\n";
             break;
         }
-        case Transform3D::XAXIS: {
-            double alpha = particle->rotation()->getTransform3D().calculateRotateXAngle();
+        case RotMatrix::XAXIS: {
+            double alpha = particle->rotation()->getRotMatrix().calculateRotateXAngle();
             result << indent() << name << "_rotation = ba.RotationX("
                    << Py::Fmt::printDegrees(alpha) << ")\n";
             break;
         }
-        case Transform3D::YAXIS: {
-            double alpha = particle->rotation()->getTransform3D().calculateRotateYAngle();
+        case RotMatrix::YAXIS: {
+            double alpha = particle->rotation()->getRotMatrix().calculateRotateYAngle();
             result << indent() << name << "_rotation = ba.RotationY("
                    << Py::Fmt::printDegrees(alpha) << ")\n";
             break;
         }
-        case Transform3D::ZAXIS: {
-            double alpha = particle->rotation()->getTransform3D().calculateRotateZAngle();
+        case RotMatrix::ZAXIS: {
+            double alpha = particle->rotation()->getRotMatrix().calculateRotateZAngle();
             result << indent() << name << "_rotation = ba.RotationZ("
                    << Py::Fmt::printDegrees(alpha) << ")\n";
             break;
diff --git a/GUI/Model/From/GUISampleBuilder.cpp b/GUI/Model/From/GUISampleBuilder.cpp
index 10f31c553279b1408fad965efef161d7ae6aa145..56cd8f585dc89c72b24b3a4a935578afdc2d3a60 100644
--- a/GUI/Model/From/GUISampleBuilder.cpp
+++ b/GUI/Model/From/GUISampleBuilder.cpp
@@ -149,7 +149,7 @@ void GUISampleBuilder::copyParticle(const IParticle* iparticle,
         FromDomain::setFormFactor(mesoItem, meso->outerShape());
         FromDomain::setRotation(mesoItem, meso->rotation());
 
-        auto lattice = meso->particleStructure().transformedLattice();
+        auto lattice = meso->particleStructure().rotatedLattice();
         mesoItem->setVectorA(lattice.getBasisVectorA());
         mesoItem->setVectorB(lattice.getBasisVectorB());
         mesoItem->setVectorC(lattice.getBasisVectorC());
diff --git a/GUI/Model/Sample/ItemWithParticles.cpp b/GUI/Model/Sample/ItemWithParticles.cpp
index 6a603293d6551d3d91187dad209d12eaacfc025d..e4cb2ac8133c6d4bc749c298fa22969c905441c0 100644
--- a/GUI/Model/Sample/ItemWithParticles.cpp
+++ b/GUI/Model/Sample/ItemWithParticles.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "GUI/Model/Sample/ItemWithParticles.h"
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include "GUI/Model/Session/SessionItemUtils.h"
 #include "GUI/Model/Session/SessionModel.h"
 #include "GUI/Model/Trafo/RotationItems.h"
@@ -93,10 +93,10 @@ bool ItemWithParticles::isTransformationTagName(const QString& name)
     return name == T_TRANSFORMATION;
 }
 
-Transform3D ItemWithParticles::rotation() const
+RotMatrix ItemWithParticles::rotation() const
 {
     auto* const item = rotationItem();
-    return item ? item->rotation() : Transform3D();
+    return item ? item->rotation() : RotMatrix();
 }
 
 SelectionDescriptor<RotationItem*> ItemWithParticles::rotationMethod()
@@ -169,7 +169,7 @@ void ItemWithParticles::setDefaultTagTransformation()
 void ItemWithParticles::setTransformationInfo(IParticle* result) const
 {
     result->setParticlePosition(position());
-    const Transform3D r = rotation();
+    const RotMatrix r = rotation();
     if (!r.isIdentity()) {
         std::unique_ptr<IRotation> rotation(IRotation::createRotation(r));
         result->setRotation(*rotation);
diff --git a/GUI/Model/Sample/ItemWithParticles.h b/GUI/Model/Sample/ItemWithParticles.h
index 7c8081d24db3e546dd529fb1c3dbad324923b4f7..5e243ac849edfa2fd845961b2d994a00443256a0 100644
--- a/GUI/Model/Sample/ItemWithParticles.h
+++ b/GUI/Model/Sample/ItemWithParticles.h
@@ -23,7 +23,7 @@ class DoubleDescriptor;
 class IParticle;
 class IRotation;
 class RotationItem;
-class Transform3D;
+class RotMatrix;
 class TransformationItem;
 class VectorDescriptor;
 class VectorItem;
@@ -49,7 +49,7 @@ public:
     static bool isTransformationTagName(const QString& name);
 
     //! Returns identity transformation if no rotation is defined at all
-    Transform3D rotation() const;
+    RotMatrix rotation() const;
 
     //! Returns selection descriptor for rotation methods.
     SelectionDescriptor<RotationItem*> rotationMethod();
diff --git a/GUI/Model/Trafo/RotationItems.cpp b/GUI/Model/Trafo/RotationItems.cpp
index cc4f42e02837cc64be701869cb3561a7eb01954c..fdfaa2b5851f57f41beed566ba1c2e58f0310748 100644
--- a/GUI/Model/Trafo/RotationItems.cpp
+++ b/GUI/Model/Trafo/RotationItems.cpp
@@ -14,7 +14,7 @@
 
 #include "GUI/Model/Trafo/RotationItems.h"
 #include "Base/Const/Units.h"
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include "GUI/Model/Types/DoubleDescriptor.h"
 #include "Sample/Scattering/Rotations.h"
 
@@ -24,10 +24,10 @@ using namespace Units;
 
 RotationItem::RotationItem(const QString& name) : SessionItem(name) {}
 
-Transform3D RotationItem::rotation() const
+RotMatrix RotationItem::rotation() const
 {
     auto p = createRotation();
-    return (p != nullptr) ? p->getTransform3D() : Transform3D();
+    return (p != nullptr) ? p->getRotMatrix() : RotMatrix();
 }
 
 // ----------------------------------------------------------------------------
diff --git a/GUI/Model/Trafo/RotationItems.h b/GUI/Model/Trafo/RotationItems.h
index 64bf0e01cb10d7349083f141c004ca3fadba31da..3ff2fd463611b37138eea8043e119b5065ebe9cc 100644
--- a/GUI/Model/Trafo/RotationItems.h
+++ b/GUI/Model/Trafo/RotationItems.h
@@ -18,14 +18,14 @@
 #include "GUI/Model/Session/SessionItem.h"
 
 class IRotation;
-class Transform3D;
+class RotMatrix;
 class DoubleDescriptor;
 
 using std::unique_ptr;
 
 class BA_CORE_API_ RotationItem : public SessionItem {
 public:
-    Transform3D rotation() const;
+    RotMatrix rotation() const;
 
 protected:
     explicit RotationItem(const QString& name);
diff --git a/Sample/Lattice/Lattice3D.cpp b/Sample/Lattice/Lattice3D.cpp
index aa6eb39f31a4b6b19e205e8ad7b2fec9fa2594a8..ec17a00adf1945a4fcdbaffb3d26653bedd0b4d2 100644
--- a/Sample/Lattice/Lattice3D.cpp
+++ b/Sample/Lattice/Lattice3D.cpp
@@ -14,7 +14,7 @@
 
 #include "Sample/Lattice/Lattice3D.h"
 #include "Base/Math/Constants.h"
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include "Sample/Lattice/ISelectionRule.h"
 #include <gsl/gsl_linalg.h>
 
@@ -31,11 +31,11 @@ Lattice3D::Lattice3D(const Lattice3D& lattice) : Lattice3D(lattice.m_a, lattice.
 
 Lattice3D::~Lattice3D() = default;
 
-Lattice3D Lattice3D::transformed(const Transform3D& transform) const
+Lattice3D Lattice3D::rotated(const RotMatrix& rotMatrix) const
 {
-    R3 q1 = transform.transformed(m_a);
-    R3 q2 = transform.transformed(m_b);
-    R3 q3 = transform.transformed(m_c);
+    R3 q1 = rotMatrix.transformed(m_a);
+    R3 q2 = rotMatrix.transformed(m_b);
+    R3 q3 = rotMatrix.transformed(m_c);
     Lattice3D result = {q1, q2, q3};
     if (m_selection_rule)
         result.setSelectionRule(*m_selection_rule);
diff --git a/Sample/Lattice/Lattice3D.h b/Sample/Lattice/Lattice3D.h
index f404ba1e21217bada552908e1c6c47236894d8c3..30db2c1f3c96dbb818de7a0e6edffef292924072 100644
--- a/Sample/Lattice/Lattice3D.h
+++ b/Sample/Lattice/Lattice3D.h
@@ -21,7 +21,7 @@
 #include <vector>
 
 class ISelectionRule;
-class Transform3D;
+class RotMatrix;
 
 //! A Bravais lattice, characterized by three basis vectors, and optionally an ISelectionRule.
 
@@ -37,8 +37,8 @@ public:
     ~Lattice3D() override;
     Lattice3D& operator=(const Lattice3D&) = delete;
 
-    //! Creates transformed lattice
-    Lattice3D transformed(const Transform3D& transform) const;
+    //! Creates rotated lattice
+    Lattice3D rotated(const RotMatrix& rotMatrix) const;
 
     //! Returns basis vector a
     R3 getBasisVectorA() const { return m_a; }
diff --git a/Sample/Material/BaseMaterialImpl.h b/Sample/Material/BaseMaterialImpl.h
index 0aa837fc944b9ab41f1c06cf267b94abfbfac02a..d24040c607cf61cc619b958d7f7e89155362237e 100644
--- a/Sample/Material/BaseMaterialImpl.h
+++ b/Sample/Material/BaseMaterialImpl.h
@@ -26,7 +26,7 @@
 #include <heinz/Complex.h>
 #include <heinz/Vectors3D.h>
 
-class Transform3D;
+class RotMatrix;
 class WavevectorInfo;
 
 enum class MATERIAL_TYPES { InvalidMaterialType = -1, RefractiveMaterial = 0, MaterialBySLD };
@@ -75,7 +75,7 @@ public:
     //! Returns (\f$ \pi/\lambda^2 \f$ - sld) matrix with magnetization corrections
     virtual Eigen::Matrix2cd polarizedSubtrSLD(const WavevectorInfo& wavevectors) const = 0;
 
-    virtual BaseMaterialImpl* rotatedMaterial(const Transform3D& transform) const = 0;
+    virtual BaseMaterialImpl* rotatedMaterial(const RotMatrix& transform) const = 0;
 
     //! Prints object data
     virtual void print(std::ostream& ostr) const = 0;
diff --git a/Sample/Material/MagneticMaterialImpl.cpp b/Sample/Material/MagneticMaterialImpl.cpp
index 29a8f0d838961ab614a59363c048eb51debc19e4..72495d838736f32ffdd1d751e18eee91e5f8d744 100644
--- a/Sample/Material/MagneticMaterialImpl.cpp
+++ b/Sample/Material/MagneticMaterialImpl.cpp
@@ -14,7 +14,7 @@
 
 #include "Sample/Material/MagneticMaterialImpl.h"
 #include "Base/Const/PhysicalConstants.h"
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include "Base/Vector/WavevectorInfo.h"
 #include "Sample/Material/MaterialUtils.h"
 #include <memory>
@@ -73,7 +73,7 @@ Eigen::Matrix2cd MagneticMaterialImpl::polarizedSubtrSLD(const WavevectorInfo& w
     return MaterialUtils::MagnetizationCorrection(unit_factor, magnetization_prefactor, mag_ortho);
 }
 
-MagneticMaterialImpl* MagneticMaterialImpl::rotatedMaterial(const Transform3D& transform) const
+MagneticMaterialImpl* MagneticMaterialImpl::rotatedMaterial(const RotMatrix& transform) const
 {
     R3 transformed_field = transform.transformed(m_magnetization);
     MagneticMaterialImpl* result = this->clone();
diff --git a/Sample/Material/MagneticMaterialImpl.h b/Sample/Material/MagneticMaterialImpl.h
index 633830f7107171e5b5527ad44adf8c16a70a594e..eada1790359deecd802367abe86f9ee97ec16ff4 100644
--- a/Sample/Material/MagneticMaterialImpl.h
+++ b/Sample/Material/MagneticMaterialImpl.h
@@ -22,7 +22,7 @@
 
 #include "Sample/Material/BaseMaterialImpl.h"
 
-class Transform3D;
+class RotMatrix;
 class WavevectorInfo;
 
 //! Basic implementation for magnetized material.
@@ -55,7 +55,7 @@ public:
     //! Returns (\f$ \pi/\lambda^2 \f$ - sld) matrix with magnetization corrections
     Eigen::Matrix2cd polarizedSubtrSLD(const WavevectorInfo& wavevectors) const override;
 
-    MagneticMaterialImpl* rotatedMaterial(const Transform3D& transform) const override;
+    MagneticMaterialImpl* rotatedMaterial(const RotMatrix& transform) const override;
 
 private:
     void setMagnetization(R3 magnetization) { m_magnetization = magnetization; }
diff --git a/Sample/Material/Material.cpp b/Sample/Material/Material.cpp
index d66861c46a29de025911c82db94e2617b9214e0d..35f15d2c9d1d89d51839499d532798a73ba8975c 100644
--- a/Sample/Material/Material.cpp
+++ b/Sample/Material/Material.cpp
@@ -14,7 +14,7 @@
 
 #include "Sample/Material/Material.h"
 #include "Base/Util/Assert.h"
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include "Base/Vector/WavevectorInfo.h"
 #include <typeinfo>
 
@@ -99,7 +99,7 @@ Eigen::Matrix2cd Material::polarizedSubtrSLD(const WavevectorInfo& wavevectors)
     return m_material_impl->polarizedSubtrSLD(wavevectors);
 }
 
-Material Material::rotatedMaterial(const Transform3D& transform) const // TODO param:=rotation
+Material Material::rotatedMaterial(const RotMatrix& transform) const // TODO param:=rotation
 {
     std::unique_ptr<BaseMaterialImpl> material_impl(m_material_impl->rotatedMaterial(transform));
     return Material(std::move(material_impl));
diff --git a/Sample/Material/Material.h b/Sample/Material/Material.h
index 6ec6c56b2b2f9734dfa926ee9ff0104426121e1c..e1e59c53b97b514b9bd9506e808c84bce4041457 100644
--- a/Sample/Material/Material.h
+++ b/Sample/Material/Material.h
@@ -19,7 +19,7 @@
 #include <memory>
 #include <vector>
 
-class Transform3D;
+class RotMatrix;
 class WavevectorInfo;
 
 //! A wrapper for underlying material implementation
@@ -86,7 +86,7 @@ public:
     Eigen::Matrix2cd polarizedSubtrSLD(const WavevectorInfo& wavevectors) const;
 #endif
 
-    Material rotatedMaterial(const Transform3D& transform) const;
+    Material rotatedMaterial(const RotMatrix& transform) const;
 
     friend std::ostream& operator<<(std::ostream& ostr, const Material& mat);
 
diff --git a/Sample/Particle/Crystal.cpp b/Sample/Particle/Crystal.cpp
index 8bd08b32437e42bf6d4f1379964136937d3e36a2..20c137052dce9ac20f39621b3638acc172e2570a 100644
--- a/Sample/Particle/Crystal.cpp
+++ b/Sample/Particle/Crystal.cpp
@@ -13,7 +13,7 @@
 //  ************************************************************************************************
 
 #include "Sample/Particle/Crystal.h"
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include "Sample/Particle/FormFactorCrystal.h"
 #include "Sample/Particle/Particle.h"
 #include "Sample/Particle/ParticleComposition.h"
@@ -42,13 +42,13 @@ Crystal* Crystal::clone() const
 IFormFactor* Crystal::createTotalFormFactor(const IFormFactor& meso_crystal_form_factor,
                                             const IRotation* rotation, const R3& translation) const
 {
-    Lattice3D transformed_lattice = transformedLattice(rotation);
+    Lattice3D rotated_lattice = rotatedLattice(rotation);
     std::unique_ptr<IParticle> basis_clone{m_basis->clone()};
     if (rotation)
         basis_clone->rotate(*rotation);
     basis_clone->translate(translation);
     const std::unique_ptr<IFormFactor> basis_ff(basis_clone->createFormFactor());
-    return new FormFactorCrystal(transformed_lattice, *basis_ff, meso_crystal_form_factor,
+    return new FormFactorCrystal(rotated_lattice, *basis_ff, meso_crystal_form_factor,
                                  m_position_variance);
 }
 
@@ -70,11 +70,11 @@ Admixtures Crystal::admixtures() const
     return result;
 }
 
-Lattice3D Crystal::transformedLattice(const IRotation* rotation) const
+Lattice3D Crystal::rotatedLattice(const IRotation* rotation) const
 {
     if (!rotation)
         return m_lattice;
-    return m_lattice.transformed(rotation->getTransform3D());
+    return m_lattice.rotated(rotation->getRotMatrix());
 }
 
 std::vector<const INode*> Crystal::getChildren() const
diff --git a/Sample/Particle/Crystal.h b/Sample/Particle/Crystal.h
index b33e4d2c6cccb8a12e7a174bbc21c8c2014d0af7..e7926a1f3a1f86a05a89ef1e9cb87dcfc1804349 100644
--- a/Sample/Particle/Crystal.h
+++ b/Sample/Particle/Crystal.h
@@ -48,7 +48,7 @@ public:
 
     Admixtures admixtures() const;
 
-    Lattice3D transformedLattice(const IRotation* rotation = nullptr) const;
+    Lattice3D rotatedLattice(const IRotation* rotation = nullptr) const; // TODO provide Py example
 
     std::vector<const INode*> getChildren() const override;
     const IParticle* basis() const;
diff --git a/Sample/Particle/MesoCrystal.cpp b/Sample/Particle/MesoCrystal.cpp
index e7074380af42c4811463883b082f33015c9acc29..330bb6413a783bcee9157c6de2e650fa66997a2f 100644
--- a/Sample/Particle/MesoCrystal.cpp
+++ b/Sample/Particle/MesoCrystal.cpp
@@ -16,8 +16,6 @@
 #include "Base/Util/Assert.h"
 #include "Sample/Particle/Crystal.h"
 #include "Sample/Particle/SlicedParticle.h"
-#include "Sample/Scattering/FormFactorDecoratorPositionFactor.h"
-#include "Sample/Scattering/FormFactorDecoratorRotation.h"
 #include "Sample/Scattering/Rotations.h"
 
 MesoCrystal::MesoCrystal(Crystal* particle_structure, IFormFactor* form_factor)
diff --git a/Sample/Particle/Particle.cpp b/Sample/Particle/Particle.cpp
index e844f4c2248c5c7651ac97ef3d6f92b0cb403434..b6be88d7b4f469c51243c82a9c601b8ca3ef358a 100644
--- a/Sample/Particle/Particle.cpp
+++ b/Sample/Particle/Particle.cpp
@@ -14,7 +14,7 @@
 
 #include "Sample/Particle/Particle.h"
 #include "Base/Util/Assert.h"
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include "Sample/Material/MaterialFactoryFuncs.h"
 #include "Sample/Particle/SlicedParticle.h"
 #include "Sample/Scattering/FormFactorDecoratorMaterial.h"
@@ -56,7 +56,7 @@ SlicedParticle Particle::createSlicedParticle(const ZLimits& limits) const
     auto sliced_ff = std::make_unique<FormFactorDecoratorMaterial>(*sliced_raw_ff);
     double volume = sliced_raw_ff->volume();
     Material transformed_material(
-        m_rotation ? m_material.rotatedMaterial(m_rotation->getTransform3D()) : m_material);
+        m_rotation ? m_material.rotatedMaterial(m_rotation->getRotMatrix()) : m_material);
     sliced_ff->setMaterial(transformed_material);
     return {std::move(sliced_ff), {{{volume, transformed_material}}}};
 }
diff --git a/Sample/Scattering/FormFactorDecoratorRotation.cpp b/Sample/Scattering/FormFactorDecoratorRotation.cpp
index 96402f29399367ac798cb6d138911d8c25a11985..d6a4f5d9f632b8760b4382aa7cb2f7d111f196b8 100644
--- a/Sample/Scattering/FormFactorDecoratorRotation.cpp
+++ b/Sample/Scattering/FormFactorDecoratorRotation.cpp
@@ -13,48 +13,50 @@
 //  ************************************************************************************************
 
 #include "Sample/Scattering/FormFactorDecoratorRotation.h"
+#include "Base/Vector/RotMatrix.h"
 #include "Base/Vector/WavevectorInfo.h"
 #include "Sample/Scattering/Rotations.h"
 #include <memory>
 
+FormFactorDecoratorRotation::FormFactorDecoratorRotation(const IFormFactor& ff,
+                                                         const RotMatrix& rotMatrix)
+    : IFormFactorDecorator(ff), m_rotMatrix(std::make_unique<RotMatrix>(rotMatrix))
+{
+}
+
 FormFactorDecoratorRotation::FormFactorDecoratorRotation(const IFormFactor& ff,
                                                          const IRotation& rotation)
-    : IFormFactorDecorator(ff)
+    : FormFactorDecoratorRotation(ff, rotation.getRotMatrix())
 {
-    m_transform = rotation.getTransform3D();
 }
 
+FormFactorDecoratorRotation::~FormFactorDecoratorRotation() = default;
+
 FormFactorDecoratorRotation* FormFactorDecoratorRotation::clone() const
 {
-    return new FormFactorDecoratorRotation(*m_ff, m_transform);
+    return new FormFactorDecoratorRotation(*m_ff, *m_rotMatrix);
 }
 
 double FormFactorDecoratorRotation::bottomZ(const IRotation* rotation) const
 {
-    Transform3D transform = rotation ? rotation->getTransform3D() : Transform3D();
-    std::unique_ptr<IRotation> total_rotation(IRotation::createRotation(transform * m_transform));
+    RotMatrix transform = rotation ? rotation->getRotMatrix() : RotMatrix();
+    std::unique_ptr<IRotation> total_rotation(IRotation::createRotation(transform * *m_rotMatrix));
     return m_ff->bottomZ(total_rotation.get());
 }
 
 double FormFactorDecoratorRotation::topZ(const IRotation* rotation) const
 {
-    Transform3D transform = rotation ? rotation->getTransform3D() : Transform3D();
-    std::unique_ptr<IRotation> total_rotation(IRotation::createRotation(transform * m_transform));
+    RotMatrix transform = rotation ? rotation->getRotMatrix() : RotMatrix();
+    std::unique_ptr<IRotation> total_rotation(IRotation::createRotation(transform * *m_rotMatrix));
     return m_ff->topZ(total_rotation.get());
 }
 
 complex_t FormFactorDecoratorRotation::theFF(const WavevectorInfo& wavevectors) const
 {
-    return m_ff->theFF(wavevectors.transformed(m_transform.getInverse()));
+    return m_ff->theFF(wavevectors.transformed(m_rotMatrix->getInverse()));
 }
 
 Eigen::Matrix2cd FormFactorDecoratorRotation::thePolFF(const WavevectorInfo& wavevectors) const
 {
-    return m_ff->thePolFF(wavevectors.transformed(m_transform.getInverse()));
-}
-
-FormFactorDecoratorRotation::FormFactorDecoratorRotation(const IFormFactor& ff,
-                                                         const Transform3D& transform)
-    : IFormFactorDecorator(ff), m_transform(transform)
-{
+    return m_ff->thePolFF(wavevectors.transformed(m_rotMatrix->getInverse()));
 }
diff --git a/Sample/Scattering/FormFactorDecoratorRotation.h b/Sample/Scattering/FormFactorDecoratorRotation.h
index 6efdd73bf57b07a970b14b5fc7ef639b1688b2ce..5297c58a2f345f997672bdaf2abc3d3f13a41439 100644
--- a/Sample/Scattering/FormFactorDecoratorRotation.h
+++ b/Sample/Scattering/FormFactorDecoratorRotation.h
@@ -20,10 +20,10 @@
 #ifndef BORNAGAIN_SAMPLE_SCATTERING_FORMFACTORDECORATORROTATION_H
 #define BORNAGAIN_SAMPLE_SCATTERING_FORMFACTORDECORATORROTATION_H
 
-#include "Base/Vector/Transform3D.h"
 #include "Sample/Scattering/IFormFactorDecorator.h"
 
 class IRotation;
+class RotMatrix;
 
 //! Equips a form factor with a rotation.
 
@@ -35,6 +35,8 @@ public:
     //! Constructor, setting form factor and rotation.
     FormFactorDecoratorRotation(const IFormFactor& ff, const IRotation& rotation);
 
+    ~FormFactorDecoratorRotation();
+
     FormFactorDecoratorRotation* clone() const override;
 
     double bottomZ(const IRotation* rotation) const override;
@@ -47,9 +49,9 @@ public:
 #endif
 
 private:
-    Transform3D m_transform;
+    std::unique_ptr<RotMatrix> m_rotMatrix;
     //! Private constructor for cloning.
-    FormFactorDecoratorRotation(const IFormFactor& ff, const Transform3D& transform);
+    FormFactorDecoratorRotation(const IFormFactor& ff, const RotMatrix& rotMatrix);
 };
 
 #endif // BORNAGAIN_SAMPLE_SCATTERING_FORMFACTORDECORATORROTATION_H
diff --git a/Sample/Scattering/Rotations.cpp b/Sample/Scattering/Rotations.cpp
index ef2b1c5e8d8d083db5e8f019bda3a2412d8568a9..568b5f5893122c72a56561d14d6d4ad0435264e6 100644
--- a/Sample/Scattering/Rotations.cpp
+++ b/Sample/Scattering/Rotations.cpp
@@ -14,7 +14,7 @@
 
 #include "Sample/Scattering/Rotations.h"
 #include "Base/Util/Assert.h"
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 
 //  ************************************************************************************************
 //  interface IRotation
@@ -25,23 +25,23 @@ IRotation::IRotation(const NodeMeta& meta, const std::vector<double>& PValues)
 {
 }
 
-IRotation* IRotation::createRotation(const Transform3D& transform)
+IRotation* IRotation::createRotation(const RotMatrix& transform)
 {
     auto rot_type = transform.getRotationType();
     switch (rot_type) {
-    case Transform3D::XAXIS: {
+    case RotMatrix::XAXIS: {
         double angle = transform.calculateRotateXAngle();
         return new RotationX(angle);
     }
-    case Transform3D::YAXIS: {
+    case RotMatrix::YAXIS: {
         double angle = transform.calculateRotateYAngle();
         return new RotationY(angle);
     }
-    case Transform3D::ZAXIS: {
+    case RotMatrix::ZAXIS: {
         double angle = transform.calculateRotateZAngle();
         return new RotationZ(angle);
     }
-    case Transform3D::EULER: {
+    case RotMatrix::EULER: {
         double alpha, beta, gamma;
         transform.calculateEulerAngles(&alpha, &beta, &gamma);
         return new RotationEuler(alpha, beta, gamma);
@@ -52,25 +52,25 @@ IRotation* IRotation::createRotation(const Transform3D& transform)
 
 R3 IRotation::transformed(const R3& v) const
 {
-    return getTransform3D().transformed(v);
+    return getRotMatrix().transformed(v);
 }
 
 bool IRotation::isIdentity() const
 {
-    return getTransform3D().isIdentity();
+    return getRotMatrix().isIdentity();
 }
 
 bool IRotation::zInvariant() const
 {
-    return getTransform3D().isZRotation();
+    return getRotMatrix().isZRotation();
 }
 
 //! Returns concatenated rotation (first right, then left).
 
 IRotation* createProduct(const IRotation& left, const IRotation& right)
 {
-    Transform3D tr_left = left.getTransform3D();
-    Transform3D tr_right = right.getTransform3D();
+    RotMatrix tr_left = left.getRotMatrix();
+    RotMatrix tr_right = right.getRotMatrix();
     IRotation* p_result = IRotation::createRotation(tr_left * tr_right);
     return p_result;
 }
@@ -84,7 +84,7 @@ IdentityRotation::IdentityRotation()
 {
 }
 
-Transform3D IdentityRotation::getTransform3D() const
+RotMatrix IdentityRotation::getRotMatrix() const
 {
     return {};
 }
@@ -103,9 +103,9 @@ RotationX::RotationX(const std::vector<double> P)
 
 RotationX::RotationX(double angle) : RotationX(std::vector<double>{angle}) {}
 
-Transform3D RotationX::getTransform3D() const
+RotMatrix RotationX::getRotMatrix() const
 {
-    return Transform3D::createRotateX(m_angle);
+    return RotMatrix::createRotateX(m_angle);
 }
 
 //  ************************************************************************************************
@@ -122,9 +122,9 @@ RotationY::RotationY(const std::vector<double> P)
 
 RotationY::RotationY(double angle) : RotationY(std::vector<double>{angle}) {}
 
-Transform3D RotationY::getTransform3D() const
+RotMatrix RotationY::getRotMatrix() const
 {
-    return Transform3D::createRotateY(m_angle);
+    return RotMatrix::createRotateY(m_angle);
 }
 
 //  ************************************************************************************************
@@ -143,9 +143,9 @@ RotationZ::RotationZ(const std::vector<double> P)
 
 RotationZ::RotationZ(double angle) : RotationZ(std::vector<double>{angle}) {}
 
-Transform3D RotationZ::getTransform3D() const
+RotMatrix RotationZ::getRotMatrix() const
 {
-    return Transform3D::createRotateZ(m_angle);
+    return RotMatrix::createRotateZ(m_angle);
 }
 
 //  ************************************************************************************************
@@ -172,11 +172,11 @@ RotationEuler::RotationEuler(double alpha, double beta, double gamma)
 
 IRotation* RotationEuler::createInverse() const
 {
-    Transform3D inverse_transform(getTransform3D().getInverse());
+    RotMatrix inverse_transform(getRotMatrix().getInverse());
     return createRotation(inverse_transform);
 }
 
-Transform3D RotationEuler::getTransform3D() const
+RotMatrix RotationEuler::getRotMatrix() const
 {
-    return Transform3D::createRotateEuler(m_alpha, m_beta, m_gamma);
+    return RotMatrix::createRotateEuler(m_alpha, m_beta, m_gamma);
 }
diff --git a/Sample/Scattering/Rotations.h b/Sample/Scattering/Rotations.h
index 026debbfd2a7f27218e082d3ebc24f7e920b3e1b..215e00fe98f0a1cd54d08f1495d3d6d630221df8 100644
--- a/Sample/Scattering/Rotations.h
+++ b/Sample/Scattering/Rotations.h
@@ -19,7 +19,7 @@
 #include "Param/Node/INode.h"
 #include <heinz/Vectors3D.h>
 
-class Transform3D;
+class RotMatrix;
 
 #ifndef USER_API
 
@@ -28,7 +28,7 @@ class Transform3D;
 
 class IRotation : public ICloneable, public INode {
 public:
-    static IRotation* createRotation(const Transform3D& transform);
+    static IRotation* createRotation(const RotMatrix& transform);
 
     IRotation(const NodeMeta& meta, const std::vector<double>& PValues);
 
@@ -38,7 +38,7 @@ public:
     virtual IRotation* createInverse() const = 0;
 
     //! Returns transformation.
-    virtual Transform3D getTransform3D() const = 0;
+    virtual RotMatrix getRotMatrix() const = 0;
 
     R3 transformed(const R3& v) const;
 
@@ -65,7 +65,7 @@ public:
     IdentityRotation* clone() const override { return new IdentityRotation(); }
     IdentityRotation* createInverse() const override { return new IdentityRotation(); }
 
-    Transform3D getTransform3D() const override;
+    RotMatrix getRotMatrix() const override;
 
     bool isIdentity() const override { return true; }
 };
@@ -85,7 +85,7 @@ public:
 
     double getAngle() const { return m_angle; }
 
-    Transform3D getTransform3D() const override;
+    RotMatrix getRotMatrix() const override;
 
 protected:
     const double& m_angle;
@@ -106,7 +106,7 @@ public:
 
     double getAngle() const { return m_angle; }
 
-    Transform3D getTransform3D() const override;
+    RotMatrix getRotMatrix() const override;
 
 protected:
     const double& m_angle;
@@ -127,7 +127,7 @@ public:
 
     double getAngle() const { return m_angle; }
 
-    Transform3D getTransform3D() const override;
+    RotMatrix getRotMatrix() const override;
 
 protected:
     const double& m_angle;
@@ -150,7 +150,7 @@ public:
     double getBeta() const { return m_beta; }
     double getGamma() const { return m_gamma; }
 
-    Transform3D getTransform3D() const override;
+    RotMatrix getRotMatrix() const override;
 
 protected:
     double m_alpha, m_beta, m_gamma;
diff --git a/Tests/Unit/Base/KVectorTest.cpp b/Tests/Unit/Base/KVectorTest.cpp
index 46baa70e70b335651010eb73f7493c198585cab0..9949c441c18095dea2415b0d726b58ec3b57bc13 100644
--- a/Tests/Unit/Base/KVectorTest.cpp
+++ b/Tests/Unit/Base/KVectorTest.cpp
@@ -1,4 +1,4 @@
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include "Tests/GTestWrapper/google_test.h"
 
 class KVectorTest : public ::testing::Test {
@@ -11,19 +11,19 @@ TEST_F(KVectorTest, BasicTransformation)
 
     // rotation via transformation
     a = R3(std::sqrt(3.) / 2., 2., 0.5);
-    Transform3D m2 = Transform3D::createRotateY(M_PI / 6.);
+    RotMatrix m2 = RotMatrix::createRotateY(M_PI / 6.);
     v = m2.transformed(a);
     ASSERT_NEAR(v.x(), 1.0, epsilon);
     EXPECT_DOUBLE_EQ(v.y(), 2.0);
     ASSERT_NEAR(v.z(), 0.0, epsilon);
 
     a = R3(0.5, std::sqrt(3.) / 2., 2.);
-    Transform3D m3 = Transform3D::createRotateZ(M_PI / 6.);
+    RotMatrix m3 = RotMatrix::createRotateZ(M_PI / 6.);
     v = m3.transformed(a);
     ASSERT_NEAR(v.x(), 0.0, epsilon);
     ASSERT_NEAR(v.y(), 1.0, epsilon);
     EXPECT_DOUBLE_EQ(v.z(), 2.0);
-    Transform3D m4 = m3.getInverse();
+    RotMatrix m4 = m3.getInverse();
     v = m4.transformed(v);
     ASSERT_NEAR(v.x(), a.x(), epsilon);
     ASSERT_NEAR(v.y(), a.y(), epsilon);
diff --git a/Tests/Unit/Resample/MaterialTest.cpp b/Tests/Unit/Resample/MaterialTest.cpp
index d295b60bb9990732b6f27780b0ba33b4d3048483..0e9437700e59e17a4e980f2047ff730c7e9c5c5a 100644
--- a/Tests/Unit/Resample/MaterialTest.cpp
+++ b/Tests/Unit/Resample/MaterialTest.cpp
@@ -1,5 +1,5 @@
 #include "Base/Const/Units.h"
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include "Base/Vector/WavevectorInfo.h"
 #include "Sample/Scattering/Rotations.h"
 #include "Tests/GTestWrapper/google_test.h"
@@ -53,13 +53,13 @@ TEST_F(MaterialTest, MaterialTransform)
     R3 transformed_mag = transform.transformed(magnetism);
 
     Material material = HomogeneousMaterial("Material", refIndex, magnetism);
-    Material material2 = material.rotatedMaterial(transform.getTransform3D());
+    Material material2 = material.rotatedMaterial(transform.getRotMatrix());
     EXPECT_EQ(material_data, material2.materialData());
     EXPECT_EQ(transformed_mag, material2.magnetization());
 
     Material material3 =
         MaterialBySLD("Material", material_data.real(), material_data.imag(), magnetism);
-    Material material4 = material.rotatedMaterial(transform.getTransform3D());
+    Material material4 = material.rotatedMaterial(transform.getRotMatrix());
     EXPECT_EQ(material_data, material4.materialData());
     EXPECT_EQ(transformed_mag, material4.magnetization());
 }
diff --git a/Tests/Unit/Sample/LatticeTest.cpp b/Tests/Unit/Sample/LatticeTest.cpp
index f450a5309ab2044450b116a58f51b4a13bf2e596..2670b84c430b362f8e5ba1c25f871d3004b853e1 100644
--- a/Tests/Unit/Sample/LatticeTest.cpp
+++ b/Tests/Unit/Sample/LatticeTest.cpp
@@ -1,5 +1,5 @@
 #include "Base/Math/Constants.h"
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include "Sample/Lattice/BakeLattice.h"
 #include "Sample/Lattice/Lattice3D.h"
 #include "Tests/GTestWrapper/google_test.h"
@@ -42,7 +42,7 @@ TEST_F(LatticeTest, reciprocalTest)
     EXPECT_EQ(m_rc, b3);
 }
 
-// tests whether Lattice has been transformed correctly
+// tests whether Lattice has been rotated correctly
 TEST_F(LatticeTest, transformTest)
 {
     R3 a1(1, 0, 0);
@@ -51,8 +51,8 @@ TEST_F(LatticeTest, transformTest)
     Lattice3D l1(a1, a2, a3);
 
     // use rotation by 90 degrees around z axis as a transformation
-    Transform3D tr = Transform3D::createRotateZ(M_TWOPI / 4);
-    Lattice3D ltr = l1.transformed(tr);
+    RotMatrix tr = RotMatrix::createRotateZ(M_TWOPI / 4);
+    Lattice3D ltr = l1.rotated(tr);
 
     // use EXPECT_NEAR as transform (matrix multiplication) uses double value for rotation angle
     // e.g. Rotating the vector (1,0,0) by 2*PI about z would give something like (0.99999,0,0)
diff --git a/Tests/Unit/Sample/RotationTest.cpp b/Tests/Unit/Sample/RotationTest.cpp
index 4d808a8b06b3c06bd76926fc241abd787a0e7038..d2c04434293a99f5158482667187811cc104a604 100644
--- a/Tests/Unit/Sample/RotationTest.cpp
+++ b/Tests/Unit/Sample/RotationTest.cpp
@@ -1,4 +1,4 @@
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include "Sample/Scattering/Rotations.h"
 #include "Tests/GTestWrapper/google_test.h"
 
@@ -11,7 +11,7 @@ TEST_F(RotationTest, XRotations)
 {
     double angle = 1.0;
     RotationX rot(angle);
-    auto rot_matrix = rot.getTransform3D();
+    auto rot_matrix = rot.getRotMatrix();
     auto P_rot = std::unique_ptr<IRotation>(IRotation::createRotation(rot_matrix));
     auto* p_rot_cast = dynamic_cast<RotationX*>(P_rot.get());
     ASSERT_NE(p_rot_cast, nullptr);
@@ -22,7 +22,7 @@ TEST_F(RotationTest, YRotations)
 {
     double angle = 1.0;
     RotationY rot(angle);
-    auto rot_matrix = rot.getTransform3D();
+    auto rot_matrix = rot.getRotMatrix();
     auto P_rot = std::unique_ptr<IRotation>(IRotation::createRotation(rot_matrix));
     auto* p_rot_cast = dynamic_cast<RotationY*>(P_rot.get());
     ASSERT_NE(p_rot_cast, nullptr);
@@ -33,7 +33,7 @@ TEST_F(RotationTest, ZRotations)
 {
     double angle = 1.0;
     RotationZ rot(angle);
-    auto rot_matrix = rot.getTransform3D();
+    auto rot_matrix = rot.getRotMatrix();
     auto P_rot = std::unique_ptr<IRotation>(IRotation::createRotation(rot_matrix));
     auto* p_rot_cast = dynamic_cast<RotationZ*>(P_rot.get());
     ASSERT_NE(p_rot_cast, nullptr);
@@ -46,7 +46,7 @@ TEST_F(RotationTest, EulerRotations)
     double beta = 0.2;
     double gamma = -0.5;
     RotationEuler rot(alpha, beta, gamma);
-    auto rot_matrix = rot.getTransform3D();
+    auto rot_matrix = rot.getRotMatrix();
     auto P_rot = std::unique_ptr<IRotation>(IRotation::createRotation(rot_matrix));
     auto* p_rot_cast = dynamic_cast<RotationEuler*>(P_rot.get());
     ASSERT_NE(p_rot_cast, nullptr);
diff --git a/Wrap/Swig/fromBase.i b/Wrap/Swig/fromBase.i
index ce5dac543d356be2447a13677508fef8f4f67bea..50d540a148619b449d3217d6e33316e6924dd041 100644
--- a/Wrap/Swig/fromBase.i
+++ b/Wrap/Swig/fromBase.i
@@ -1,7 +1,7 @@
 %import(module="libBornAgainBase") <heinz/Complex.h>
 %import(module="libBornAgainBase") <heinz/Vectors3D.h>
 %import(module="libBornAgainBase") "Base/Types/ICloneable.h"
-%import(module="libBornAgainBase") "Base/Vector/Transform3D.h"
+%import(module="libBornAgainBase") "Base/Vector/RotMatrix.h"
 %import(module="libBornAgainBase") "Base/Axis/IAxis.h"
 
 %template(R3) Vec3<double>;
diff --git a/Wrap/Swig/libBornAgainBase.i b/Wrap/Swig/libBornAgainBase.i
index 58e8cb1ee9ab15455a52957cdcb06d7a4b9fd1b6..7a0afa52605e5f6cd177d770b2c9949eaa6e57f1 100644
--- a/Wrap/Swig/libBornAgainBase.i
+++ b/Wrap/Swig/libBornAgainBase.i
@@ -31,7 +31,7 @@
 #include "Base/Axis/CustomBinAxis.h"
 #include "Base/Axis/FixedBinAxis.h"
 #include "Base/Axis/VariableBinAxis.h"
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 %}
 
 %include "heinz/Complex.h"
@@ -43,7 +43,7 @@
 
 %include "heinz/Vectors3D.h"
 %include "Base/Vector/Direction.h"
-%include "Base/Vector/Transform3D.h"
+%include "Base/Vector/RotMatrix.h"
 
 %include "Base/Axis/Bin.h"
 %include "Base/Axis/IAxis.h"
diff --git a/Wrap/Swig/libBornAgainSample.i b/Wrap/Swig/libBornAgainSample.i
index ba44b5857886a24a93a185c7dbd843540427d99d..4c954b913dac2e4eda0270900ed54c7b957c147a 100644
--- a/Wrap/Swig/libBornAgainSample.i
+++ b/Wrap/Swig/libBornAgainSample.i
@@ -34,7 +34,7 @@
 %feature("director") IBornFF;    // used in CustomFormFactor.py
 
 %{
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include "Param/Distrib/ParameterDistribution.h"
 #include "Sample/Aggregate/Interference1DLattice.h"
 #include "Sample/Aggregate/Interference2DLattice.h"
diff --git a/auto/Wrap/doxygenBase.i b/auto/Wrap/doxygenBase.i
index 8c68c8e896e70b6012e37e0c04003bab571f299d..3645d5870ff08cac98ce00620f2053708346f7a7 100644
--- a/auto/Wrap/doxygenBase.i
+++ b/auto/Wrap/doxygenBase.i
@@ -819,181 +819,181 @@ C++ includes: RectangularPixel.h
 ";
 
 
-// File: classSafePointerVector.xml
-%feature("docstring") SafePointerVector "
-
-A vector of pointers, owned by *this, with methods to handle them safely.
+// File: classRotMatrix.xml
+%feature("docstring") RotMatrix "
 
-The objects pointed to must support the  ICloneable interface.
+Rotation matrix in three dimensions.
 
-C++ includes: SafePointerVector.h
+C++ includes: RotMatrix.h
 ";
 
-%feature("docstring")  SafePointerVector::SafePointerVector "SafePointerVector< T >::SafePointerVector()=default
-";
+%feature("docstring")  RotMatrix::RotMatrix "RotMatrix::RotMatrix()
 
-%feature("docstring")  SafePointerVector::SafePointerVector "SafePointerVector< T >::SafePointerVector(const SafePointerVector &other)
+Constructs unit transformation. 
 ";
 
-%feature("docstring")  SafePointerVector::SafePointerVector "SafePointerVector< T >::SafePointerVector(SafePointerVector &&other) noexcept
-";
+%feature("docstring")  RotMatrix::RotMatrix "RotMatrix::RotMatrix(Eigen::Matrix3d matrix)
 
-%feature("docstring")  SafePointerVector::~SafePointerVector "SafePointerVector< T >::~SafePointerVector()
+Constructor from matrix (no checks if this is an element of SO(3)!) 
 ";
 
-%feature("docstring")  SafePointerVector::size "size_t SafePointerVector< T >::size() const
-";
+%feature("docstring")  RotMatrix::~RotMatrix "RotMatrix::~RotMatrix()=default
 
-%feature("docstring")  SafePointerVector::empty "bool SafePointerVector< T >::empty() const
+Destructor. 
 ";
 
-%feature("docstring")  SafePointerVector::push_back "void SafePointerVector< T >::push_back(T *pointer)
-";
+%feature("docstring")  RotMatrix::clone "RotMatrix * RotMatrix::clone() const
 
-%feature("docstring")  SafePointerVector::begin "iterator SafePointerVector< T >::begin()
+Clones the transformation. 
 ";
 
-%feature("docstring")  SafePointerVector::begin "const_iterator SafePointerVector< T >::begin() const
-";
+%feature("docstring")  RotMatrix::calculateEulerAngles "void RotMatrix::calculateEulerAngles(double *p_alpha, double *p_beta, double *p_gamma) const
 
-%feature("docstring")  SafePointerVector::end "iterator SafePointerVector< T >::end()
+Calculates the Euler angles corresponding to the rotation. 
 ";
 
-%feature("docstring")  SafePointerVector::end "const_iterator SafePointerVector< T >::end() const
-";
+%feature("docstring")  RotMatrix::calculateRotateXAngle "double RotMatrix::calculateRotateXAngle() const
 
-%feature("docstring")  SafePointerVector::back "T* SafePointerVector< T >::back()
+Calculates the rotation angle for a rotation around the x-axis alone Only meaningfull if the actual rotation is around the x-axis 
 ";
 
-%feature("docstring")  SafePointerVector::back "const T* SafePointerVector< T >::back() const
-";
+%feature("docstring")  RotMatrix::calculateRotateYAngle "double RotMatrix::calculateRotateYAngle() const
 
-%feature("docstring")  SafePointerVector::clear "void SafePointerVector< T >::clear()
+Calculates the rotation angle for a rotation around the y-axis alone Only meaningfull if the actual rotation is around the y-axis 
 ";
 
+%feature("docstring")  RotMatrix::calculateRotateZAngle "double RotMatrix::calculateRotateZAngle() const
 
-// File: classSphericalPixel.xml
-%feature("docstring") SphericalPixel "
+Calculates the rotation angle for a rotation around the z-axis alone Only meaningfull if the actual rotation is around the z-axis 
+";
 
-A pixel in a SphericalDetector.
+%feature("docstring")  RotMatrix::getInverse "RotMatrix RotMatrix::getInverse() const
 
-C++ includes: SphericalPixel.h
+Returns the inverse transformation. 
 ";
 
-%feature("docstring")  SphericalPixel::SphericalPixel "SphericalPixel::SphericalPixel(const Bin1D &alpha_bin, const Bin1D &phi_bin)
-";
+%feature("docstring")  RotMatrix::transformed "template C3 RotMatrix::transformed< C3 >(const T &v) const
 
-%feature("docstring")  SphericalPixel::clone "SphericalPixel * SphericalPixel::clone() const override
+Return transformed vector  v. 
 ";
 
-%feature("docstring")  SphericalPixel::createZeroSizePixel "SphericalPixel * SphericalPixel::createZeroSizePixel(double x, double y) const override
-";
+%feature("docstring")  RotMatrix::transformedInverse "template C3 RotMatrix::transformedInverse< C3 >(const T &v) const
 
-%feature("docstring")  SphericalPixel::getK "R3 SphericalPixel::getK(double x, double y, double wavelength) const override
+Return transformed vector  v. 
 ";
 
-%feature("docstring")  SphericalPixel::integrationFactor "double SphericalPixel::integrationFactor(double x, double y) const override
-";
+%feature("docstring")  RotMatrix::getRotationType "RotMatrix::ERotationType RotMatrix::getRotationType() const
 
-%feature("docstring")  SphericalPixel::solidAngle "double SphericalPixel::solidAngle() const override
+Retrieve the rotation type (general, around x, y or z-axis) 
 ";
 
+%feature("docstring")  RotMatrix::isIdentity "bool RotMatrix::isIdentity() const
 
-// File: structThreadInfo.xml
-%feature("docstring") ThreadInfo "
+Determine if the transformation is trivial (identity) 
+";
 
-Information to run simulation with dedicated number of threads.
+%feature("docstring")  RotMatrix::print "void RotMatrix::print(std::ostream &ostr) const
+";
 
-C++ includes: ThreadInfo.h
+%feature("docstring")  RotMatrix::isXRotation "bool RotMatrix::isXRotation() const
 ";
 
-%feature("docstring")  ThreadInfo::ThreadInfo "ThreadInfo::ThreadInfo()
+%feature("docstring")  RotMatrix::isYRotation "bool RotMatrix::isYRotation() const
 ";
 
+%feature("docstring")  RotMatrix::isZRotation "bool RotMatrix::isZRotation() const
+";
 
-// File: classTransform3D.xml
-%feature("docstring") Transform3D "
 
-Vector transformations in three dimensions.
+// File: classSafePointerVector.xml
+%feature("docstring") SafePointerVector "
 
-C++ includes: Transform3D.h
-";
+A vector of pointers, owned by *this, with methods to handle them safely.
 
-%feature("docstring")  Transform3D::Transform3D "Transform3D::Transform3D()
+The objects pointed to must support the  ICloneable interface.
 
-Constructs unit transformation. 
+C++ includes: SafePointerVector.h
 ";
 
-%feature("docstring")  Transform3D::Transform3D "Transform3D::Transform3D(Eigen::Matrix3d matrix)
-
-Constructor from matrix (no checks if this is an element of SO(3)!) 
+%feature("docstring")  SafePointerVector::SafePointerVector "SafePointerVector< T >::SafePointerVector()=default
 ";
 
-%feature("docstring")  Transform3D::~Transform3D "Transform3D::~Transform3D()=default
-
-Destructor. 
+%feature("docstring")  SafePointerVector::SafePointerVector "SafePointerVector< T >::SafePointerVector(const SafePointerVector &other)
 ";
 
-%feature("docstring")  Transform3D::clone "Transform3D * Transform3D::clone() const
+%feature("docstring")  SafePointerVector::SafePointerVector "SafePointerVector< T >::SafePointerVector(SafePointerVector &&other) noexcept
+";
 
-Clones the transformation. 
+%feature("docstring")  SafePointerVector::~SafePointerVector "SafePointerVector< T >::~SafePointerVector()
 ";
 
-%feature("docstring")  Transform3D::calculateEulerAngles "void Transform3D::calculateEulerAngles(double *p_alpha, double *p_beta, double *p_gamma) const
+%feature("docstring")  SafePointerVector::size "size_t SafePointerVector< T >::size() const
+";
 
-Calculates the Euler angles corresponding to the rotation. 
+%feature("docstring")  SafePointerVector::empty "bool SafePointerVector< T >::empty() const
 ";
 
-%feature("docstring")  Transform3D::calculateRotateXAngle "double Transform3D::calculateRotateXAngle() const
+%feature("docstring")  SafePointerVector::push_back "void SafePointerVector< T >::push_back(T *pointer)
+";
 
-Calculates the rotation angle for a rotation around the x-axis alone Only meaningfull if the actual rotation is around the x-axis 
+%feature("docstring")  SafePointerVector::begin "iterator SafePointerVector< T >::begin()
 ";
 
-%feature("docstring")  Transform3D::calculateRotateYAngle "double Transform3D::calculateRotateYAngle() const
+%feature("docstring")  SafePointerVector::begin "const_iterator SafePointerVector< T >::begin() const
+";
 
-Calculates the rotation angle for a rotation around the y-axis alone Only meaningfull if the actual rotation is around the y-axis 
+%feature("docstring")  SafePointerVector::end "iterator SafePointerVector< T >::end()
 ";
 
-%feature("docstring")  Transform3D::calculateRotateZAngle "double Transform3D::calculateRotateZAngle() const
+%feature("docstring")  SafePointerVector::end "const_iterator SafePointerVector< T >::end() const
+";
 
-Calculates the rotation angle for a rotation around the z-axis alone Only meaningfull if the actual rotation is around the z-axis 
+%feature("docstring")  SafePointerVector::back "T* SafePointerVector< T >::back()
 ";
 
-%feature("docstring")  Transform3D::getInverse "Transform3D Transform3D::getInverse() const
+%feature("docstring")  SafePointerVector::back "const T* SafePointerVector< T >::back() const
+";
 
-Returns the inverse transformation. 
+%feature("docstring")  SafePointerVector::clear "void SafePointerVector< T >::clear()
 ";
 
-%feature("docstring")  Transform3D::transformed "template C3 Transform3D::transformed< C3 >(const I3 &v) const
 
-Return transformed vector  v. 
-";
+// File: classSphericalPixel.xml
+%feature("docstring") SphericalPixel "
 
-%feature("docstring")  Transform3D::transformedInverse "template C3 Transform3D::transformedInverse< C3 >(const I3 &v) const
+A pixel in a SphericalDetector.
 
-Return transformed vector  v. 
+C++ includes: SphericalPixel.h
 ";
 
-%feature("docstring")  Transform3D::getRotationType "Transform3D::ERotationType Transform3D::getRotationType() const
+%feature("docstring")  SphericalPixel::SphericalPixel "SphericalPixel::SphericalPixel(const Bin1D &alpha_bin, const Bin1D &phi_bin)
+";
 
-Retrieve the rotation type (general, around x, y or z-axis) 
+%feature("docstring")  SphericalPixel::clone "SphericalPixel * SphericalPixel::clone() const override
 ";
 
-%feature("docstring")  Transform3D::isIdentity "bool Transform3D::isIdentity() const
+%feature("docstring")  SphericalPixel::createZeroSizePixel "SphericalPixel * SphericalPixel::createZeroSizePixel(double x, double y) const override
+";
 
-Determine if the transformation is trivial (identity) 
+%feature("docstring")  SphericalPixel::getK "R3 SphericalPixel::getK(double x, double y, double wavelength) const override
 ";
 
-%feature("docstring")  Transform3D::print "void Transform3D::print(std::ostream &ostr) const
+%feature("docstring")  SphericalPixel::integrationFactor "double SphericalPixel::integrationFactor(double x, double y) const override
 ";
 
-%feature("docstring")  Transform3D::isXRotation "bool Transform3D::isXRotation() const
+%feature("docstring")  SphericalPixel::solidAngle "double SphericalPixel::solidAngle() const override
 ";
 
-%feature("docstring")  Transform3D::isYRotation "bool Transform3D::isYRotation() const
+
+// File: structThreadInfo.xml
+%feature("docstring") ThreadInfo "
+
+Information to run simulation with dedicated number of threads.
+
+C++ includes: ThreadInfo.h
 ";
 
-%feature("docstring")  Transform3D::isZRotation "bool Transform3D::isZRotation() const
+%feature("docstring")  ThreadInfo::ThreadInfo "ThreadInfo::ThreadInfo()
 ";
 
 
@@ -1082,7 +1082,7 @@ C++ includes: WavevectorInfo.h
 %feature("docstring")  WavevectorInfo::WavevectorInfo "WavevectorInfo::WavevectorInfo(R3 ki, R3 kf, double wavelength)
 ";
 
-%feature("docstring")  WavevectorInfo::transformed "WavevectorInfo WavevectorInfo::transformed(const Transform3D &transform) const
+%feature("docstring")  WavevectorInfo::transformed "WavevectorInfo WavevectorInfo::transformed(const RotMatrix &transform) const
 ";
 
 %feature("docstring")  WavevectorInfo::getKi "C3 WavevectorInfo::getKi() const
@@ -1719,10 +1719,10 @@ This templated function is used in catalogs in form of a function pointer 'creat
 // File: EigenCore_8h.xml
 
 
-// File: Transform3D_8cpp.xml
+// File: RotMatrix_8cpp.xml
 
 
-// File: Transform3D_8h.xml
+// File: RotMatrix_8h.xml
 
 
 // File: WavevectorInfo_8cpp.xml
diff --git a/auto/Wrap/doxygenSample.i b/auto/Wrap/doxygenSample.i
index 0af58caae3663a09527824c0ee0b476672a5e8bb..dd400997d6e09d32f3102b32bdcd8e7f8dc4b9a4 100644
--- a/auto/Wrap/doxygenSample.i
+++ b/auto/Wrap/doxygenSample.i
@@ -87,7 +87,7 @@ Returns (  $ \\\\pi/\\\\lambda^2 $ - sld), sld being the scattering length densi
 Returns (  $ \\\\pi/\\\\lambda^2 $ - sld) matrix with magnetization corrections. 
 ";
 
-%feature("docstring")  BaseMaterialImpl::rotatedMaterial "virtual BaseMaterialImpl* BaseMaterialImpl::rotatedMaterial(const Transform3D &transform) const =0
+%feature("docstring")  BaseMaterialImpl::rotatedMaterial "virtual BaseMaterialImpl* BaseMaterialImpl::rotatedMaterial(const RotMatrix &transform) const =0
 ";
 
 %feature("docstring")  BaseMaterialImpl::print "virtual void BaseMaterialImpl::print(std::ostream &ostr) const =0
@@ -175,7 +175,7 @@ Returns a clone of this  ISampleNode object.
 %feature("docstring")  Crystal::admixtures "Admixtures Crystal::admixtures() const
 ";
 
-%feature("docstring")  Crystal::transformedLattice "Lattice3D Crystal::transformedLattice(const IRotation *rotation=nullptr) const
+%feature("docstring")  Crystal::rotatedLattice "Lattice3D Crystal::rotatedLattice(const IRotation *rotation=nullptr) const
 ";
 
 %feature("docstring")  Crystal::getChildren "std::vector< const INode * > Crystal::getChildren() const override
@@ -880,6 +880,9 @@ C++ includes: FormFactorDecoratorRotation.h
 Constructor, setting form factor and rotation. 
 ";
 
+%feature("docstring")  FormFactorDecoratorRotation::~FormFactorDecoratorRotation "FormFactorDecoratorRotation::~FormFactorDecoratorRotation()
+";
+
 %feature("docstring")  FormFactorDecoratorRotation::clone "FormFactorDecoratorRotation * FormFactorDecoratorRotation::clone() const override
 
 Returns a clone of this  ISampleNode object. 
@@ -2432,7 +2435,7 @@ C++ includes: Rotations.h
 Returns a new  IRotation object that is the current object's inverse. 
 ";
 
-%feature("docstring")  IdentityRotation::getTransform3D "Transform3D IdentityRotation::getTransform3D() const override
+%feature("docstring")  IdentityRotation::getRotMatrix "RotMatrix IdentityRotation::getRotMatrix() const override
 
 Returns transformation. 
 ";
@@ -3683,7 +3686,7 @@ C++ includes: Rotations.h
 Returns a new  IRotation object that is the current object's inverse. 
 ";
 
-%feature("docstring")  IRotation::getTransform3D "virtual Transform3D IRotation::getTransform3D() const =0
+%feature("docstring")  IRotation::getRotMatrix "virtual RotMatrix IRotation::getRotMatrix() const =0
 
 Returns transformation. 
 ";
@@ -3905,9 +3908,9 @@ C++ includes: Lattice3D.h
 %feature("docstring")  Lattice3D::~Lattice3D "Lattice3D::~Lattice3D() override
 ";
 
-%feature("docstring")  Lattice3D::transformed "Lattice3D Lattice3D::transformed(const Transform3D &transform) const
+%feature("docstring")  Lattice3D::rotated "Lattice3D Lattice3D::rotated(const RotMatrix &rotMatrix) const
 
-Creates transformed lattice. 
+Creates rotated lattice. 
 ";
 
 %feature("docstring")  Lattice3D::getBasisVectorA "R3 Lattice3D::getBasisVectorA() const
@@ -4224,7 +4227,7 @@ Returns the magnetization (in A/m)
 Returns (  $ \\\\pi/\\\\lambda^2 $ - sld) matrix with magnetization corrections. 
 ";
 
-%feature("docstring")  MagneticMaterialImpl::rotatedMaterial "MagneticMaterialImpl * MagneticMaterialImpl::rotatedMaterial(const Transform3D &transform) const override
+%feature("docstring")  MagneticMaterialImpl::rotatedMaterial "MagneticMaterialImpl * MagneticMaterialImpl::rotatedMaterial(const RotMatrix &transform) const override
 ";
 
 
@@ -4310,7 +4313,7 @@ Returns (  $ \\\\pi/\\\\lambda^2 $ - sld), sld (in  $nm^{-2}$) being the scatter
 Returns (  $ \\\\pi/\\\\lambda^2 $ - sld) matrix with magnetization corrections. 
 ";
 
-%feature("docstring")  Material::rotatedMaterial "Material Material::rotatedMaterial(const Transform3D &transform) const
+%feature("docstring")  Material::rotatedMaterial "Material Material::rotatedMaterial(const RotMatrix &transform) const
 ";
 
 
@@ -5064,7 +5067,7 @@ Returns a new  IRotation object that is the current object's inverse.
 %feature("docstring")  RotationEuler::getGamma "double RotationEuler::getGamma() const
 ";
 
-%feature("docstring")  RotationEuler::getTransform3D "Transform3D RotationEuler::getTransform3D() const override
+%feature("docstring")  RotationEuler::getRotMatrix "RotMatrix RotationEuler::getRotMatrix() const override
 
 Returns transformation. 
 ";
@@ -5100,7 +5103,7 @@ Returns a new  IRotation object that is the current object's inverse.
 %feature("docstring")  RotationX::getAngle "double RotationX::getAngle() const
 ";
 
-%feature("docstring")  RotationX::getTransform3D "Transform3D RotationX::getTransform3D() const override
+%feature("docstring")  RotationX::getRotMatrix "RotMatrix RotationX::getRotMatrix() const override
 
 Returns transformation. 
 ";
@@ -5136,7 +5139,7 @@ Returns a new  IRotation object that is the current object's inverse.
 %feature("docstring")  RotationY::getAngle "double RotationY::getAngle() const
 ";
 
-%feature("docstring")  RotationY::getTransform3D "Transform3D RotationY::getTransform3D() const override
+%feature("docstring")  RotationY::getRotMatrix "RotMatrix RotationY::getRotMatrix() const override
 
 Returns transformation. 
 ";
@@ -5172,7 +5175,7 @@ Returns a new  IRotation object that is the current object's inverse.
 %feature("docstring")  RotationZ::getAngle "double RotationZ::getAngle() const
 ";
 
-%feature("docstring")  RotationZ::getTransform3D "Transform3D RotationZ::getTransform3D() const override
+%feature("docstring")  RotationZ::getRotMatrix "RotMatrix RotationZ::getRotMatrix() const override
 
 Returns transformation. 
 ";
diff --git a/auto/Wrap/libBornAgainBase.py b/auto/Wrap/libBornAgainBase.py
index 789add81281aeedb162be1ac13df00fe87de2d37..9f5bae8defedfd68c8ec44ac186cfb9a325661d2 100644
--- a/auto/Wrap/libBornAgainBase.py
+++ b/auto/Wrap/libBornAgainBase.py
@@ -2058,196 +2058,196 @@ deg = cvar.deg
 tesla = cvar.tesla
 gauss = cvar.gauss
 
-class Transform3D(object):
+class RotMatrix(object):
     r"""
 
 
-    Vector transformations in three dimensions.
+    Rotation matrix in three dimensions.
 
-    C++ includes: Transform3D.h
+    C++ includes: RotMatrix.h
 
     """
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
-    EULER = _libBornAgainBase.Transform3D_EULER
+    EULER = _libBornAgainBase.RotMatrix_EULER
     
-    XAXIS = _libBornAgainBase.Transform3D_XAXIS
+    XAXIS = _libBornAgainBase.RotMatrix_XAXIS
     
-    YAXIS = _libBornAgainBase.Transform3D_YAXIS
+    YAXIS = _libBornAgainBase.RotMatrix_YAXIS
     
-    ZAXIS = _libBornAgainBase.Transform3D_ZAXIS
+    ZAXIS = _libBornAgainBase.RotMatrix_ZAXIS
     
 
     def __init__(self):
         r"""
-        __init__(Transform3D self) -> Transform3D
-        Transform3D::Transform3D(Eigen::Matrix3d matrix)
+        __init__(RotMatrix self) -> RotMatrix
+        RotMatrix::RotMatrix(Eigen::Matrix3d matrix)
 
         Constructor from matrix (no checks if this is an element of SO(3)!) 
 
         """
-        _libBornAgainBase.Transform3D_swiginit(self, _libBornAgainBase.new_Transform3D())
-    __swig_destroy__ = _libBornAgainBase.delete_Transform3D
+        _libBornAgainBase.RotMatrix_swiginit(self, _libBornAgainBase.new_RotMatrix())
+    __swig_destroy__ = _libBornAgainBase.delete_RotMatrix
 
     def clone(self):
         r"""
-        clone(Transform3D self) -> Transform3D
-        Transform3D * Transform3D::clone() const
+        clone(RotMatrix self) -> RotMatrix
+        RotMatrix * RotMatrix::clone() const
 
         Clones the transformation. 
 
         """
-        return _libBornAgainBase.Transform3D_clone(self)
+        return _libBornAgainBase.RotMatrix_clone(self)
 
     @staticmethod
     def createRotateX(phi):
-        r"""createRotateX(double phi) -> Transform3D"""
-        return _libBornAgainBase.Transform3D_createRotateX(phi)
+        r"""createRotateX(double phi) -> RotMatrix"""
+        return _libBornAgainBase.RotMatrix_createRotateX(phi)
 
     @staticmethod
     def createRotateY(phi):
-        r"""createRotateY(double phi) -> Transform3D"""
-        return _libBornAgainBase.Transform3D_createRotateY(phi)
+        r"""createRotateY(double phi) -> RotMatrix"""
+        return _libBornAgainBase.RotMatrix_createRotateY(phi)
 
     @staticmethod
     def createRotateZ(phi):
-        r"""createRotateZ(double phi) -> Transform3D"""
-        return _libBornAgainBase.Transform3D_createRotateZ(phi)
+        r"""createRotateZ(double phi) -> RotMatrix"""
+        return _libBornAgainBase.RotMatrix_createRotateZ(phi)
 
     @staticmethod
     def createRotateEuler(alpha, beta, gamma):
-        r"""createRotateEuler(double alpha, double beta, double gamma) -> Transform3D"""
-        return _libBornAgainBase.Transform3D_createRotateEuler(alpha, beta, gamma)
+        r"""createRotateEuler(double alpha, double beta, double gamma) -> RotMatrix"""
+        return _libBornAgainBase.RotMatrix_createRotateEuler(alpha, beta, gamma)
 
     def calculateEulerAngles(self, p_alpha, p_beta, p_gamma):
         r"""
-        calculateEulerAngles(Transform3D self, double * p_alpha, double * p_beta, double * p_gamma)
-        void Transform3D::calculateEulerAngles(double *p_alpha, double *p_beta, double *p_gamma) const
+        calculateEulerAngles(RotMatrix self, double * p_alpha, double * p_beta, double * p_gamma)
+        void RotMatrix::calculateEulerAngles(double *p_alpha, double *p_beta, double *p_gamma) const
 
         Calculates the Euler angles corresponding to the rotation. 
 
         """
-        return _libBornAgainBase.Transform3D_calculateEulerAngles(self, p_alpha, p_beta, p_gamma)
+        return _libBornAgainBase.RotMatrix_calculateEulerAngles(self, p_alpha, p_beta, p_gamma)
 
     def calculateRotateXAngle(self):
         r"""
-        calculateRotateXAngle(Transform3D self) -> double
-        double Transform3D::calculateRotateXAngle() const
+        calculateRotateXAngle(RotMatrix self) -> double
+        double RotMatrix::calculateRotateXAngle() const
 
         Calculates the rotation angle for a rotation around the x-axis alone Only meaningfull if the actual rotation is around the x-axis 
 
         """
-        return _libBornAgainBase.Transform3D_calculateRotateXAngle(self)
+        return _libBornAgainBase.RotMatrix_calculateRotateXAngle(self)
 
     def calculateRotateYAngle(self):
         r"""
-        calculateRotateYAngle(Transform3D self) -> double
-        double Transform3D::calculateRotateYAngle() const
+        calculateRotateYAngle(RotMatrix self) -> double
+        double RotMatrix::calculateRotateYAngle() const
 
         Calculates the rotation angle for a rotation around the y-axis alone Only meaningfull if the actual rotation is around the y-axis 
 
         """
-        return _libBornAgainBase.Transform3D_calculateRotateYAngle(self)
+        return _libBornAgainBase.RotMatrix_calculateRotateYAngle(self)
 
     def calculateRotateZAngle(self):
         r"""
-        calculateRotateZAngle(Transform3D self) -> double
-        double Transform3D::calculateRotateZAngle() const
+        calculateRotateZAngle(RotMatrix self) -> double
+        double RotMatrix::calculateRotateZAngle() const
 
         Calculates the rotation angle for a rotation around the z-axis alone Only meaningfull if the actual rotation is around the z-axis 
 
         """
-        return _libBornAgainBase.Transform3D_calculateRotateZAngle(self)
+        return _libBornAgainBase.RotMatrix_calculateRotateZAngle(self)
 
     def getInverse(self):
         r"""
-        getInverse(Transform3D self) -> Transform3D
-        Transform3D Transform3D::getInverse() const
+        getInverse(RotMatrix self) -> RotMatrix
+        RotMatrix RotMatrix::getInverse() const
 
         Returns the inverse transformation. 
 
         """
-        return _libBornAgainBase.Transform3D_getInverse(self)
+        return _libBornAgainBase.RotMatrix_getInverse(self)
 
     def __mul__(self, other):
-        r"""__mul__(Transform3D self, Transform3D other) -> Transform3D"""
-        return _libBornAgainBase.Transform3D___mul__(self, other)
+        r"""__mul__(RotMatrix self, RotMatrix other) -> RotMatrix"""
+        return _libBornAgainBase.RotMatrix___mul__(self, other)
 
     def __eq__(self, other):
-        r"""__eq__(Transform3D self, Transform3D other) -> bool"""
-        return _libBornAgainBase.Transform3D___eq__(self, other)
+        r"""__eq__(RotMatrix self, RotMatrix other) -> bool"""
+        return _libBornAgainBase.RotMatrix___eq__(self, other)
 
     def getRotationType(self):
         r"""
-        getRotationType(Transform3D self) -> Transform3D::ERotationType
-        Transform3D::ERotationType Transform3D::getRotationType() const
+        getRotationType(RotMatrix self) -> RotMatrix::ERotationType
+        RotMatrix::ERotationType RotMatrix::getRotationType() const
 
         Retrieve the rotation type (general, around x, y or z-axis) 
 
         """
-        return _libBornAgainBase.Transform3D_getRotationType(self)
+        return _libBornAgainBase.RotMatrix_getRotationType(self)
 
     def isIdentity(self):
         r"""
-        isIdentity(Transform3D self) -> bool
-        bool Transform3D::isIdentity() const
+        isIdentity(RotMatrix self) -> bool
+        bool RotMatrix::isIdentity() const
 
         Determine if the transformation is trivial (identity) 
 
         """
-        return _libBornAgainBase.Transform3D_isIdentity(self)
+        return _libBornAgainBase.RotMatrix_isIdentity(self)
 
     def _print(self, ostr):
         r"""
-        _print(Transform3D self, std::ostream & ostr)
-        void Transform3D::print(std::ostream &ostr) const
+        _print(RotMatrix self, std::ostream & ostr)
+        void RotMatrix::print(std::ostream &ostr) const
 
         """
-        return _libBornAgainBase.Transform3D__print(self, ostr)
+        return _libBornAgainBase.RotMatrix__print(self, ostr)
 
     def isXRotation(self):
         r"""
-        isXRotation(Transform3D self) -> bool
-        bool Transform3D::isXRotation() const
+        isXRotation(RotMatrix self) -> bool
+        bool RotMatrix::isXRotation() const
 
         """
-        return _libBornAgainBase.Transform3D_isXRotation(self)
+        return _libBornAgainBase.RotMatrix_isXRotation(self)
 
     def isYRotation(self):
         r"""
-        isYRotation(Transform3D self) -> bool
-        bool Transform3D::isYRotation() const
+        isYRotation(RotMatrix self) -> bool
+        bool RotMatrix::isYRotation() const
 
         """
-        return _libBornAgainBase.Transform3D_isYRotation(self)
+        return _libBornAgainBase.RotMatrix_isYRotation(self)
 
     def isZRotation(self):
         r"""
-        isZRotation(Transform3D self) -> bool
-        bool Transform3D::isZRotation() const
+        isZRotation(RotMatrix self) -> bool
+        bool RotMatrix::isZRotation() const
 
         """
-        return _libBornAgainBase.Transform3D_isZRotation(self)
+        return _libBornAgainBase.RotMatrix_isZRotation(self)
 
-# Register Transform3D in _libBornAgainBase:
-_libBornAgainBase.Transform3D_swigregister(Transform3D)
+# Register RotMatrix in _libBornAgainBase:
+_libBornAgainBase.RotMatrix_swigregister(RotMatrix)
 
-def Transform3D_createRotateX(phi):
-    r"""Transform3D_createRotateX(double phi) -> Transform3D"""
-    return _libBornAgainBase.Transform3D_createRotateX(phi)
+def RotMatrix_createRotateX(phi):
+    r"""RotMatrix_createRotateX(double phi) -> RotMatrix"""
+    return _libBornAgainBase.RotMatrix_createRotateX(phi)
 
-def Transform3D_createRotateY(phi):
-    r"""Transform3D_createRotateY(double phi) -> Transform3D"""
-    return _libBornAgainBase.Transform3D_createRotateY(phi)
+def RotMatrix_createRotateY(phi):
+    r"""RotMatrix_createRotateY(double phi) -> RotMatrix"""
+    return _libBornAgainBase.RotMatrix_createRotateY(phi)
 
-def Transform3D_createRotateZ(phi):
-    r"""Transform3D_createRotateZ(double phi) -> Transform3D"""
-    return _libBornAgainBase.Transform3D_createRotateZ(phi)
+def RotMatrix_createRotateZ(phi):
+    r"""RotMatrix_createRotateZ(double phi) -> RotMatrix"""
+    return _libBornAgainBase.RotMatrix_createRotateZ(phi)
 
-def Transform3D_createRotateEuler(alpha, beta, gamma):
-    r"""Transform3D_createRotateEuler(double alpha, double beta, double gamma) -> Transform3D"""
-    return _libBornAgainBase.Transform3D_createRotateEuler(alpha, beta, gamma)
+def RotMatrix_createRotateEuler(alpha, beta, gamma):
+    r"""RotMatrix_createRotateEuler(double alpha, double beta, double gamma) -> RotMatrix"""
+    return _libBornAgainBase.RotMatrix_createRotateEuler(alpha, beta, gamma)
 
 class Bin1D(object):
     r"""Proxy of C++ Bin1D class."""
diff --git a/auto/Wrap/libBornAgainBase_wrap.cpp b/auto/Wrap/libBornAgainBase_wrap.cpp
index b4d1acfa18494306daa7c063b114c0e432e0ff0a..50212a9143d888aa062b57815f31b34a1474364e 100644
--- a/auto/Wrap/libBornAgainBase_wrap.cpp
+++ b/auto/Wrap/libBornAgainBase_wrap.cpp
@@ -3106,8 +3106,8 @@ namespace Swig {
 #define SWIGTYPE_p_FixedBinAxis swig_types[6]
 #define SWIGTYPE_p_IAxis swig_types[7]
 #define SWIGTYPE_p_ICloneable swig_types[8]
-#define SWIGTYPE_p_ThreadInfo swig_types[9]
-#define SWIGTYPE_p_Transform3D swig_types[10]
+#define SWIGTYPE_p_RotMatrix swig_types[9]
+#define SWIGTYPE_p_ThreadInfo swig_types[10]
 #define SWIGTYPE_p_VariableBinAxis swig_types[11]
 #define SWIGTYPE_p_Vec3T_double_t swig_types[12]
 #define SWIGTYPE_p_Vec3T_int_t swig_types[13]
@@ -6921,7 +6921,7 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 #include "Base/Axis/CustomBinAxis.h"
 #include "Base/Axis/FixedBinAxis.h"
 #include "Base/Axis/VariableBinAxis.h"
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 
 
 SWIGINTERN int
@@ -27105,33 +27105,33 @@ SWIGINTERN PyObject *Direction_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_Transform3D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_RotMatrix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *result = 0 ;
+  RotMatrix *result = 0 ;
   
-  if (!SWIG_Python_UnpackTuple(args, "new_Transform3D", 0, 0, 0)) SWIG_fail;
-  result = (Transform3D *)new Transform3D();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Transform3D, SWIG_POINTER_NEW |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "new_RotMatrix", 0, 0, 0)) SWIG_fail;
+  result = (RotMatrix *)new RotMatrix();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RotMatrix, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_Transform3D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_RotMatrix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 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_Transform3D, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Transform3D" "', argument " "1"" of type '" "Transform3D *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RotMatrix" "', argument " "1"" of type '" "RotMatrix *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
   delete arg1;
   resultobj = SWIG_Py_Void();
   return resultobj;
@@ -27140,99 +27140,99 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Transform3D *result = 0 ;
+  RotMatrix *result = 0 ;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Transform3D, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Transform3D_clone" "', argument " "1"" of type '" "Transform3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotMatrix_clone" "', argument " "1"" of type '" "RotMatrix const *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
-  result = (Transform3D *)((Transform3D const *)arg1)->clone();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Transform3D, 0 |  0 );
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
+  result = (RotMatrix *)((RotMatrix const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RotMatrix, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_createRotateX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_createRotateX(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double val1 ;
   int ecode1 = 0 ;
   PyObject *swig_obj[1] ;
-  Transform3D result;
+  RotMatrix result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Transform3D_createRotateX" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "RotMatrix_createRotateX" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
-  result = Transform3D::createRotateX(arg1);
-  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  result = RotMatrix::createRotateX(arg1);
+  resultobj = SWIG_NewPointerObj((new RotMatrix(static_cast< const RotMatrix& >(result))), SWIGTYPE_p_RotMatrix, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_createRotateY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_createRotateY(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double val1 ;
   int ecode1 = 0 ;
   PyObject *swig_obj[1] ;
-  Transform3D result;
+  RotMatrix result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Transform3D_createRotateY" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "RotMatrix_createRotateY" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
-  result = Transform3D::createRotateY(arg1);
-  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  result = RotMatrix::createRotateY(arg1);
+  resultobj = SWIG_NewPointerObj((new RotMatrix(static_cast< const RotMatrix& >(result))), SWIGTYPE_p_RotMatrix, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_createRotateZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_createRotateZ(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double val1 ;
   int ecode1 = 0 ;
   PyObject *swig_obj[1] ;
-  Transform3D result;
+  RotMatrix result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Transform3D_createRotateZ" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "RotMatrix_createRotateZ" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
-  result = Transform3D::createRotateZ(arg1);
-  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  result = RotMatrix::createRotateZ(arg1);
+  resultobj = SWIG_NewPointerObj((new RotMatrix(static_cast< const RotMatrix& >(result))), SWIGTYPE_p_RotMatrix, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_createRotateEuler(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_createRotateEuler(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
   double arg2 ;
@@ -27244,35 +27244,35 @@ SWIGINTERN PyObject *_wrap_Transform3D_createRotateEuler(PyObject *SWIGUNUSEDPAR
   double val3 ;
   int ecode3 = 0 ;
   PyObject *swig_obj[3] ;
-  Transform3D result;
+  RotMatrix result;
   
-  if (!SWIG_Python_UnpackTuple(args, "Transform3D_createRotateEuler", 3, 3, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "RotMatrix_createRotateEuler", 3, 3, swig_obj)) SWIG_fail;
   ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
   if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "Transform3D_createRotateEuler" "', argument " "1"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "RotMatrix_createRotateEuler" "', 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 '" "Transform3D_createRotateEuler" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RotMatrix_createRotateEuler" "', 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 '" "Transform3D_createRotateEuler" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RotMatrix_createRotateEuler" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
-  result = Transform3D::createRotateEuler(arg1,arg2,arg3);
-  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  result = RotMatrix::createRotateEuler(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj((new RotMatrix(static_cast< const RotMatrix& >(result))), SWIGTYPE_p_RotMatrix, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_calculateEulerAngles(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_calculateEulerAngles(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 0 ;
   double *arg2 = (double *) 0 ;
   double *arg3 = (double *) 0 ;
   double *arg4 = (double *) 0 ;
@@ -27286,28 +27286,28 @@ SWIGINTERN PyObject *_wrap_Transform3D_calculateEulerAngles(PyObject *SWIGUNUSED
   int res4 = 0 ;
   PyObject *swig_obj[4] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "Transform3D_calculateEulerAngles", 4, 4, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Transform3D, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "RotMatrix_calculateEulerAngles", 4, 4, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Transform3D_calculateEulerAngles" "', argument " "1"" of type '" "Transform3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotMatrix_calculateEulerAngles" "', argument " "1"" of type '" "RotMatrix const *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_double, 0 |  0 );
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Transform3D_calculateEulerAngles" "', argument " "2"" of type '" "double *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RotMatrix_calculateEulerAngles" "', argument " "2"" of type '" "double *""'"); 
   }
   arg2 = reinterpret_cast< double * >(argp2);
   res3 = SWIG_ConvertPtr(swig_obj[2], &argp3,SWIGTYPE_p_double, 0 |  0 );
   if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "Transform3D_calculateEulerAngles" "', argument " "3"" of type '" "double *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "RotMatrix_calculateEulerAngles" "', argument " "3"" of type '" "double *""'"); 
   }
   arg3 = reinterpret_cast< double * >(argp3);
   res4 = SWIG_ConvertPtr(swig_obj[3], &argp4,SWIGTYPE_p_double, 0 |  0 );
   if (!SWIG_IsOK(res4)) {
-    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "Transform3D_calculateEulerAngles" "', argument " "4"" of type '" "double *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "RotMatrix_calculateEulerAngles" "', argument " "4"" of type '" "double *""'"); 
   }
   arg4 = reinterpret_cast< double * >(argp4);
-  ((Transform3D const *)arg1)->calculateEulerAngles(arg2,arg3,arg4);
+  ((RotMatrix const *)arg1)->calculateEulerAngles(arg2,arg3,arg4);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -27315,9 +27315,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_calculateRotateXAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_calculateRotateXAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -27325,12 +27325,12 @@ SWIGINTERN PyObject *_wrap_Transform3D_calculateRotateXAngle(PyObject *SWIGUNUSE
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Transform3D, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Transform3D_calculateRotateXAngle" "', argument " "1"" of type '" "Transform3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotMatrix_calculateRotateXAngle" "', argument " "1"" of type '" "RotMatrix const *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
-  result = (double)((Transform3D const *)arg1)->calculateRotateXAngle();
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
+  result = (double)((RotMatrix const *)arg1)->calculateRotateXAngle();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -27338,9 +27338,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_calculateRotateYAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_calculateRotateYAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -27348,12 +27348,12 @@ SWIGINTERN PyObject *_wrap_Transform3D_calculateRotateYAngle(PyObject *SWIGUNUSE
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Transform3D, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Transform3D_calculateRotateYAngle" "', argument " "1"" of type '" "Transform3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotMatrix_calculateRotateYAngle" "', argument " "1"" of type '" "RotMatrix const *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
-  result = (double)((Transform3D const *)arg1)->calculateRotateYAngle();
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
+  result = (double)((RotMatrix const *)arg1)->calculateRotateYAngle();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -27361,9 +27361,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_calculateRotateZAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_calculateRotateZAngle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -27371,12 +27371,12 @@ SWIGINTERN PyObject *_wrap_Transform3D_calculateRotateZAngle(PyObject *SWIGUNUSE
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Transform3D, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Transform3D_calculateRotateZAngle" "', argument " "1"" of type '" "Transform3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotMatrix_calculateRotateZAngle" "', argument " "1"" of type '" "RotMatrix const *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
-  result = (double)((Transform3D const *)arg1)->calculateRotateZAngle();
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
+  result = (double)((RotMatrix const *)arg1)->calculateRotateZAngle();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -27384,56 +27384,56 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_getInverse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_getInverse(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Transform3D result;
+  RotMatrix result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Transform3D, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Transform3D_getInverse" "', argument " "1"" of type '" "Transform3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotMatrix_getInverse" "', argument " "1"" of type '" "RotMatrix const *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
-  result = ((Transform3D const *)arg1)->getInverse();
-  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
+  result = ((RotMatrix const *)arg1)->getInverse();
+  resultobj = SWIG_NewPointerObj((new RotMatrix(static_cast< const RotMatrix& >(result))), SWIGTYPE_p_RotMatrix, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D___mul__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix___mul__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
-  Transform3D *arg2 = 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 0 ;
+  RotMatrix *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 = 0 ;
   int res2 = 0 ;
   PyObject *swig_obj[2] ;
-  Transform3D result;
+  RotMatrix result;
   
-  if (!SWIG_Python_UnpackTuple(args, "Transform3D___mul__", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Transform3D, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "RotMatrix___mul__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Transform3D___mul__" "', argument " "1"" of type '" "Transform3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotMatrix___mul__" "', argument " "1"" of type '" "RotMatrix const *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Transform3D,  0  | 0);
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RotMatrix,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Transform3D___mul__" "', argument " "2"" of type '" "Transform3D const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RotMatrix___mul__" "', argument " "2"" of type '" "RotMatrix const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Transform3D___mul__" "', argument " "2"" of type '" "Transform3D const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RotMatrix___mul__" "', argument " "2"" of type '" "RotMatrix const &""'"); 
   }
-  arg2 = reinterpret_cast< Transform3D * >(argp2);
-  result = ((Transform3D const *)arg1)->operator *((Transform3D const &)*arg2);
-  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  arg2 = reinterpret_cast< RotMatrix * >(argp2);
+  result = ((RotMatrix const *)arg1)->operator *((RotMatrix const &)*arg2);
+  resultobj = SWIG_NewPointerObj((new RotMatrix(static_cast< const RotMatrix& >(result))), SWIGTYPE_p_RotMatrix, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   PyErr_Clear();
@@ -27442,10 +27442,10 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
-  Transform3D *arg2 = 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 0 ;
+  RotMatrix *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 = 0 ;
@@ -27453,21 +27453,21 @@ SWIGINTERN PyObject *_wrap_Transform3D___eq__(PyObject *SWIGUNUSEDPARM(self), Py
   PyObject *swig_obj[2] ;
   bool result;
   
-  if (!SWIG_Python_UnpackTuple(args, "Transform3D___eq__", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Transform3D, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "RotMatrix___eq__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Transform3D___eq__" "', argument " "1"" of type '" "Transform3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotMatrix___eq__" "', argument " "1"" of type '" "RotMatrix const *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Transform3D,  0  | 0);
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RotMatrix,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Transform3D___eq__" "', argument " "2"" of type '" "Transform3D const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RotMatrix___eq__" "', argument " "2"" of type '" "RotMatrix const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Transform3D___eq__" "', argument " "2"" of type '" "Transform3D const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RotMatrix___eq__" "', argument " "2"" of type '" "RotMatrix const &""'"); 
   }
-  arg2 = reinterpret_cast< Transform3D * >(argp2);
-  result = (bool)((Transform3D const *)arg1)->operator ==((Transform3D const &)*arg2);
+  arg2 = reinterpret_cast< RotMatrix * >(argp2);
+  result = (bool)((RotMatrix const *)arg1)->operator ==((RotMatrix const &)*arg2);
   resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
@@ -27477,22 +27477,22 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_getRotationType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_getRotationType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Transform3D::ERotationType result;
+  RotMatrix::ERotationType result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Transform3D, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Transform3D_getRotationType" "', argument " "1"" of type '" "Transform3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotMatrix_getRotationType" "', argument " "1"" of type '" "RotMatrix const *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
-  result = (Transform3D::ERotationType)((Transform3D const *)arg1)->getRotationType();
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
+  result = (RotMatrix::ERotationType)((RotMatrix const *)arg1)->getRotationType();
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -27500,9 +27500,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_isIdentity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_isIdentity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -27510,12 +27510,12 @@ SWIGINTERN PyObject *_wrap_Transform3D_isIdentity(PyObject *SWIGUNUSEDPARM(self)
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Transform3D, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Transform3D_isIdentity" "', argument " "1"" of type '" "Transform3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotMatrix_isIdentity" "', argument " "1"" of type '" "RotMatrix const *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
-  result = (bool)((Transform3D const *)arg1)->isIdentity();
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
+  result = (bool)((RotMatrix const *)arg1)->isIdentity();
   resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
@@ -27523,9 +27523,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D__print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix__print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 0 ;
   std::ostream *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
@@ -27533,21 +27533,21 @@ SWIGINTERN PyObject *_wrap_Transform3D__print(PyObject *SWIGUNUSEDPARM(self), Py
   int res2 = 0 ;
   PyObject *swig_obj[2] ;
   
-  if (!SWIG_Python_UnpackTuple(args, "Transform3D__print", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Transform3D, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "RotMatrix__print", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Transform3D__print" "', argument " "1"" of type '" "Transform3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotMatrix__print" "', argument " "1"" of type '" "RotMatrix const *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__ostream,  0 );
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Transform3D__print" "', argument " "2"" of type '" "std::ostream &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RotMatrix__print" "', argument " "2"" of type '" "std::ostream &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Transform3D__print" "', argument " "2"" of type '" "std::ostream &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RotMatrix__print" "', argument " "2"" of type '" "std::ostream &""'"); 
   }
   arg2 = reinterpret_cast< std::ostream * >(argp2);
-  ((Transform3D const *)arg1)->print(*arg2);
+  ((RotMatrix const *)arg1)->print(*arg2);
   resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
@@ -27555,9 +27555,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_isXRotation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_isXRotation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -27565,12 +27565,12 @@ SWIGINTERN PyObject *_wrap_Transform3D_isXRotation(PyObject *SWIGUNUSEDPARM(self
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Transform3D, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Transform3D_isXRotation" "', argument " "1"" of type '" "Transform3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotMatrix_isXRotation" "', argument " "1"" of type '" "RotMatrix const *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
-  result = (bool)((Transform3D const *)arg1)->isXRotation();
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
+  result = (bool)((RotMatrix const *)arg1)->isXRotation();
   resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
@@ -27578,9 +27578,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_isYRotation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_isYRotation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -27588,12 +27588,12 @@ SWIGINTERN PyObject *_wrap_Transform3D_isYRotation(PyObject *SWIGUNUSEDPARM(self
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Transform3D, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Transform3D_isYRotation" "', argument " "1"" of type '" "Transform3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotMatrix_isYRotation" "', argument " "1"" of type '" "RotMatrix const *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
-  result = (bool)((Transform3D const *)arg1)->isYRotation();
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
+  result = (bool)((RotMatrix const *)arg1)->isYRotation();
   resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
@@ -27601,9 +27601,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Transform3D_isZRotation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotMatrix_isZRotation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = (Transform3D *) 0 ;
+  RotMatrix *arg1 = (RotMatrix *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -27611,12 +27611,12 @@ SWIGINTERN PyObject *_wrap_Transform3D_isZRotation(PyObject *SWIGUNUSEDPARM(self
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Transform3D, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotMatrix, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Transform3D_isZRotation" "', argument " "1"" of type '" "Transform3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotMatrix_isZRotation" "', argument " "1"" of type '" "RotMatrix const *""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
-  result = (bool)((Transform3D const *)arg1)->isZRotation();
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
+  result = (bool)((RotMatrix const *)arg1)->isZRotation();
   resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
@@ -27624,14 +27624,14 @@ fail:
 }
 
 
-SWIGINTERN PyObject *Transform3D_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *RotMatrix_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_Transform3D, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_RotMatrix, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *Transform3D_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *RotMatrix_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   return SWIG_Python_InitShadowInstance(args);
 }
 
@@ -36059,104 +36059,104 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_Direction", _wrap_delete_Direction, METH_O, "delete_Direction(Direction self)"},
 	 { "Direction_swigregister", Direction_swigregister, METH_O, NULL},
 	 { "Direction_swiginit", Direction_swiginit, METH_VARARGS, NULL},
-	 { "new_Transform3D", _wrap_new_Transform3D, METH_NOARGS, "\n"
-		"new_Transform3D() -> Transform3D\n"
-		"Transform3D::Transform3D(Eigen::Matrix3d matrix)\n"
+	 { "new_RotMatrix", _wrap_new_RotMatrix, METH_NOARGS, "\n"
+		"new_RotMatrix() -> RotMatrix\n"
+		"RotMatrix::RotMatrix(Eigen::Matrix3d matrix)\n"
 		"\n"
 		"Constructor from matrix (no checks if this is an element of SO(3)!) \n"
 		"\n"
 		""},
-	 { "delete_Transform3D", _wrap_delete_Transform3D, METH_O, "\n"
-		"delete_Transform3D(Transform3D self)\n"
-		"Transform3D::~Transform3D()=default\n"
+	 { "delete_RotMatrix", _wrap_delete_RotMatrix, METH_O, "\n"
+		"delete_RotMatrix(RotMatrix self)\n"
+		"RotMatrix::~RotMatrix()=default\n"
 		"\n"
 		"Destructor. \n"
 		"\n"
 		""},
-	 { "Transform3D_clone", _wrap_Transform3D_clone, METH_O, "\n"
-		"Transform3D_clone(Transform3D self) -> Transform3D\n"
-		"Transform3D * Transform3D::clone() const\n"
+	 { "RotMatrix_clone", _wrap_RotMatrix_clone, METH_O, "\n"
+		"RotMatrix_clone(RotMatrix self) -> RotMatrix\n"
+		"RotMatrix * RotMatrix::clone() const\n"
 		"\n"
 		"Clones the transformation. \n"
 		"\n"
 		""},
-	 { "Transform3D_createRotateX", _wrap_Transform3D_createRotateX, METH_O, "Transform3D_createRotateX(double phi) -> Transform3D"},
-	 { "Transform3D_createRotateY", _wrap_Transform3D_createRotateY, METH_O, "Transform3D_createRotateY(double phi) -> Transform3D"},
-	 { "Transform3D_createRotateZ", _wrap_Transform3D_createRotateZ, METH_O, "Transform3D_createRotateZ(double phi) -> Transform3D"},
-	 { "Transform3D_createRotateEuler", _wrap_Transform3D_createRotateEuler, METH_VARARGS, "Transform3D_createRotateEuler(double alpha, double beta, double gamma) -> Transform3D"},
-	 { "Transform3D_calculateEulerAngles", _wrap_Transform3D_calculateEulerAngles, METH_VARARGS, "\n"
-		"Transform3D_calculateEulerAngles(Transform3D self, double * p_alpha, double * p_beta, double * p_gamma)\n"
-		"void Transform3D::calculateEulerAngles(double *p_alpha, double *p_beta, double *p_gamma) const\n"
+	 { "RotMatrix_createRotateX", _wrap_RotMatrix_createRotateX, METH_O, "RotMatrix_createRotateX(double phi) -> RotMatrix"},
+	 { "RotMatrix_createRotateY", _wrap_RotMatrix_createRotateY, METH_O, "RotMatrix_createRotateY(double phi) -> RotMatrix"},
+	 { "RotMatrix_createRotateZ", _wrap_RotMatrix_createRotateZ, METH_O, "RotMatrix_createRotateZ(double phi) -> RotMatrix"},
+	 { "RotMatrix_createRotateEuler", _wrap_RotMatrix_createRotateEuler, METH_VARARGS, "RotMatrix_createRotateEuler(double alpha, double beta, double gamma) -> RotMatrix"},
+	 { "RotMatrix_calculateEulerAngles", _wrap_RotMatrix_calculateEulerAngles, METH_VARARGS, "\n"
+		"RotMatrix_calculateEulerAngles(RotMatrix self, double * p_alpha, double * p_beta, double * p_gamma)\n"
+		"void RotMatrix::calculateEulerAngles(double *p_alpha, double *p_beta, double *p_gamma) const\n"
 		"\n"
 		"Calculates the Euler angles corresponding to the rotation. \n"
 		"\n"
 		""},
-	 { "Transform3D_calculateRotateXAngle", _wrap_Transform3D_calculateRotateXAngle, METH_O, "\n"
-		"Transform3D_calculateRotateXAngle(Transform3D self) -> double\n"
-		"double Transform3D::calculateRotateXAngle() const\n"
+	 { "RotMatrix_calculateRotateXAngle", _wrap_RotMatrix_calculateRotateXAngle, METH_O, "\n"
+		"RotMatrix_calculateRotateXAngle(RotMatrix self) -> double\n"
+		"double RotMatrix::calculateRotateXAngle() const\n"
 		"\n"
 		"Calculates the rotation angle for a rotation around the x-axis alone Only meaningfull if the actual rotation is around the x-axis \n"
 		"\n"
 		""},
-	 { "Transform3D_calculateRotateYAngle", _wrap_Transform3D_calculateRotateYAngle, METH_O, "\n"
-		"Transform3D_calculateRotateYAngle(Transform3D self) -> double\n"
-		"double Transform3D::calculateRotateYAngle() const\n"
+	 { "RotMatrix_calculateRotateYAngle", _wrap_RotMatrix_calculateRotateYAngle, METH_O, "\n"
+		"RotMatrix_calculateRotateYAngle(RotMatrix self) -> double\n"
+		"double RotMatrix::calculateRotateYAngle() const\n"
 		"\n"
 		"Calculates the rotation angle for a rotation around the y-axis alone Only meaningfull if the actual rotation is around the y-axis \n"
 		"\n"
 		""},
-	 { "Transform3D_calculateRotateZAngle", _wrap_Transform3D_calculateRotateZAngle, METH_O, "\n"
-		"Transform3D_calculateRotateZAngle(Transform3D self) -> double\n"
-		"double Transform3D::calculateRotateZAngle() const\n"
+	 { "RotMatrix_calculateRotateZAngle", _wrap_RotMatrix_calculateRotateZAngle, METH_O, "\n"
+		"RotMatrix_calculateRotateZAngle(RotMatrix self) -> double\n"
+		"double RotMatrix::calculateRotateZAngle() const\n"
 		"\n"
 		"Calculates the rotation angle for a rotation around the z-axis alone Only meaningfull if the actual rotation is around the z-axis \n"
 		"\n"
 		""},
-	 { "Transform3D_getInverse", _wrap_Transform3D_getInverse, METH_O, "\n"
-		"Transform3D_getInverse(Transform3D self) -> Transform3D\n"
-		"Transform3D Transform3D::getInverse() const\n"
+	 { "RotMatrix_getInverse", _wrap_RotMatrix_getInverse, METH_O, "\n"
+		"RotMatrix_getInverse(RotMatrix self) -> RotMatrix\n"
+		"RotMatrix RotMatrix::getInverse() const\n"
 		"\n"
 		"Returns the inverse transformation. \n"
 		"\n"
 		""},
-	 { "Transform3D___mul__", _wrap_Transform3D___mul__, METH_VARARGS, "Transform3D___mul__(Transform3D self, Transform3D other) -> Transform3D"},
-	 { "Transform3D___eq__", _wrap_Transform3D___eq__, METH_VARARGS, "Transform3D___eq__(Transform3D self, Transform3D other) -> bool"},
-	 { "Transform3D_getRotationType", _wrap_Transform3D_getRotationType, METH_O, "\n"
-		"Transform3D_getRotationType(Transform3D self) -> Transform3D::ERotationType\n"
-		"Transform3D::ERotationType Transform3D::getRotationType() const\n"
+	 { "RotMatrix___mul__", _wrap_RotMatrix___mul__, METH_VARARGS, "RotMatrix___mul__(RotMatrix self, RotMatrix other) -> RotMatrix"},
+	 { "RotMatrix___eq__", _wrap_RotMatrix___eq__, METH_VARARGS, "RotMatrix___eq__(RotMatrix self, RotMatrix other) -> bool"},
+	 { "RotMatrix_getRotationType", _wrap_RotMatrix_getRotationType, METH_O, "\n"
+		"RotMatrix_getRotationType(RotMatrix self) -> RotMatrix::ERotationType\n"
+		"RotMatrix::ERotationType RotMatrix::getRotationType() const\n"
 		"\n"
 		"Retrieve the rotation type (general, around x, y or z-axis) \n"
 		"\n"
 		""},
-	 { "Transform3D_isIdentity", _wrap_Transform3D_isIdentity, METH_O, "\n"
-		"Transform3D_isIdentity(Transform3D self) -> bool\n"
-		"bool Transform3D::isIdentity() const\n"
+	 { "RotMatrix_isIdentity", _wrap_RotMatrix_isIdentity, METH_O, "\n"
+		"RotMatrix_isIdentity(RotMatrix self) -> bool\n"
+		"bool RotMatrix::isIdentity() const\n"
 		"\n"
 		"Determine if the transformation is trivial (identity) \n"
 		"\n"
 		""},
-	 { "Transform3D__print", _wrap_Transform3D__print, METH_VARARGS, "\n"
-		"Transform3D__print(Transform3D self, std::ostream & ostr)\n"
-		"void Transform3D::print(std::ostream &ostr) const\n"
+	 { "RotMatrix__print", _wrap_RotMatrix__print, METH_VARARGS, "\n"
+		"RotMatrix__print(RotMatrix self, std::ostream & ostr)\n"
+		"void RotMatrix::print(std::ostream &ostr) const\n"
 		"\n"
 		""},
-	 { "Transform3D_isXRotation", _wrap_Transform3D_isXRotation, METH_O, "\n"
-		"Transform3D_isXRotation(Transform3D self) -> bool\n"
-		"bool Transform3D::isXRotation() const\n"
+	 { "RotMatrix_isXRotation", _wrap_RotMatrix_isXRotation, METH_O, "\n"
+		"RotMatrix_isXRotation(RotMatrix self) -> bool\n"
+		"bool RotMatrix::isXRotation() const\n"
 		"\n"
 		""},
-	 { "Transform3D_isYRotation", _wrap_Transform3D_isYRotation, METH_O, "\n"
-		"Transform3D_isYRotation(Transform3D self) -> bool\n"
-		"bool Transform3D::isYRotation() const\n"
+	 { "RotMatrix_isYRotation", _wrap_RotMatrix_isYRotation, METH_O, "\n"
+		"RotMatrix_isYRotation(RotMatrix self) -> bool\n"
+		"bool RotMatrix::isYRotation() const\n"
 		"\n"
 		""},
-	 { "Transform3D_isZRotation", _wrap_Transform3D_isZRotation, METH_O, "\n"
-		"Transform3D_isZRotation(Transform3D self) -> bool\n"
-		"bool Transform3D::isZRotation() const\n"
+	 { "RotMatrix_isZRotation", _wrap_RotMatrix_isZRotation, METH_O, "\n"
+		"RotMatrix_isZRotation(RotMatrix self) -> bool\n"
+		"bool RotMatrix::isZRotation() const\n"
 		"\n"
 		""},
-	 { "Transform3D_swigregister", Transform3D_swigregister, METH_O, NULL},
-	 { "Transform3D_swiginit", Transform3D_swiginit, METH_VARARGS, NULL},
+	 { "RotMatrix_swigregister", RotMatrix_swigregister, METH_O, NULL},
+	 { "RotMatrix_swiginit", RotMatrix_swiginit, METH_VARARGS, NULL},
 	 { "new_Bin1D", _wrap_new_Bin1D, METH_VARARGS, "\n"
 		"Bin1D()\n"
 		"new_Bin1D(double lower, double upper) -> Bin1D\n"
@@ -36844,8 +36844,8 @@ static swig_type_info _swigt__p_Direction = {"_p_Direction", "Direction *", 0, 0
 static swig_type_info _swigt__p_FixedBinAxis = {"_p_FixedBinAxis", "FixedBinAxis *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IAxis = {"_p_IAxis", "IAxis *", 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_RotMatrix = {"_p_RotMatrix", "RotMatrix *", 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_VariableBinAxis = {"_p_VariableBinAxis", "VariableBinAxis *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Vec3T_double_t = {"_p_Vec3T_double_t", "std::vector< Vec3< double > >::value_type *|R3 *|Vec3< double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Vec3T_int_t = {"_p_Vec3T_int_t", "I3 *|Vec3< int > *", 0, 0, (void*)0, 0};
@@ -36910,8 +36910,8 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_FixedBinAxis,
   &_swigt__p_IAxis,
   &_swigt__p_ICloneable,
+  &_swigt__p_RotMatrix,
   &_swigt__p_ThreadInfo,
-  &_swigt__p_Transform3D,
   &_swigt__p_VariableBinAxis,
   &_swigt__p_Vec3T_double_t,
   &_swigt__p_Vec3T_int_t,
@@ -36976,8 +36976,8 @@ static swig_cast_info _swigc__p_Direction[] = {  {&_swigt__p_Direction, 0, 0, 0}
 static swig_cast_info _swigc__p_FixedBinAxis[] = {  {&_swigt__p_FixedBinAxis, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IAxis[] = {  {&_swigt__p_IAxis, 0, 0, 0},  {&_swigt__p_VariableBinAxis, _p_VariableBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_ConstKBinAxis, _p_ConstKBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_CustomBinAxis, _p_CustomBinAxisTo_p_IAxis, 0, 0},  {&_swigt__p_FixedBinAxis, _p_FixedBinAxisTo_p_IAxis, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_ICloneable, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_RotMatrix[] = {  {&_swigt__p_RotMatrix, 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_VariableBinAxis[] = {  {&_swigt__p_VariableBinAxis, 0, 0, 0},  {&_swigt__p_ConstKBinAxis, _p_ConstKBinAxisTo_p_VariableBinAxis, 0, 0},  {&_swigt__p_CustomBinAxis, _p_CustomBinAxisTo_p_VariableBinAxis, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Vec3T_double_t[] = {  {&_swigt__p_Vec3T_double_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Vec3T_int_t[] = {  {&_swigt__p_Vec3T_int_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -37042,8 +37042,8 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_FixedBinAxis,
   _swigc__p_IAxis,
   _swigc__p_ICloneable,
+  _swigc__p_RotMatrix,
   _swigc__p_ThreadInfo,
-  _swigc__p_Transform3D,
   _swigc__p_VariableBinAxis,
   _swigc__p_Vec3T_double_t,
   _swigc__p_Vec3T_int_t,
@@ -37862,10 +37862,10 @@ SWIG_init(void) {
   SWIG_addvarlink(globals, "deg", Swig_var_deg_get, Swig_var_deg_set);
   SWIG_addvarlink(globals, "tesla", Swig_var_tesla_get, Swig_var_tesla_set);
   SWIG_addvarlink(globals, "gauss", Swig_var_gauss_get, Swig_var_gauss_set);
-  SWIG_Python_SetConstant(d, "Transform3D_EULER",SWIG_From_int(static_cast< int >(Transform3D::EULER)));
-  SWIG_Python_SetConstant(d, "Transform3D_XAXIS",SWIG_From_int(static_cast< int >(Transform3D::XAXIS)));
-  SWIG_Python_SetConstant(d, "Transform3D_YAXIS",SWIG_From_int(static_cast< int >(Transform3D::YAXIS)));
-  SWIG_Python_SetConstant(d, "Transform3D_ZAXIS",SWIG_From_int(static_cast< int >(Transform3D::ZAXIS)));
+  SWIG_Python_SetConstant(d, "RotMatrix_EULER",SWIG_From_int(static_cast< int >(RotMatrix::EULER)));
+  SWIG_Python_SetConstant(d, "RotMatrix_XAXIS",SWIG_From_int(static_cast< int >(RotMatrix::XAXIS)));
+  SWIG_Python_SetConstant(d, "RotMatrix_YAXIS",SWIG_From_int(static_cast< int >(RotMatrix::YAXIS)));
+  SWIG_Python_SetConstant(d, "RotMatrix_ZAXIS",SWIG_From_int(static_cast< int >(RotMatrix::ZAXIS)));
 #if PY_VERSION_HEX >= 0x03000000
   return m;
 #else
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index 4978a1142b973eef2cc12a9ea1c32c8792011a31..51c04b8353f336e15231acb5869fa8d47a80362d 100644
--- a/auto/Wrap/libBornAgainSample.py
+++ b/auto/Wrap/libBornAgainSample.py
@@ -3088,8 +3088,8 @@ class Material(object):
 
     def rotatedMaterial(self, transform):
         r"""
-        rotatedMaterial(Material self, Transform3D transform) -> Material
-        Material Material::rotatedMaterial(const Transform3D &transform) const
+        rotatedMaterial(Material self, RotMatrix transform) -> Material
+        Material Material::rotatedMaterial(const RotMatrix &transform) const
 
         """
         return _libBornAgainSample.Material_rotatedMaterial(self, transform)
@@ -3556,7 +3556,7 @@ class IRotation(libBornAgainBase.ICloneable, libBornAgainParam.INode):
 
     @staticmethod
     def createRotation(transform):
-        r"""createRotation(Transform3D transform) -> IRotation"""
+        r"""createRotation(RotMatrix transform) -> IRotation"""
         return _libBornAgainSample.IRotation_createRotation(transform)
 
     def clone(self):
@@ -3577,15 +3577,15 @@ class IRotation(libBornAgainBase.ICloneable, libBornAgainParam.INode):
         """
         return _libBornAgainSample.IRotation_createInverse(self)
 
-    def getTransform3D(self):
+    def getRotMatrix(self):
         r"""
-        getTransform3D(IRotation self) -> Transform3D
-        virtual Transform3D IRotation::getTransform3D() const =0
+        getRotMatrix(IRotation self) -> RotMatrix
+        virtual RotMatrix IRotation::getRotMatrix() const =0
 
         Returns transformation. 
 
         """
-        return _libBornAgainSample.IRotation_getTransform3D(self)
+        return _libBornAgainSample.IRotation_getRotMatrix(self)
 
     def transformed(self, v):
         r"""
@@ -3618,7 +3618,7 @@ class IRotation(libBornAgainBase.ICloneable, libBornAgainParam.INode):
 _libBornAgainSample.IRotation_swigregister(IRotation)
 
 def IRotation_createRotation(transform):
-    r"""IRotation_createRotation(Transform3D transform) -> IRotation"""
+    r"""IRotation_createRotation(RotMatrix transform) -> IRotation"""
     return _libBornAgainSample.IRotation_createRotation(transform)
 
 
@@ -3680,15 +3680,15 @@ class IdentityRotation(IRotation):
         """
         return _libBornAgainSample.IdentityRotation_createInverse(self)
 
-    def getTransform3D(self):
+    def getRotMatrix(self):
         r"""
-        getTransform3D(IdentityRotation self) -> Transform3D
-        Transform3D IdentityRotation::getTransform3D() const override
+        getRotMatrix(IdentityRotation self) -> RotMatrix
+        RotMatrix IdentityRotation::getRotMatrix() const override
 
         Returns transformation. 
 
         """
-        return _libBornAgainSample.IdentityRotation_getTransform3D(self)
+        return _libBornAgainSample.IdentityRotation_getRotMatrix(self)
 
     def isIdentity(self):
         r"""
@@ -3762,15 +3762,15 @@ class RotationX(IRotation):
         """
         return _libBornAgainSample.RotationX_getAngle(self)
 
-    def getTransform3D(self):
+    def getRotMatrix(self):
         r"""
-        getTransform3D(RotationX self) -> Transform3D
-        Transform3D RotationX::getTransform3D() const override
+        getRotMatrix(RotationX self) -> RotMatrix
+        RotMatrix RotationX::getRotMatrix() const override
 
         Returns transformation. 
 
         """
-        return _libBornAgainSample.RotationX_getTransform3D(self)
+        return _libBornAgainSample.RotationX_getRotMatrix(self)
     __swig_destroy__ = _libBornAgainSample.delete_RotationX
 
 # Register RotationX in _libBornAgainSample:
@@ -3834,15 +3834,15 @@ class RotationY(IRotation):
         """
         return _libBornAgainSample.RotationY_getAngle(self)
 
-    def getTransform3D(self):
+    def getRotMatrix(self):
         r"""
-        getTransform3D(RotationY self) -> Transform3D
-        Transform3D RotationY::getTransform3D() const override
+        getRotMatrix(RotationY self) -> RotMatrix
+        RotMatrix RotationY::getRotMatrix() const override
 
         Returns transformation. 
 
         """
-        return _libBornAgainSample.RotationY_getTransform3D(self)
+        return _libBornAgainSample.RotationY_getRotMatrix(self)
     __swig_destroy__ = _libBornAgainSample.delete_RotationY
 
 # Register RotationY in _libBornAgainSample:
@@ -3906,15 +3906,15 @@ class RotationZ(IRotation):
         """
         return _libBornAgainSample.RotationZ_getAngle(self)
 
-    def getTransform3D(self):
+    def getRotMatrix(self):
         r"""
-        getTransform3D(RotationZ self) -> Transform3D
-        Transform3D RotationZ::getTransform3D() const override
+        getRotMatrix(RotationZ self) -> RotMatrix
+        RotMatrix RotationZ::getRotMatrix() const override
 
         Returns transformation. 
 
         """
-        return _libBornAgainSample.RotationZ_getTransform3D(self)
+        return _libBornAgainSample.RotationZ_getRotMatrix(self)
     __swig_destroy__ = _libBornAgainSample.delete_RotationZ
 
 # Register RotationZ in _libBornAgainSample:
@@ -3994,15 +3994,15 @@ class RotationEuler(IRotation):
         """
         return _libBornAgainSample.RotationEuler_getGamma(self)
 
-    def getTransform3D(self):
+    def getRotMatrix(self):
         r"""
-        getTransform3D(RotationEuler self) -> Transform3D
-        Transform3D RotationEuler::getTransform3D() const override
+        getRotMatrix(RotationEuler self) -> RotMatrix
+        RotMatrix RotationEuler::getRotMatrix() const override
 
         Returns transformation. 
 
         """
-        return _libBornAgainSample.RotationEuler_getTransform3D(self)
+        return _libBornAgainSample.RotationEuler_getRotMatrix(self)
     __swig_destroy__ = _libBornAgainSample.delete_RotationEuler
 
 # Register RotationEuler in _libBornAgainSample:
@@ -4282,13 +4282,13 @@ class Crystal(ISampleNode):
         """
         return _libBornAgainSample.Crystal_admixtures(self)
 
-    def transformedLattice(self, rotation=None):
+    def rotatedLattice(self, rotation=None):
         r"""
-        transformedLattice(Crystal self, IRotation rotation=None) -> Lattice3D
-        Lattice3D Crystal::transformedLattice(const IRotation *rotation=nullptr) const
+        rotatedLattice(Crystal self, IRotation rotation=None) -> Lattice3D
+        Lattice3D Crystal::rotatedLattice(const IRotation *rotation=nullptr) const
 
         """
-        return _libBornAgainSample.Crystal_transformedLattice(self, rotation)
+        return _libBornAgainSample.Crystal_rotatedLattice(self, rotation)
 
     def getChildren(self):
         r"""
@@ -11071,15 +11071,15 @@ class Lattice3D(libBornAgainParam.INode):
         _libBornAgainSample.Lattice3D_swiginit(self, _libBornAgainSample.new_Lattice3D(*args))
     __swig_destroy__ = _libBornAgainSample.delete_Lattice3D
 
-    def transformed(self, transform):
+    def rotated(self, rotMatrix):
         r"""
-        transformed(Lattice3D self, Transform3D transform) -> Lattice3D
-        Lattice3D Lattice3D::transformed(const Transform3D &transform) const
+        rotated(Lattice3D self, RotMatrix rotMatrix) -> Lattice3D
+        Lattice3D Lattice3D::rotated(const RotMatrix &rotMatrix) const
 
-        Creates transformed lattice. 
+        Creates rotated lattice. 
 
         """
-        return _libBornAgainSample.Lattice3D_transformed(self, transform)
+        return _libBornAgainSample.Lattice3D_rotated(self, rotMatrix)
 
     def getBasisVectorA(self):
         r"""
diff --git a/auto/Wrap/libBornAgainSample_wrap.cpp b/auto/Wrap/libBornAgainSample_wrap.cpp
index f74e151d65d85d39091524752a0326cbf1310c51..905f7f8ab7f9c03b94aa1522c4035da933178dc4 100644
--- a/auto/Wrap/libBornAgainSample_wrap.cpp
+++ b/auto/Wrap/libBornAgainSample_wrap.cpp
@@ -3206,18 +3206,18 @@ namespace Swig {
 #define SWIGTYPE_p_ParticleComposition swig_types[106]
 #define SWIGTYPE_p_ParticleCoreShell swig_types[107]
 #define SWIGTYPE_p_ParticleLayout swig_types[108]
-#define SWIGTYPE_p_RotationEuler swig_types[109]
-#define SWIGTYPE_p_RotationX swig_types[110]
-#define SWIGTYPE_p_RotationY swig_types[111]
-#define SWIGTYPE_p_RotationZ swig_types[112]
-#define SWIGTYPE_p_RoughnessModelWrap swig_types[113]
-#define SWIGTYPE_p_RoughnessModelWrap__RoughnessModel swig_types[114]
-#define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[115]
-#define SWIGTYPE_p_SimpleSelectionRule swig_types[116]
-#define SWIGTYPE_p_SlicedParticle swig_types[117]
-#define SWIGTYPE_p_SlicingEffects swig_types[118]
-#define SWIGTYPE_p_SquareLattice2D swig_types[119]
-#define SWIGTYPE_p_Transform3D swig_types[120]
+#define SWIGTYPE_p_RotMatrix swig_types[109]
+#define SWIGTYPE_p_RotationEuler swig_types[110]
+#define SWIGTYPE_p_RotationX swig_types[111]
+#define SWIGTYPE_p_RotationY swig_types[112]
+#define SWIGTYPE_p_RotationZ swig_types[113]
+#define SWIGTYPE_p_RoughnessModelWrap swig_types[114]
+#define SWIGTYPE_p_RoughnessModelWrap__RoughnessModel swig_types[115]
+#define SWIGTYPE_p_SafePointerVectorT_IParticle_t swig_types[116]
+#define SWIGTYPE_p_SimpleSelectionRule swig_types[117]
+#define SWIGTYPE_p_SlicedParticle swig_types[118]
+#define SWIGTYPE_p_SlicingEffects swig_types[119]
+#define SWIGTYPE_p_SquareLattice2D swig_types[120]
 #define SWIGTYPE_p_Vec3T_double_t swig_types[121]
 #define SWIGTYPE_p_Vec3T_int_t swig_types[122]
 #define SWIGTYPE_p_Vec3T_std__complexT_double_t_t swig_types[123]
@@ -7030,7 +7030,7 @@ SWIGINTERN std::vector< std::pair< double,double > >::iterator std_vector_Sl_std
 SWIGINTERN std::vector< std::pair< double,double > >::iterator std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_0(std::vector< std::pair< double,double > > *self,std::vector< std::pair< double,double > >::iterator pos,std::vector< std::pair< double,double > >::value_type const &x){ return self->insert(pos, x); }
 SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_1(std::vector< std::pair< double,double > > *self,std::vector< std::pair< double,double > >::iterator pos,std::vector< std::pair< double,double > >::size_type n,std::vector< std::pair< double,double > >::value_type const &x){ self->insert(pos, n, x); }
 
-#include "Base/Vector/Transform3D.h"
+#include "Base/Vector/RotMatrix.h"
 #include "Param/Distrib/ParameterDistribution.h"
 #include "Sample/Aggregate/Interference1DLattice.h"
 #include "Sample/Aggregate/Interference2DLattice.h"
@@ -38614,7 +38614,7 @@ fail:
 SWIGINTERN PyObject *_wrap_Material_rotatedMaterial(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Material *arg1 = (Material *) 0 ;
-  Transform3D *arg2 = 0 ;
+  RotMatrix *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 = 0 ;
@@ -38628,15 +38628,15 @@ SWIGINTERN PyObject *_wrap_Material_rotatedMaterial(PyObject *SWIGUNUSEDPARM(sel
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Material_rotatedMaterial" "', argument " "1"" of type '" "Material const *""'"); 
   }
   arg1 = reinterpret_cast< Material * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Transform3D,  0  | 0);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RotMatrix,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Material_rotatedMaterial" "', argument " "2"" of type '" "Transform3D const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Material_rotatedMaterial" "', argument " "2"" of type '" "RotMatrix const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Material_rotatedMaterial" "', argument " "2"" of type '" "Transform3D const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Material_rotatedMaterial" "', argument " "2"" of type '" "RotMatrix const &""'"); 
   }
-  arg2 = reinterpret_cast< Transform3D * >(argp2);
-  result = ((Material const *)arg1)->rotatedMaterial((Transform3D const &)*arg2);
+  arg2 = reinterpret_cast< RotMatrix * >(argp2);
+  result = ((Material const *)arg1)->rotatedMaterial((RotMatrix const &)*arg2);
   resultobj = SWIG_NewPointerObj((new Material(static_cast< const Material& >(result))), SWIGTYPE_p_Material, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
@@ -40766,7 +40766,7 @@ SWIGINTERN PyObject *IFormFactorDecorator_swigregister(PyObject *SWIGUNUSEDPARM(
 
 SWIGINTERN PyObject *_wrap_IRotation_createRotation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  Transform3D *arg1 = 0 ;
+  RotMatrix *arg1 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -40774,15 +40774,15 @@ SWIGINTERN PyObject *_wrap_IRotation_createRotation(PyObject *SWIGUNUSEDPARM(sel
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Transform3D,  0  | 0);
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_RotMatrix,  0  | 0);
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IRotation_createRotation" "', argument " "1"" of type '" "Transform3D const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IRotation_createRotation" "', argument " "1"" of type '" "RotMatrix const &""'"); 
   }
   if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IRotation_createRotation" "', argument " "1"" of type '" "Transform3D const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IRotation_createRotation" "', argument " "1"" of type '" "RotMatrix const &""'"); 
   }
-  arg1 = reinterpret_cast< Transform3D * >(argp1);
-  result = (IRotation *)IRotation::createRotation((Transform3D const &)*arg1);
+  arg1 = reinterpret_cast< RotMatrix * >(argp1);
+  result = (IRotation *)IRotation::createRotation((RotMatrix const &)*arg1);
   resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IRotation, 0 |  0 );
   return resultobj;
 fail:
@@ -40836,23 +40836,23 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IRotation_getTransform3D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IRotation_getRotMatrix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IRotation *arg1 = (IRotation *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Transform3D result;
+  RotMatrix result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IRotation, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IRotation_getTransform3D" "', argument " "1"" of type '" "IRotation const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IRotation_getRotMatrix" "', argument " "1"" of type '" "IRotation const *""'"); 
   }
   arg1 = reinterpret_cast< IRotation * >(argp1);
-  result = ((IRotation const *)arg1)->getTransform3D();
-  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  result = ((IRotation const *)arg1)->getRotMatrix();
+  resultobj = SWIG_NewPointerObj((new RotMatrix(static_cast< const RotMatrix& >(result))), SWIGTYPE_p_RotMatrix, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -41085,23 +41085,23 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IdentityRotation_getTransform3D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_IdentityRotation_getRotMatrix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IdentityRotation *arg1 = (IdentityRotation *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Transform3D result;
+  RotMatrix result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IdentityRotation, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IdentityRotation_getTransform3D" "', argument " "1"" of type '" "IdentityRotation const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IdentityRotation_getRotMatrix" "', argument " "1"" of type '" "IdentityRotation const *""'"); 
   }
   arg1 = reinterpret_cast< IdentityRotation * >(argp1);
-  result = ((IdentityRotation const *)arg1)->getTransform3D();
-  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  result = ((IdentityRotation const *)arg1)->getRotMatrix();
+  resultobj = SWIG_NewPointerObj((new RotMatrix(static_cast< const RotMatrix& >(result))), SWIGTYPE_p_RotMatrix, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -41336,23 +41336,23 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_RotationX_getTransform3D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotationX_getRotMatrix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   RotationX *arg1 = (RotationX *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Transform3D result;
+  RotMatrix result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotationX, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationX_getTransform3D" "', argument " "1"" of type '" "RotationX const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationX_getRotMatrix" "', argument " "1"" of type '" "RotationX const *""'"); 
   }
   arg1 = reinterpret_cast< RotationX * >(argp1);
-  result = ((RotationX const *)arg1)->getTransform3D();
-  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  result = ((RotationX const *)arg1)->getRotMatrix();
+  resultobj = SWIG_NewPointerObj((new RotMatrix(static_cast< const RotMatrix& >(result))), SWIGTYPE_p_RotMatrix, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -41564,23 +41564,23 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_RotationY_getTransform3D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotationY_getRotMatrix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   RotationY *arg1 = (RotationY *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Transform3D result;
+  RotMatrix result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotationY, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationY_getTransform3D" "', argument " "1"" of type '" "RotationY const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationY_getRotMatrix" "', argument " "1"" of type '" "RotationY const *""'"); 
   }
   arg1 = reinterpret_cast< RotationY * >(argp1);
-  result = ((RotationY const *)arg1)->getTransform3D();
-  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  result = ((RotationY const *)arg1)->getRotMatrix();
+  resultobj = SWIG_NewPointerObj((new RotMatrix(static_cast< const RotMatrix& >(result))), SWIGTYPE_p_RotMatrix, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -41792,23 +41792,23 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_RotationZ_getTransform3D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotationZ_getRotMatrix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   RotationZ *arg1 = (RotationZ *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Transform3D result;
+  RotMatrix result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotationZ, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationZ_getTransform3D" "', argument " "1"" of type '" "RotationZ const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationZ_getRotMatrix" "', argument " "1"" of type '" "RotationZ const *""'"); 
   }
   arg1 = reinterpret_cast< RotationZ * >(argp1);
-  result = ((RotationZ const *)arg1)->getTransform3D();
-  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  result = ((RotationZ const *)arg1)->getRotMatrix();
+  resultobj = SWIG_NewPointerObj((new RotMatrix(static_cast< const RotMatrix& >(result))), SWIGTYPE_p_RotMatrix, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -42094,23 +42094,23 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_RotationEuler_getTransform3D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_RotationEuler_getRotMatrix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   RotationEuler *arg1 = (RotationEuler *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Transform3D result;
+  RotMatrix result;
   
   if (!args) SWIG_fail;
   swig_obj[0] = args;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RotationEuler, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationEuler_getTransform3D" "', argument " "1"" of type '" "RotationEuler const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RotationEuler_getRotMatrix" "', argument " "1"" of type '" "RotationEuler const *""'"); 
   }
   arg1 = reinterpret_cast< RotationEuler * >(argp1);
-  result = ((RotationEuler const *)arg1)->getTransform3D();
-  resultobj = SWIG_NewPointerObj((new Transform3D(static_cast< const Transform3D& >(result))), SWIGTYPE_p_Transform3D, SWIG_POINTER_OWN |  0 );
+  result = ((RotationEuler const *)arg1)->getRotMatrix();
+  resultobj = SWIG_NewPointerObj((new RotMatrix(static_cast< const RotMatrix& >(result))), SWIGTYPE_p_RotMatrix, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -43104,7 +43104,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Crystal_transformedLattice__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_Crystal_rotatedLattice__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   Crystal *arg1 = (Crystal *) 0 ;
   IRotation *arg2 = (IRotation *) 0 ;
@@ -43117,15 +43117,15 @@ SWIGINTERN PyObject *_wrap_Crystal_transformedLattice__SWIG_0(PyObject *SWIGUNUS
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Crystal, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Crystal_transformedLattice" "', argument " "1"" of type '" "Crystal const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Crystal_rotatedLattice" "', argument " "1"" of type '" "Crystal const *""'"); 
   }
   arg1 = reinterpret_cast< Crystal * >(argp1);
   res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_IRotation, 0 |  0 );
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Crystal_transformedLattice" "', argument " "2"" of type '" "IRotation const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Crystal_rotatedLattice" "', argument " "2"" of type '" "IRotation const *""'"); 
   }
   arg2 = reinterpret_cast< IRotation * >(argp2);
-  result = ((Crystal const *)arg1)->transformedLattice((IRotation const *)arg2);
+  result = ((Crystal const *)arg1)->rotatedLattice((IRotation const *)arg2);
   resultobj = SWIG_NewPointerObj((new Lattice3D(static_cast< const Lattice3D& >(result))), SWIGTYPE_p_Lattice3D, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
@@ -43133,7 +43133,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Crystal_transformedLattice__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_Crystal_rotatedLattice__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   Crystal *arg1 = (Crystal *) 0 ;
   void *argp1 = 0 ;
@@ -43143,10 +43143,10 @@ SWIGINTERN PyObject *_wrap_Crystal_transformedLattice__SWIG_1(PyObject *SWIGUNUS
   if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Crystal, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Crystal_transformedLattice" "', argument " "1"" of type '" "Crystal const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Crystal_rotatedLattice" "', argument " "1"" of type '" "Crystal const *""'"); 
   }
   arg1 = reinterpret_cast< Crystal * >(argp1);
-  result = ((Crystal const *)arg1)->transformedLattice();
+  result = ((Crystal const *)arg1)->rotatedLattice();
   resultobj = SWIG_NewPointerObj((new Lattice3D(static_cast< const Lattice3D& >(result))), SWIGTYPE_p_Lattice3D, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
@@ -43154,13 +43154,13 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Crystal_transformedLattice(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_Crystal_rotatedLattice(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[3] = {
     0
   };
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "Crystal_transformedLattice", 0, 2, argv))) SWIG_fail;
+  if (!(argc = SWIG_Python_UnpackTuple(args, "Crystal_rotatedLattice", 0, 2, argv))) SWIG_fail;
   --argc;
   if (argc == 1) {
     int _v;
@@ -43168,7 +43168,7 @@ SWIGINTERN PyObject *_wrap_Crystal_transformedLattice(PyObject *self, PyObject *
     int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Crystal, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      return _wrap_Crystal_transformedLattice__SWIG_1(self, argc, argv);
+      return _wrap_Crystal_rotatedLattice__SWIG_1(self, argc, argv);
     }
   }
   if (argc == 2) {
@@ -43181,16 +43181,16 @@ SWIGINTERN PyObject *_wrap_Crystal_transformedLattice(PyObject *self, PyObject *
       int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_IRotation, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_Crystal_transformedLattice__SWIG_0(self, argc, argv);
+        return _wrap_Crystal_rotatedLattice__SWIG_0(self, argc, argv);
       }
     }
   }
   
 fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'Crystal_transformedLattice'.\n"
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'Crystal_rotatedLattice'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    Crystal::transformedLattice(IRotation const *) const\n"
-    "    Crystal::transformedLattice() const\n");
+    "    Crystal::rotatedLattice(IRotation const *) const\n"
+    "    Crystal::rotatedLattice() const\n");
   return 0;
 }
 
@@ -65978,10 +65978,10 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_Lattice3D_transformed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_Lattice3D_rotated(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Lattice3D *arg1 = (Lattice3D *) 0 ;
-  Transform3D *arg2 = 0 ;
+  RotMatrix *arg2 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 = 0 ;
@@ -65989,21 +65989,21 @@ SWIGINTERN PyObject *_wrap_Lattice3D_transformed(PyObject *SWIGUNUSEDPARM(self),
   PyObject *swig_obj[2] ;
   SwigValueWrapper< Lattice3D > result;
   
-  if (!SWIG_Python_UnpackTuple(args, "Lattice3D_transformed", 2, 2, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "Lattice3D_rotated", 2, 2, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Lattice3D, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice3D_transformed" "', argument " "1"" of type '" "Lattice3D const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Lattice3D_rotated" "', argument " "1"" of type '" "Lattice3D const *""'"); 
   }
   arg1 = reinterpret_cast< Lattice3D * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Transform3D,  0  | 0);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_RotMatrix,  0  | 0);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Lattice3D_transformed" "', argument " "2"" of type '" "Transform3D const &""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Lattice3D_rotated" "', argument " "2"" of type '" "RotMatrix const &""'"); 
   }
   if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Lattice3D_transformed" "', argument " "2"" of type '" "Transform3D const &""'"); 
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "Lattice3D_rotated" "', argument " "2"" of type '" "RotMatrix const &""'"); 
   }
-  arg2 = reinterpret_cast< Transform3D * >(argp2);
-  result = ((Lattice3D const *)arg1)->transformed((Transform3D const &)*arg2);
+  arg2 = reinterpret_cast< RotMatrix * >(argp2);
+  result = ((Lattice3D const *)arg1)->rotated((RotMatrix const &)*arg2);
   resultobj = SWIG_NewPointerObj((new Lattice3D(static_cast< const Lattice3D& >(result))), SWIGTYPE_p_Lattice3D, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
@@ -68504,8 +68504,8 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "Material_rotatedMaterial", _wrap_Material_rotatedMaterial, METH_VARARGS, "\n"
-		"Material_rotatedMaterial(Material self, Transform3D transform) -> Material\n"
-		"Material Material::rotatedMaterial(const Transform3D &transform) const\n"
+		"Material_rotatedMaterial(Material self, RotMatrix transform) -> Material\n"
+		"Material Material::rotatedMaterial(const RotMatrix &transform) const\n"
 		"\n"
 		""},
 	 { "delete_Material", _wrap_delete_Material, METH_O, "delete_Material(Material self)"},
@@ -68775,7 +68775,7 @@ static PyMethodDef SwigMethods[] = {
 		"\n"
 		""},
 	 { "IFormFactorDecorator_swigregister", IFormFactorDecorator_swigregister, METH_O, NULL},
-	 { "IRotation_createRotation", _wrap_IRotation_createRotation, METH_O, "IRotation_createRotation(Transform3D transform) -> IRotation"},
+	 { "IRotation_createRotation", _wrap_IRotation_createRotation, METH_O, "IRotation_createRotation(RotMatrix transform) -> IRotation"},
 	 { "IRotation_clone", _wrap_IRotation_clone, METH_O, "\n"
 		"IRotation_clone(IRotation self) -> IRotation\n"
 		"IRotation* IRotation::clone() const override=0\n"
@@ -68788,9 +68788,9 @@ static PyMethodDef SwigMethods[] = {
 		"Returns a new  IRotation object that is the current object's inverse. \n"
 		"\n"
 		""},
-	 { "IRotation_getTransform3D", _wrap_IRotation_getTransform3D, METH_O, "\n"
-		"IRotation_getTransform3D(IRotation self) -> Transform3D\n"
-		"virtual Transform3D IRotation::getTransform3D() const =0\n"
+	 { "IRotation_getRotMatrix", _wrap_IRotation_getRotMatrix, METH_O, "\n"
+		"IRotation_getRotMatrix(IRotation self) -> RotMatrix\n"
+		"virtual RotMatrix IRotation::getRotMatrix() const =0\n"
 		"\n"
 		"Returns transformation. \n"
 		"\n"
@@ -68843,9 +68843,9 @@ static PyMethodDef SwigMethods[] = {
 		"Returns a new  IRotation object that is the current object's inverse. \n"
 		"\n"
 		""},
-	 { "IdentityRotation_getTransform3D", _wrap_IdentityRotation_getTransform3D, METH_O, "\n"
-		"IdentityRotation_getTransform3D(IdentityRotation self) -> Transform3D\n"
-		"Transform3D IdentityRotation::getTransform3D() const override\n"
+	 { "IdentityRotation_getRotMatrix", _wrap_IdentityRotation_getRotMatrix, METH_O, "\n"
+		"IdentityRotation_getRotMatrix(IdentityRotation self) -> RotMatrix\n"
+		"RotMatrix IdentityRotation::getRotMatrix() const override\n"
 		"\n"
 		"Returns transformation. \n"
 		"\n"
@@ -68888,9 +68888,9 @@ static PyMethodDef SwigMethods[] = {
 		"double RotationX::getAngle() const\n"
 		"\n"
 		""},
-	 { "RotationX_getTransform3D", _wrap_RotationX_getTransform3D, METH_O, "\n"
-		"RotationX_getTransform3D(RotationX self) -> Transform3D\n"
-		"Transform3D RotationX::getTransform3D() const override\n"
+	 { "RotationX_getRotMatrix", _wrap_RotationX_getRotMatrix, METH_O, "\n"
+		"RotationX_getRotMatrix(RotationX self) -> RotMatrix\n"
+		"RotMatrix RotationX::getRotMatrix() const override\n"
 		"\n"
 		"Returns transformation. \n"
 		"\n"
@@ -68926,9 +68926,9 @@ static PyMethodDef SwigMethods[] = {
 		"double RotationY::getAngle() const\n"
 		"\n"
 		""},
-	 { "RotationY_getTransform3D", _wrap_RotationY_getTransform3D, METH_O, "\n"
-		"RotationY_getTransform3D(RotationY self) -> Transform3D\n"
-		"Transform3D RotationY::getTransform3D() const override\n"
+	 { "RotationY_getRotMatrix", _wrap_RotationY_getRotMatrix, METH_O, "\n"
+		"RotationY_getRotMatrix(RotationY self) -> RotMatrix\n"
+		"RotMatrix RotationY::getRotMatrix() const override\n"
 		"\n"
 		"Returns transformation. \n"
 		"\n"
@@ -68964,9 +68964,9 @@ static PyMethodDef SwigMethods[] = {
 		"double RotationZ::getAngle() const\n"
 		"\n"
 		""},
-	 { "RotationZ_getTransform3D", _wrap_RotationZ_getTransform3D, METH_O, "\n"
-		"RotationZ_getTransform3D(RotationZ self) -> Transform3D\n"
-		"Transform3D RotationZ::getTransform3D() const override\n"
+	 { "RotationZ_getRotMatrix", _wrap_RotationZ_getRotMatrix, METH_O, "\n"
+		"RotationZ_getRotMatrix(RotationZ self) -> RotMatrix\n"
+		"RotMatrix RotationZ::getRotMatrix() const override\n"
 		"\n"
 		"Returns transformation. \n"
 		"\n"
@@ -69012,9 +69012,9 @@ static PyMethodDef SwigMethods[] = {
 		"double RotationEuler::getGamma() const\n"
 		"\n"
 		""},
-	 { "RotationEuler_getTransform3D", _wrap_RotationEuler_getTransform3D, METH_O, "\n"
-		"RotationEuler_getTransform3D(RotationEuler self) -> Transform3D\n"
-		"Transform3D RotationEuler::getTransform3D() const override\n"
+	 { "RotationEuler_getRotMatrix", _wrap_RotationEuler_getRotMatrix, METH_O, "\n"
+		"RotationEuler_getRotMatrix(RotationEuler self) -> RotMatrix\n"
+		"RotMatrix RotationEuler::getRotMatrix() const override\n"
 		"\n"
 		"Returns transformation. \n"
 		"\n"
@@ -69184,9 +69184,9 @@ static PyMethodDef SwigMethods[] = {
 		"Admixtures Crystal::admixtures() const\n"
 		"\n"
 		""},
-	 { "Crystal_transformedLattice", _wrap_Crystal_transformedLattice, METH_VARARGS, "\n"
-		"Crystal_transformedLattice(Crystal self, IRotation rotation=None) -> Lattice3D\n"
-		"Lattice3D Crystal::transformedLattice(const IRotation *rotation=nullptr) const\n"
+	 { "Crystal_rotatedLattice", _wrap_Crystal_rotatedLattice, METH_VARARGS, "\n"
+		"Crystal_rotatedLattice(Crystal self, IRotation rotation=None) -> Lattice3D\n"
+		"Lattice3D Crystal::rotatedLattice(const IRotation *rotation=nullptr) const\n"
 		"\n"
 		""},
 	 { "Crystal_getChildren", _wrap_Crystal_getChildren, METH_O, "\n"
@@ -72945,11 +72945,11 @@ static PyMethodDef SwigMethods[] = {
 		"Lattice3D::~Lattice3D() override\n"
 		"\n"
 		""},
-	 { "Lattice3D_transformed", _wrap_Lattice3D_transformed, METH_VARARGS, "\n"
-		"Lattice3D_transformed(Lattice3D self, Transform3D transform) -> Lattice3D\n"
-		"Lattice3D Lattice3D::transformed(const Transform3D &transform) const\n"
+	 { "Lattice3D_rotated", _wrap_Lattice3D_rotated, METH_VARARGS, "\n"
+		"Lattice3D_rotated(Lattice3D self, RotMatrix rotMatrix) -> Lattice3D\n"
+		"Lattice3D Lattice3D::rotated(const RotMatrix &rotMatrix) const\n"
 		"\n"
-		"Creates transformed lattice. \n"
+		"Creates rotated lattice. \n"
 		"\n"
 		""},
 	 { "Lattice3D_getBasisVectorA", _wrap_Lattice3D_getBasisVectorA, METH_O, "\n"
@@ -74652,6 +74652,7 @@ static swig_type_info _swigt__p_Particle = {"_p_Particle", "Particle *", 0, 0, (
 static swig_type_info _swigt__p_ParticleComposition = {"_p_ParticleComposition", "ParticleComposition *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ParticleCoreShell = {"_p_ParticleCoreShell", "ParticleCoreShell *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_ParticleLayout = {"_p_ParticleLayout", "ParticleLayout *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_RotMatrix = {"_p_RotMatrix", "RotMatrix *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_RotationEuler = {"_p_RotationEuler", "RotationEuler *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_RotationX = {"_p_RotationX", "RotationX *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_RotationY = {"_p_RotationY", "RotationY *", 0, 0, (void*)0, 0};
@@ -74663,7 +74664,6 @@ static swig_type_info _swigt__p_SimpleSelectionRule = {"_p_SimpleSelectionRule",
 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_SquareLattice2D = {"_p_SquareLattice2D", "SquareLattice2D *", 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_Vec3T_double_t = {"_p_Vec3T_double_t", "std::vector< Vec3< double > >::value_type *|R3 *|Vec3< double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Vec3T_int_t = {"_p_Vec3T_int_t", "I3 *|Vec3< int > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Vec3T_std__complexT_double_t_t = {"_p_Vec3T_std__complexT_double_t_t", "Vec3< std::complex< double > > *|C3 *|std::vector< Vec3< std::complex< double > > >::value_type *", 0, 0, (void*)0, 0};
@@ -74836,6 +74836,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_ParticleComposition,
   &_swigt__p_ParticleCoreShell,
   &_swigt__p_ParticleLayout,
+  &_swigt__p_RotMatrix,
   &_swigt__p_RotationEuler,
   &_swigt__p_RotationX,
   &_swigt__p_RotationY,
@@ -74847,7 +74848,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_SlicedParticle,
   &_swigt__p_SlicingEffects,
   &_swigt__p_SquareLattice2D,
-  &_swigt__p_Transform3D,
   &_swigt__p_Vec3T_double_t,
   &_swigt__p_Vec3T_int_t,
   &_swigt__p_Vec3T_std__complexT_double_t_t,
@@ -75020,6 +75020,7 @@ static swig_cast_info _swigc__p_Particle[] = {  {&_swigt__p_Particle, 0, 0, 0},{
 static swig_cast_info _swigc__p_ParticleComposition[] = {  {&_swigt__p_ParticleComposition, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ParticleCoreShell[] = {  {&_swigt__p_ParticleCoreShell, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ParticleLayout[] = {  {&_swigt__p_ParticleLayout, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_RotMatrix[] = {  {&_swigt__p_RotMatrix, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_RotationEuler[] = {  {&_swigt__p_RotationEuler, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_RotationX[] = {  {&_swigt__p_RotationX, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_RotationY[] = {  {&_swigt__p_RotationY, 0, 0, 0},{0, 0, 0, 0}};
@@ -75031,7 +75032,6 @@ static swig_cast_info _swigc__p_SimpleSelectionRule[] = {  {&_swigt__p_SimpleSel
 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_SquareLattice2D[] = {  {&_swigt__p_SquareLattice2D, 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_Vec3T_double_t[] = {  {&_swigt__p_Vec3T_double_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Vec3T_int_t[] = {  {&_swigt__p_Vec3T_int_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Vec3T_std__complexT_double_t_t[] = {  {&_swigt__p_Vec3T_std__complexT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -75204,6 +75204,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_ParticleComposition,
   _swigc__p_ParticleCoreShell,
   _swigc__p_ParticleLayout,
+  _swigc__p_RotMatrix,
   _swigc__p_RotationEuler,
   _swigc__p_RotationX,
   _swigc__p_RotationY,
@@ -75215,7 +75216,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_SlicedParticle,
   _swigc__p_SlicingEffects,
   _swigc__p_SquareLattice2D,
-  _swigc__p_Transform3D,
   _swigc__p_Vec3T_double_t,
   _swigc__p_Vec3T_int_t,
   _swigc__p_Vec3T_std__complexT_double_t_t,