diff --git a/src/OpenFOAM/primitives/spatialVectorAlgebra/spatialTransform/spatialTransform.H b/src/OpenFOAM/primitives/spatialVectorAlgebra/spatialTransform/spatialTransform.H
new file mode 100644
index 0000000000000000000000000000000000000000..2d68e321ae013501d441b14f7933d07463394524
--- /dev/null
+++ b/src/OpenFOAM/primitives/spatialVectorAlgebra/spatialTransform/spatialTransform.H
@@ -0,0 +1,200 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenFOAM Foundation
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::spatialTransform
+
+Description
+    Compact representation of the Plücker spatial transformation tensor
+    in terms of the rotation tensor \c E and translation vector \c r .
+
+    See Chapter 2 and Appendix A in reference:
+    \verbatim
+        Featherstone, R. (2008).
+        Rigid body dynamics algorithms.
+        Springer.
+    \endverbatim
+
+SourceFiles
+    spatialTransformI.H
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef spatialTransform_H
+#define spatialTransform_H
+
+#include "tensor.H"
+#include "spatialVector.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of classes
+class Istream;
+class Ostream;
+
+// Forward declaration of friend functions and operators
+class spatialTransform;
+Istream& operator>>(Istream&, spatialTransform&);
+Ostream& operator<<(Ostream&, const spatialTransform&);
+
+
+/*---------------------------------------------------------------------------*\
+                         Class spatialTransform Declaration
+\*---------------------------------------------------------------------------*/
+
+class spatialTransform
+{
+    // Private data
+
+        //- Rotation tensor
+        tensor E_;
+
+        //- Translation vector
+        vector r_;
+
+
+    // Private member functions
+
+        //- Return E . *r
+        inline tensor Erx() const;
+
+
+public:
+
+        //- Wrapper-class to provide transpose functions and operators
+        class transpose
+        {
+            const spatialTransform& X_;
+
+        public:
+
+            //- Construct from a spatialTransform
+            inline transpose(const spatialTransform& X);
+
+            //- Return the transpose transformation tensor ^A{X^*}_B
+            //  X^T
+            inline operator spatialTensor() const;
+
+            //- Transpose transform dual f: ^A{X^*}_B & f
+            //  X^T . f = (E^T . fl + r ^ E^T . fw, E^T . fl)
+            inline spatialVector operator&(const spatialVector& f) const;
+        };
+
+
+        //- Wrapper-class to provide dual functions and operators
+        class dual
+        {
+            const spatialTransform& X_;
+
+        public:
+
+            //- Construct from a spatialTransform
+            inline dual(const spatialTransform& X);
+
+            //- Return dual transformation tensor ^B{X^*}_A
+            inline operator spatialTensor() const;
+
+            //- Transform dual f: ^B{X^*}_A & f
+            //  X^* . f = (E . fw - r ^ fl, E . fl)
+            inline spatialVector operator&(const spatialVector& f) const;
+        };
+
+
+    // Constructors
+
+        //- Construct null
+        inline spatialTransform();
+
+        //- Construct from components
+        inline spatialTransform(const tensor& E, const vector& r);
+
+        //- Construct from Istream
+        inline spatialTransform(Istream&);
+
+
+    // Member Functions
+
+        //- Return the rotation tensor
+        inline const tensor& E() const;
+
+        //- Return non-const access to the rotation tensor
+        inline tensor& E();
+
+        //- Return the translation vector
+        inline const vector& r() const;
+
+        //- Return non-const access to the translation vector
+        inline vector& r();
+
+        //- Return the transpose transformation tensor ^A{X^*}_B
+        //  X^T
+        inline transpose T() const;
+
+        //- Return the inverse transformation tensor: X^-1
+        //  X^-1 = (E^T, −E.r)
+        inline spatialTransform inv() const;
+
+
+    // Member Operators
+
+        //- Return the dual transformation tensor ^B{X^*}_A
+        inline dual operator*() const;
+
+        //- Return transformation tensor ^BX_A
+        //  X
+        inline operator spatialTensor() const;
+
+        //- Inner-product multiply with a transformation tensor
+        inline void operator&=(const spatialTransform& X);
+
+        //- Return the inner-product of two transformation tensors
+        inline spatialTransform operator&(const spatialTransform& X) const;
+
+        //- Transform v: ^BX_A . v
+        //  X.v = (E . vw, E . (vl - r^vw))
+        inline spatialVector operator&(const spatialVector& v) const;
+
+
+    // IOstream Operators
+
+        friend Istream& operator>>(Istream&, spatialTransform&);
+        friend Ostream& operator<<(Ostream&, const spatialTransform&);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "spatialTransformI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/primitives/spatialVectorAlgebra/spatialTransform/spatialTransformI.H b/src/OpenFOAM/primitives/spatialVectorAlgebra/spatialTransform/spatialTransformI.H
new file mode 100644
index 0000000000000000000000000000000000000000..c2a4c943a4baa9b110cc93e22a97700e9751fa89
--- /dev/null
+++ b/src/OpenFOAM/primitives/spatialVectorAlgebra/spatialTransform/spatialTransformI.H
@@ -0,0 +1,267 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenFOAM Foundation
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "transform.H"
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+Foam::tensor Foam::spatialTransform::Erx() const
+{
+    return E_ & *r_;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+inline Foam::spatialTransform::spatialTransform()
+:
+    E_(tensor::I),
+    r_(vector::zero)
+{}
+
+
+inline Foam::spatialTransform::spatialTransform
+(
+    const tensor& E,
+    const vector& r
+)
+:
+    E_(E),
+    r_(r)
+{}
+
+
+inline Foam::spatialTransform::spatialTransform(Istream& is)
+:
+    E_(is),
+    r_(is)
+{}
+
+
+inline Foam::spatialTransform::transpose::transpose(const spatialTransform& X)
+:
+    X_(X)
+{}
+
+
+inline Foam::spatialTransform::dual::dual(const spatialTransform& X)
+:
+    X_(X)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+inline const Foam::tensor& Foam::spatialTransform::E() const
+{
+    return E_;
+}
+
+inline Foam::tensor& Foam::spatialTransform::E()
+{
+    return E_;
+}
+
+inline const Foam::vector& Foam::spatialTransform::r() const
+{
+    return r_;
+}
+
+inline Foam::vector& Foam::spatialTransform::r()
+{
+    return r_;
+}
+
+
+inline Foam::spatialTransform::transpose Foam::spatialTransform::T() const
+{
+    return transpose(*this);
+}
+
+
+inline Foam::spatialTransform Foam::spatialTransform::inv() const
+{
+    return spatialTransform(E_.T(), -(E_ & r_));
+}
+
+
+// * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
+
+inline Foam::spatialTransform::dual Foam::spatialTransform::operator*() const
+{
+    return dual(*this);
+}
+
+
+inline Foam::spatialTransform::operator spatialTensor() const
+{
+    return spatialTensor
+    (
+        E_,             tensor::zero,
+       -Erx(),          E_
+    );
+}
+
+
+inline void Foam::spatialTransform::operator&=(const spatialTransform& X)
+{
+    E_ &= X.E_;
+    r_ = X.r_ + (r_ & X.E_.T());
+}
+
+
+inline Foam::spatialTransform Foam::spatialTransform::operator&
+(
+    const spatialTransform& X
+) const
+{
+    return spatialTransform(E_ & X.E_, X.r_ + (r_ & X.E_));
+}
+
+
+inline Foam::spatialVector Foam::spatialTransform::operator&
+(
+    const spatialVector& v
+) const
+{
+    return spatialVector
+    (
+        E_ & v.angular(),
+        E_ & (v.linear() - (r_ ^ v.angular()))
+    );
+}
+
+
+inline Foam::spatialTransform::transpose::operator spatialTensor() const
+{
+    return spatialTensor
+    (
+        X_.E().T(),    -X_.Erx().T(),
+        tensor::zero,   X_.E().T()
+    );
+}
+
+
+inline Foam::spatialVector Foam::spatialTransform::transpose::operator&
+(
+    const spatialVector& f
+) const
+{
+    vector ETfl(X_.E().T() & f.linear());
+
+    return spatialVector
+    (
+        (X_.E().T() & f.angular()) + (X_.r() ^ ETfl),
+        ETfl
+    );
+}
+
+
+inline Foam::spatialTransform::dual::operator spatialTensor() const
+{
+    return spatialTensor
+    (
+        X_.E(),        -X_.Erx(),
+        tensor::zero,   X_.E()
+    );
+}
+
+
+inline Foam::spatialVector Foam::spatialTransform::dual::operator&
+(
+    const spatialVector& f
+) const
+{
+    return spatialVector
+    (
+        X_.E() & (f.angular() - (X_.r() ^ f.linear())),
+        X_.E() & f.linear()
+    );
+}
+
+
+// * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * * //
+
+inline Foam::Istream& Foam::operator>>(Foam::Istream& is, spatialTransform& X)
+{
+    is >> X.E() >> X.r();
+    return is;
+}
+
+
+inline Foam::Ostream& Foam::operator<<
+(
+    Foam::Ostream& os,
+    const spatialTransform& X
+)
+{
+    os << X.E() << token::SPACE << X.r() << endl;
+    return os;
+}
+
+
+// * * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+//- Rotational spatial transformation tensor about the x-axis by omega radians
+inline spatialTransform Xrx(const scalar& omega)
+{
+    return spatialTransform(Rx(omega), vector::zero);
+}
+
+//- Rotational spatial transformation tensor about the x-axis by omega radians
+inline spatialTransform Xry(const scalar& omega)
+{
+    return spatialTransform(Ry(omega), vector::zero);
+}
+
+//- Rotational spatial transformation tensor about the z-axis by omega radians
+inline spatialTransform Xrz(const scalar& omega)
+{
+    return spatialTransform(Rz(omega), vector::zero);
+}
+
+//- Rotational spatial transformation tensor about axis a by omega radians
+inline spatialTransform Xr(const vector& a, const scalar omega)
+{
+    return spatialTransform(Ra(a, omega), vector::zero);
+}
+
+//- Translational spatial transformation tensor about axis a by omega radians
+inline spatialTransform Xt(const vector& r)
+{
+    return spatialTransform(tensor::I, r);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// ************************************************************************* //