diff --git a/src/sixDoFRigidBodyMotion/Make/files b/src/sixDoFRigidBodyMotion/Make/files
index 022baa43df6e0ebe4c8f36a2193cf8ca7c56418c..75435920ea441c167af884370570c97ad5eae050 100644
--- a/src/sixDoFRigidBodyMotion/Make/files
+++ b/src/sixDoFRigidBodyMotion/Make/files
@@ -3,7 +3,7 @@ sixDoFRigidBodyMotion/sixDoFRigidBodyMotionIO.C
 sixDoFRigidBodyMotion/sixDoFRigidBodyMotionState.C
 sixDoFRigidBodyMotion/sixDoFRigidBodyMotionStateIO.C
 
-restraints = sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint
+restraints = sixDoFRigidBodyMotion/restraints
 
 $(restraints)/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint.C
 $(restraints)/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraintNew.C
@@ -12,7 +12,7 @@ $(restraints)/linearSpring/linearSpring.C
 $(restraints)/sphericalAngularSpring/sphericalAngularSpring.C
 $(restraints)/tabulatedAxialAngularSpring/tabulatedAxialAngularSpring.C
 
-constraints = sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint
+constraints = sixDoFRigidBodyMotion/constraints
 
 $(constraints)/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint.C
 $(constraints)/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraintNew.C
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedAxis/fixedAxis.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedAxis/fixedAxis.C
similarity index 60%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedAxis/fixedAxis.C
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedAxis/fixedAxis.C
index 0e2737842535eba35bbd5a64b08e37c9a1a2b701..db7b66a6ff993e33abb9c248b43a83e00e774c8d 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedAxis/fixedAxis.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedAxis/fixedAxis.C
@@ -49,10 +49,11 @@ namespace sixDoFRigidBodyMotionConstraints
 
 Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::fixedAxis
 (
+    const word& name,
     const dictionary& sDoFRBMCDict
 )
 :
-    sixDoFRigidBodyMotionConstraint(sDoFRBMCDict),
+    sixDoFRigidBodyMotionConstraint(name, sDoFRBMCDict),
     fixedAxis_()
 {
     read(sDoFRBMCDict);
@@ -67,79 +68,19 @@ Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::~fixedAxis()
 
 // * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
 
-bool Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::constrain
+void Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::constrainTranslation
 (
-    const sixDoFRigidBodyMotion& motion,
-    const vector& existingConstraintForce,
-    const vector& existingConstraintMoment,
-    scalar deltaT,
-    vector& constraintPosition,
-    vector& constraintForceIncrement,
-    vector& constraintMomentIncrement
+    pointConstraint& pc
 ) const
-{
-    constraintMomentIncrement = vector::zero;
-
-    vector predictedDir = motion.predictedOrientation
-    (
-        fixedAxis_,
-        existingConstraintMoment,
-        deltaT
-    );
-
-    scalar theta = acos(min(predictedDir & fixedAxis_, 1.0));
-
-    vector rotationAxis = fixedAxis_ ^ predictedDir;
-
-    scalar magRotationAxis = mag(rotationAxis);
-
-    if (magRotationAxis > VSMALL)
-    {
-        rotationAxis /= magRotationAxis;
-
-        const tensor& Q = motion.orientation();
-
-        // Transform rotationAxis to body local system
-        rotationAxis = Q.T() & rotationAxis;
-
-        constraintMomentIncrement =
-           -relaxationFactor_
-           *(motion.momentOfInertia() & rotationAxis)
-           *theta/sqr(deltaT);
-
-        // Transform moment increment to global system
-        constraintMomentIncrement = Q & constraintMomentIncrement;
-
-        // Remove any moment that is around the fixedAxis_
-        constraintMomentIncrement -=
-            (constraintMomentIncrement & fixedAxis_)*fixedAxis_;
-    }
-
-    constraintPosition = motion.centreOfMass();
-
-    constraintForceIncrement = vector::zero;
-
-    bool converged(mag(theta) < tolerance_);
+{}
 
-    if (sixDoFRigidBodyMotionConstraint::debug)
-    {
-        Info<< " angle " << theta
-            << " force " << constraintForceIncrement
-            << " moment " << constraintMomentIncrement;
-
-        if (converged)
-        {
-            Info<< " converged";
-        }
-        else
-        {
-            Info<< " not converged";
-        }
-
-        Info<< endl;
-    }
 
-    return converged;
+void Foam::sixDoFRigidBodyMotionConstraints::fixedAxis::constrainRotation
+(
+    pointConstraint& pc
+) const
+{
+    pc.combine(pointConstraint(Tuple2<label, vector>(2, vector(0,1,0))));
 }
 
 
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedAxis/fixedAxis.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedAxis/fixedAxis.H
similarity index 83%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedAxis/fixedAxis.H
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedAxis/fixedAxis.H
index 7772833f4d53fccb4f81be74b404cc92c9433e2e..e2a2cc26da0ebff96788e1188869933228072678 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedAxis/fixedAxis.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedAxis/fixedAxis.H
@@ -37,8 +37,6 @@ SourceFiles
 #define fixedAxis_H
 
 #include "sixDoFRigidBodyMotionConstraint.H"
-#include "point.H"
-#include "tensor.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -74,6 +72,7 @@ public:
         //- Construct from components
         fixedAxis
         (
+            const word& name,
             const dictionary& sDoFRBMCDict
         );
 
@@ -93,19 +92,11 @@ public:
 
     // Member Functions
 
-        //- Calculate the constraint position, force and moment.
-        //  Global reference frame vectors.  Returns boolean stating
-        //  whether the constraint been converged to tolerance.
-        virtual bool constrain
-        (
-            const sixDoFRigidBodyMotion& motion,
-            const vector& existingConstraintForce,
-            const vector& existingConstraintMoment,
-            scalar deltaT,
-            vector& constraintPosition,
-            vector& constraintForceIncrement,
-            vector& constraintMomentIncrement
-        ) const;
+        //- Apply and accumulate translational constraints
+        virtual void constrainTranslation(pointConstraint&) const;
+
+        //- Apply and accumulate rotational constraints
+        virtual void constrainRotation(pointConstraint&) const;
 
         //- Update properties from given dictionary
         virtual bool read(const dictionary& sDoFRBMCCoeff);
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedLine/fixedLine.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedLine/fixedLine.C
similarity index 63%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedLine/fixedLine.C
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedLine/fixedLine.C
index f77afa2b10ade1dc45492a1995ab8dd67f2fd1da..5aa4d669daa7d1ef5400ee1ac884bdc09e831320 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedLine/fixedLine.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedLine/fixedLine.C
@@ -49,11 +49,11 @@ namespace sixDoFRigidBodyMotionConstraints
 
 Foam::sixDoFRigidBodyMotionConstraints::fixedLine::fixedLine
 (
+    const word& name,
     const dictionary& sDoFRBMCDict
 )
 :
-    sixDoFRigidBodyMotionConstraint(sDoFRBMCDict),
-    refPt_(),
+    sixDoFRigidBodyMotionConstraint(name, sDoFRBMCDict),
     dir_()
 {
     read(sDoFRBMCDict);
@@ -68,65 +68,20 @@ Foam::sixDoFRigidBodyMotionConstraints::fixedLine::~fixedLine()
 
 // * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
 
-bool Foam::sixDoFRigidBodyMotionConstraints::fixedLine::constrain
+void Foam::sixDoFRigidBodyMotionConstraints::fixedLine::constrainTranslation
 (
-    const sixDoFRigidBodyMotion& motion,
-    const vector& existingConstraintForce,
-    const vector& existingConstraintMoment,
-    scalar deltaT,
-    vector& constraintPosition,
-    vector& constraintForceIncrement,
-    vector& constraintMomentIncrement
+    pointConstraint& pc
 ) const
 {
-    point predictedPosition = motion.predictedPosition
-    (
-        refPt_,
-        existingConstraintForce,
-        existingConstraintMoment,
-        deltaT
-    );
-
-    constraintPosition = motion.currentPosition(refPt_);
-
-    // Info<< "current position " << constraintPosition << nl
-    //     << "next predictedPosition " << predictedPosition
-    //     << endl;
-
-    // Vector from reference point to predicted point
-    vector rC = predictedPosition - refPt_;
-
-    vector error = rC - ((rC) & dir_)*dir_;
-
-    // Info<< "error " << error << endl;
-
-    constraintForceIncrement =
-        -relaxationFactor_*error*motion.mass()/sqr(deltaT);
-
-    constraintMomentIncrement = vector::zero;
-
-    bool converged(mag(error) < tolerance_);
+    pc.combine(pointConstraint(Tuple2<label, vector>(2, dir_)));
+}
 
-    if (sixDoFRigidBodyMotionConstraint::debug)
-    {
-        Info<< " error " << error
-            << " force " << constraintForceIncrement
-            << " moment " << constraintMomentIncrement;
-
-        if (converged)
-        {
-            Info<< " converged";
-        }
-        else
-        {
-            Info<< " not converged";
-        }
-
-        Info<< endl;
-    }
 
-    return converged;
-}
+void Foam::sixDoFRigidBodyMotionConstraints::fixedLine::constrainRotation
+(
+    pointConstraint& pc
+) const
+{}
 
 
 bool Foam::sixDoFRigidBodyMotionConstraints::fixedLine::read
@@ -136,8 +91,6 @@ bool Foam::sixDoFRigidBodyMotionConstraints::fixedLine::read
 {
     sixDoFRigidBodyMotionConstraint::read(sDoFRBMCDict);
 
-    sDoFRBMCCoeffs_.lookup("refPoint") >> refPt_;
-
     sDoFRBMCCoeffs_.lookup("direction") >> dir_;
 
     scalar magDir(mag(dir_));
@@ -168,9 +121,6 @@ void Foam::sixDoFRigidBodyMotionConstraints::fixedLine::write
     Ostream& os
 ) const
 {
-    os.writeKeyword("refPoint")
-        << refPt_ << token::END_STATEMENT << nl;
-
     os.writeKeyword("direction")
         << dir_ << token::END_STATEMENT << nl;
 }
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedLine/fixedLine.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedLine/fixedLine.H
similarity index 81%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedLine/fixedLine.H
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedLine/fixedLine.H
index 8d0710e0908780deb5364a99e63c4f5ab695e388..2e48f564a74a068d1642b308cea38d4b900f9d52 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedLine/fixedLine.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedLine/fixedLine.H
@@ -37,7 +37,6 @@ SourceFiles
 #define fixedLine_H
 
 #include "sixDoFRigidBodyMotionConstraint.H"
-#include "point.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -57,9 +56,6 @@ class fixedLine
 {
     // Private data
 
-        //- Reference point for the constraining line
-        point refPt_;
-
         //- Direction of the constraining line
         vector dir_;
 
@@ -75,6 +71,7 @@ public:
         //- Construct from components
         fixedLine
         (
+            const word& name,
             const dictionary& sDoFRBMCDict
         );
 
@@ -94,19 +91,11 @@ public:
 
     // Member Functions
 
-        //- Calculate the constraint position, force and moment.
-        //  Global reference frame vectors.  Returns boolean stating
-        //  whether the constraint been converged to tolerance.
-        virtual bool constrain
-        (
-            const sixDoFRigidBodyMotion& motion,
-            const vector& existingConstraintForce,
-            const vector& existingConstraintMoment,
-            scalar deltaT,
-            vector& constraintPosition,
-            vector& constraintForceIncrement,
-            vector& constraintMomentIncrement
-        ) const;
+        //- Apply and accumulate translational constraints
+        virtual void constrainTranslation(pointConstraint&) const;
+
+        //- Apply and accumulate rotational constraints
+        virtual void constrainRotation(pointConstraint&) const;
 
         //- Update properties from given dictionary
         virtual bool read(const dictionary& sDoFRBMCCoeff);
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedOrientation/fixedOrientation.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedOrientation/fixedOrientation.C
similarity index 51%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedOrientation/fixedOrientation.C
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedOrientation/fixedOrientation.C
index c66bdbb3623383e897bf77d359c2ca110314030e..5d4cc8cff045eb32764069b25d880556dc7bacc1 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedOrientation/fixedOrientation.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedOrientation/fixedOrientation.C
@@ -49,10 +49,11 @@ namespace sixDoFRigidBodyMotionConstraints
 
 Foam::sixDoFRigidBodyMotionConstraints::fixedOrientation::fixedOrientation
 (
+    const word& name,
     const dictionary& sDoFRBMCDict
 )
 :
-    sixDoFRigidBodyMotionConstraint(sDoFRBMCDict)
+    sixDoFRigidBodyMotionConstraint(name, sDoFRBMCDict)
 {
     read(sDoFRBMCDict);
 }
@@ -66,102 +67,21 @@ Foam::sixDoFRigidBodyMotionConstraints::fixedOrientation::~fixedOrientation()
 
 // * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
 
-bool Foam::sixDoFRigidBodyMotionConstraints::fixedOrientation::constrain
+void Foam::sixDoFRigidBodyMotionConstraints::fixedOrientation::
+constrainTranslation
 (
-    const sixDoFRigidBodyMotion& motion,
-    const vector& existingConstraintForce,
-    const vector& existingConstraintMoment,
-    scalar deltaT,
-    vector& constraintPosition,
-    vector& constraintForceIncrement,
-    vector& constraintMomentIncrement
+    pointConstraint& pc
 ) const
-{
-    constraintMomentIncrement = vector::zero;
-
-    scalar maxTheta = -SMALL;
-
-    for (direction cmpt=0; cmpt<vector::nComponents; cmpt++)
-    {
-        vector axis = vector::zero;
-
-        axis[cmpt] = 1;
-
-        vector refDir = vector::zero;
-
-        refDir[(cmpt + 1) % 3] = 1;
-
-        vector predictedDir = motion.predictedOrientation
-        (
-            refDir,
-            existingConstraintMoment,
-            deltaT
-        );
-
-        // Removing any axis component from predictedDir
-        predictedDir -= (axis & predictedDir)*axis;
-
-        scalar theta = GREAT;
-
-        scalar magPredictedDir = mag(predictedDir);
-
-        if (magPredictedDir > VSMALL)
-        {
-            predictedDir /= magPredictedDir;
-
-            theta = acos(min(predictedDir & refDir, 1.0));
-
-            // Recalculating axis to give correct sign to angle
-            axis = (refDir ^ predictedDir);
-
-            scalar magAxis = mag(axis);
-
-            if (magAxis > VSMALL)
-            {
-                axis /= magAxis;
-            }
-            else
-            {
-                axis = vector::zero;
-            }
-        }
-
-        if (theta > maxTheta)
-        {
-            maxTheta = theta;
-        }
-
-        constraintMomentIncrement +=
-           -relaxationFactor_
-           *theta*axis
-           *motion.momentOfInertia()[cmpt]/sqr(deltaT);
-    }
-
-    constraintPosition = motion.centreOfMass();
-
-    constraintForceIncrement = vector::zero;
-
-    bool converged(mag(maxTheta) < tolerance_);
-
-    if (sixDoFRigidBodyMotionConstraint::debug)
-    {
-        Info<< " max angle " << maxTheta
-            << " force " << constraintForceIncrement
-            << " moment " << constraintMomentIncrement;
-
-        if (converged)
-        {
-            Info<< " converged";
-        }
-        else
-        {
-            Info<< " not converged";
-        }
+{}
 
-        Info<< endl;
-    }
 
-    return converged;
+void Foam::sixDoFRigidBodyMotionConstraints::fixedOrientation::
+constrainRotation
+(
+    pointConstraint& pc
+) const
+{
+    pc.combine(pointConstraint(Tuple2<label, vector>(3, vector::zero)));
 }
 
 
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedOrientation/fixedOrientation.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedOrientation/fixedOrientation.H
similarity index 79%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedOrientation/fixedOrientation.H
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedOrientation/fixedOrientation.H
index fcf7a62167ac24d29205cc07a68cd133c0d4a89a..b41945837a82eaa85779db2d9df568e27d06df28 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedOrientation/fixedOrientation.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedOrientation/fixedOrientation.H
@@ -25,9 +25,7 @@ Class
     Foam::sixDoFRigidBodyMotionConstraints::fixedOrientation
 
 Description
-    sixDoFRigidBodyMotionConstraint.  Orientation of body fixed global
-    space. Only valid where the predicted deviation from alignment is
-    < 90 degrees.
+    Fix orientation of body in global space.
 
 SourceFiles
     fixedOrientation.C
@@ -38,8 +36,6 @@ SourceFiles
 #define fixedOrientation_H
 
 #include "sixDoFRigidBodyMotionConstraint.H"
-#include "point.H"
-#include "tensor.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -69,6 +65,7 @@ public:
         //- Construct from components
         fixedOrientation
         (
+            const word& name,
             const dictionary& sDoFRBMCDict
         );
 
@@ -88,19 +85,11 @@ public:
 
     // Member Functions
 
-        //- Calculate the constraint position, force and moment.
-        //  Global reference frame vectors.  Returns boolean stating
-        //  whether the constraint been converged to tolerance.
-        virtual bool constrain
-        (
-            const sixDoFRigidBodyMotion& motion,
-            const vector& existingConstraintForce,
-            const vector& existingConstraintMoment,
-            scalar deltaT,
-            vector& constraintPosition,
-            vector& constraintForceIncrement,
-            vector& constraintMomentIncrement
-        ) const;
+        //- Apply and accumulate translational constraints
+        virtual void constrainTranslation(pointConstraint&) const;
+
+        //- Apply and accumulate rotational constraints
+        virtual void constrainRotation(pointConstraint&) const;
 
         //- Update properties from given dictionary
         virtual bool read(const dictionary& sDoFRBMCCoeff);
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedPlane/fixedPlane.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedPlane/fixedPlane.C
similarity index 56%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedPlane/fixedPlane.C
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedPlane/fixedPlane.C
index 263694ee3f2ee1a8c449055844088dcb1632e88f..edcde4d07c22a35b40ee01d6b2cc2dc00e3526d0 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedPlane/fixedPlane.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedPlane/fixedPlane.C
@@ -49,11 +49,12 @@ namespace sixDoFRigidBodyMotionConstraints
 
 Foam::sixDoFRigidBodyMotionConstraints::fixedPlane::fixedPlane
 (
+    const word& name,
     const dictionary& sDoFRBMCDict
 )
 :
-    sixDoFRigidBodyMotionConstraint(sDoFRBMCDict),
-    fixedPlane_(vector::one)
+    sixDoFRigidBodyMotionConstraint(name, sDoFRBMCDict),
+    normal_(vector::zero)
 {
     read(sDoFRBMCDict);
 }
@@ -67,66 +68,20 @@ Foam::sixDoFRigidBodyMotionConstraints::fixedPlane::~fixedPlane()
 
 // * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
 
-bool Foam::sixDoFRigidBodyMotionConstraints::fixedPlane::constrain
+void Foam::sixDoFRigidBodyMotionConstraints::fixedPlane::constrainTranslation
 (
-    const sixDoFRigidBodyMotion& motion,
-    const vector& existingConstraintForce,
-    const vector& existingConstraintMoment,
-    scalar deltaT,
-    vector& constraintPosition,
-    vector& constraintForceIncrement,
-    vector& constraintMomentIncrement
+    pointConstraint& pc
 ) const
 {
-    const point& refPt = fixedPlane_.refPoint();
-
-    const vector& n = fixedPlane_.normal();
-
-    point predictedPosition = motion.predictedPosition
-    (
-        refPt,
-        existingConstraintForce,
-        existingConstraintMoment,
-        deltaT
-    );
-
-    constraintPosition = motion.currentPosition(refPt);
-
-    // Info<< "current position " << constraintPosition << nl
-    //     << "next predictedPosition " << predictedPosition
-    //     << endl;
-
-    vector error = ((predictedPosition - refPt) & n)*n;
-
-    // Info<< "error " << error << endl;
-
-    constraintForceIncrement =
-        -relaxationFactor_*error*motion.mass()/sqr(deltaT);
-
-    constraintMomentIncrement = vector::zero;
-
-    bool converged(mag(error) < tolerance_);
-
-    if (sixDoFRigidBodyMotionConstraint::debug)
-    {
-        Info<< " error " << error
-            << " force " << constraintForceIncrement
-            << " moment " << constraintMomentIncrement;
-
-        if (converged)
-        {
-            Info<< " converged";
-        }
-        else
-        {
-            Info<< " not converged";
-        }
+    pc.applyConstraint(normal_);
+}
 
-        Info<< endl;
-    }
 
-    return converged;
-}
+void Foam::sixDoFRigidBodyMotionConstraints::fixedPlane::constrainRotation
+(
+    pointConstraint& pc
+) const
+{}
 
 
 bool Foam::sixDoFRigidBodyMotionConstraints::fixedPlane::read
@@ -136,11 +91,7 @@ bool Foam::sixDoFRigidBodyMotionConstraints::fixedPlane::read
 {
     sixDoFRigidBodyMotionConstraint::read(sDoFRBMCDict);
 
-    point refPt = sDoFRBMCCoeffs_.lookup("refPoint");
-
-    vector normal = sDoFRBMCCoeffs_.lookup("normal");
-
-    fixedPlane_ = plane(refPt, normal);
+    normal_ = sDoFRBMCCoeffs_.lookup("normal");
 
     return true;
 }
@@ -151,11 +102,8 @@ void Foam::sixDoFRigidBodyMotionConstraints::fixedPlane::write
     Ostream& os
 ) const
 {
-    os.writeKeyword("refPoint")
-        << fixedPlane_.refPoint() << token::END_STATEMENT << nl;
-
     os.writeKeyword("normal")
-        << fixedPlane_.normal() << token::END_STATEMENT << nl;
+        << normal_ << token::END_STATEMENT << nl;
 }
 
 // ************************************************************************* //
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedPlane/fixedPlane.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedPlane/fixedPlane.H
similarity index 80%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedPlane/fixedPlane.H
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedPlane/fixedPlane.H
index b7f100ac5eae4e7dfd6d0d556dbe702fe8cdf055..82ed9fab9e714dfd32c32556711fb95d6cad256b 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedPlane/fixedPlane.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedPlane/fixedPlane.H
@@ -37,7 +37,6 @@ SourceFiles
 #define fixedPlane_H
 
 #include "sixDoFRigidBodyMotionConstraint.H"
-#include "plane.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -57,9 +56,8 @@ class fixedPlane
 {
     // Private data
 
-        //- Plane which the transformed reference point is constrained
-        //  to move along
-        plane fixedPlane_;
+        //- Normal to plane
+        vector normal_;
 
 
 public:
@@ -73,6 +71,7 @@ public:
         //- Construct from components
         fixedPlane
         (
+            const word& name,
             const dictionary& sDoFRBMCDict
         );
 
@@ -92,19 +91,11 @@ public:
 
     // Member Functions
 
-        //- Calculate the constraint position, force and moment.
-        //  Global reference frame vectors.  Returns boolean stating
-        //  whether the constraint been converged to tolerance.
-        virtual bool constrain
-        (
-            const sixDoFRigidBodyMotion& motion,
-            const vector& existingConstraintForce,
-            const vector& existingConstraintMoment,
-            scalar deltaT,
-            vector& constraintPosition,
-            vector& constraintForceIncrement,
-            vector& constraintMomentIncrement
-        ) const;
+        //- Apply and accumulate translational constraints
+        virtual void constrainTranslation(pointConstraint&) const;
+
+        //- Apply and accumulate rotational constraints
+        virtual void constrainRotation(pointConstraint&) const;
 
         //- Update properties from given dictionary
         virtual bool read(const dictionary& sDoFRBMCCoeff);
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedPoint/fixedPoint.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedPoint/fixedPoint.C
similarity index 56%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedPoint/fixedPoint.C
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedPoint/fixedPoint.C
index 084334868dbee3ab2cc9a8f20b9625e29c22666c..c0f4bbf311665af81d24f8a07832bebf62c3e562 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedPoint/fixedPoint.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedPoint/fixedPoint.C
@@ -49,10 +49,11 @@ namespace sixDoFRigidBodyMotionConstraints
 
 Foam::sixDoFRigidBodyMotionConstraints::fixedPoint::fixedPoint
 (
+    const word& name,
     const dictionary& sDoFRBMCDict
 )
 :
-    sixDoFRigidBodyMotionConstraint(sDoFRBMCDict),
+    sixDoFRigidBodyMotionConstraint(name, sDoFRBMCDict),
     fixedPoint_()
 {
     read(sDoFRBMCDict);
@@ -67,75 +68,20 @@ Foam::sixDoFRigidBodyMotionConstraints::fixedPoint::~fixedPoint()
 
 // * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
 
-bool Foam::sixDoFRigidBodyMotionConstraints::fixedPoint::constrain
+void Foam::sixDoFRigidBodyMotionConstraints::fixedPoint::constrainTranslation
 (
-    const sixDoFRigidBodyMotion& motion,
-    const vector& existingConstraintForce,
-    const vector& existingConstraintMoment,
-    scalar deltaT,
-    vector& constraintPosition,
-    vector& constraintForceIncrement,
-    vector& constraintMomentIncrement
+    pointConstraint& pc
 ) const
 {
-    point predictedPosition = motion.predictedPosition
-    (
-        fixedPoint_,
-        existingConstraintForce,
-        existingConstraintMoment,
-        deltaT
-    );
-
-    constraintPosition = motion.currentPosition(fixedPoint_);
-
-    // Info<< "current position " << constraintPosition << nl
-    //     << "next predictedPosition " << predictedPosition
-    //     << endl;
-
-    vector error = predictedPosition - fixedPoint_;
-
-    // Info<< "error " << error << endl;
-
-    // Correction force derived from Lagrange multiplier:
-    //     G = -lambda*grad(sigma)
-    // where
-    //     sigma = mag(error) = 0
-    // so
-    //     grad(sigma) = error/mag(error)
-    // Solving for lambda using the SHAKE methodology gives
-    //     lambda = mass*mag(error)/sqr(deltaT)
-    // This is only strictly applicable (i.e. will converge in one
-    // iteration) to constraints at the centre of mass.  Everything
-    // else will need to iterate, and may need under-relaxed to be
-    // stable.
-
-    constraintForceIncrement =
-        -relaxationFactor_*error*motion.mass()/sqr(deltaT);
-
-    constraintMomentIncrement = vector::zero;
-
-    bool converged(mag(error) < tolerance_);
-
-    if (sixDoFRigidBodyMotionConstraint::debug)
-    {
-        Info<< " error " << error
-            << " force " << constraintForceIncrement
-            << " moment " << constraintMomentIncrement;
-
-        if (converged)
-        {
-            Info<< " converged";
-        }
-        else
-        {
-            Info<< " not converged";
-        }
+    pc.combine(pointConstraint(Tuple2<label, vector>(3, vector::zero)));
+}
 
-        Info<< endl;
-    }
 
-    return converged;
-}
+void Foam::sixDoFRigidBodyMotionConstraints::fixedPoint::constrainRotation
+(
+    pointConstraint& pc
+) const
+{}
 
 
 bool Foam::sixDoFRigidBodyMotionConstraints::fixedPoint::read
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedPoint/fixedPoint.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedPoint/fixedPoint.H
similarity index 83%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedPoint/fixedPoint.H
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedPoint/fixedPoint.H
index c361d3a8b3d0ad730ec293f2fdc39b02c50f379a..4745adc8a9e6af28fcb9d5c8778ff54bd7fb23b6 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/fixedPoint/fixedPoint.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/fixedPoint/fixedPoint.H
@@ -25,7 +25,7 @@ Class
     Foam::sixDoFRigidBodyMotionConstraints::fixedPoint
 
 Description
-    sixDoFRigidBodyMotionConstraint.  Point fixed in space.
+    Point fixed in space.
 
 SourceFiles
     fixedPoint.C
@@ -74,6 +74,7 @@ public:
         //- Construct from components
         fixedPoint
         (
+            const word& name,
             const dictionary& sDoFRBMCDict
         );
 
@@ -93,19 +94,11 @@ public:
 
     // Member Functions
 
-        //- Calculate the constraint position, force and moment.
-        //  Global reference frame vectors.  Returns boolean stating
-        //  whether the constraint been converged to tolerance.
-        virtual bool constrain
-        (
-            const sixDoFRigidBodyMotion& motion,
-            const vector& existingConstraintForce,
-            const vector& existingConstraintMoment,
-            scalar deltaT,
-            vector& constraintPosition,
-            vector& constraintForceIncrement,
-            vector& constraintMomentIncrement
-        ) const;
+        //- Apply and accumulate translational constraints
+        virtual void constrainTranslation(pointConstraint&) const;
+
+        //- Apply and accumulate rotational constraints
+        virtual void constrainRotation(pointConstraint&) const;
 
         //- Update properties from given dictionary
         virtual bool read(const dictionary& sDoFRBMCCoeff);
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint.C
similarity index 77%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint.C
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint.C
index 22299c7f3c8cc3f2dc1b7fca94aa554a3c975665..6a497d4de5abe9bf8407e1c5c2634f98362ea1c1 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint.C
@@ -29,9 +29,8 @@ License
 
 namespace Foam
 {
-defineTypeNameAndDebug(sixDoFRigidBodyMotionConstraint, 0);
-
-defineRunTimeSelectionTable(sixDoFRigidBodyMotionConstraint, dictionary);
+    defineTypeNameAndDebug(sixDoFRigidBodyMotionConstraint, 0);
+    defineRunTimeSelectionTable(sixDoFRigidBodyMotionConstraint, dictionary);
 }
 
 
@@ -39,9 +38,11 @@ defineRunTimeSelectionTable(sixDoFRigidBodyMotionConstraint, dictionary);
 
 Foam::sixDoFRigidBodyMotionConstraint::sixDoFRigidBodyMotionConstraint
 (
+    const word& name,
     const dictionary& sDoFRBMCDict
 )
 :
+    name_(name),
     sDoFRBMCCoeffs_
     (
         sDoFRBMCDict.subDict
@@ -49,11 +50,6 @@ Foam::sixDoFRigidBodyMotionConstraint::sixDoFRigidBodyMotionConstraint
             word(sDoFRBMCDict.lookup("sixDoFRigidBodyMotionConstraint"))
           + "Coeffs"
         )
-    ),
-    tolerance_(readScalar(sDoFRBMCDict.lookup("tolerance"))),
-    relaxationFactor_
-    (
-        sDoFRBMCDict.lookupOrDefault<scalar>("relaxationFactor", 1)
     )
 {}
 
@@ -71,14 +67,6 @@ bool Foam::sixDoFRigidBodyMotionConstraint::read
     const dictionary& sDoFRBMCDict
 )
 {
-    tolerance_ = (readScalar(sDoFRBMCDict.lookup("tolerance")));
-
-    relaxationFactor_ = sDoFRBMCDict.lookupOrDefault<scalar>
-    (
-        "relaxationFactor",
-        1
-    );
-
     sDoFRBMCCoeffs_ = sDoFRBMCDict.subDict(type() + "Coeffs");
 
     return true;
@@ -86,12 +74,7 @@ bool Foam::sixDoFRigidBodyMotionConstraint::read
 
 
 void Foam::sixDoFRigidBodyMotionConstraint::write(Ostream& os) const
-{
-    os.writeKeyword("tolerance")
-        << tolerance_ << token::END_STATEMENT << nl;
+{}
 
-    os.writeKeyword("relaxationFactor")
-        << relaxationFactor_ << token::END_STATEMENT << nl;
-}
 
 // ************************************************************************* //
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint.H
similarity index 75%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint.H
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint.H
index b1f5438948cf5ad3bd255f1e403db4a28d4f90ad..b4eed214f9db1ad4eb8c883862f0127cc35c283d 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint.H
@@ -46,7 +46,7 @@ SourceFiles
 #include "Time.H"
 #include "dictionary.H"
 #include "autoPtr.H"
-#include "vector.H"
+#include "pointConstraint.H"
 #include "runTimeSelectionTables.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -69,16 +69,12 @@ protected:
 
     // Protected data
 
+        //- Name of the constraint
+        word name_;
+
         //- Constraint model specific coefficient dictionary
         dictionary sDoFRBMCCoeffs_;
 
-        //- Solution tolerance.  Meaning depends on model, usually an
-        //  absolute distance or angle.
-        scalar tolerance_;
-
-        //- Relaxation factor for solution, default to one
-        scalar relaxationFactor_;
-
 
 public:
 
@@ -93,8 +89,8 @@ public:
             autoPtr,
             sixDoFRigidBodyMotionConstraint,
             dictionary,
-            (const dictionary& sDoFRBMCDict),
-            (sDoFRBMCDict)
+            (const word& name, const dictionary& sDoFRBMCDict),
+            (name, sDoFRBMCDict)
         );
 
 
@@ -103,6 +99,7 @@ public:
         //- Construct from the sDoFRBMCDict dictionary and Time
         sixDoFRigidBodyMotionConstraint
         (
+            const word& name,
             const dictionary& sDoFRBMCDict
         );
 
@@ -115,6 +112,7 @@ public:
         //- Select constructed from the sDoFRBMCDict dictionary and Time
         static autoPtr<sixDoFRigidBodyMotionConstraint> New
         (
+            const word& name,
             const dictionary& sDoFRBMCDict
         );
 
@@ -125,19 +123,17 @@ public:
 
     // Member Functions
 
-        //- Calculate the constraint position, force and moment.
-        //  Global reference frame vectors.  Returns boolean stating
-        //  whether the constraint been converged to tolerance.
-        virtual bool constrain
-        (
-            const sixDoFRigidBodyMotion& motion,
-            const vector& existingConstraintForce,
-            const vector& existingConstraintMoment,
-            scalar deltaT,
-            vector& constraintPosition,
-            vector& constraintForceIncrement,
-            vector& constraintMomentIncrement
-        ) const = 0;
+        //- Return the name
+        const word& name() const
+        {
+            return name_;
+        }
+
+        //- Apply and accumulate translational constraints
+        virtual void constrainTranslation(pointConstraint&) const = 0;
+
+        //- Apply and accumulate rotational constraints
+        virtual void constrainRotation(pointConstraint&) const = 0;
 
         //- Update properties from given dictionary
         virtual bool read(const dictionary& sDoFRBMCDict);
@@ -150,18 +146,6 @@ public:
                 return sDoFRBMCCoeffs_;
             }
 
-            //- Return access to the tolerance
-            inline scalar tolerance() const
-            {
-                return tolerance_;
-            }
-
-            //- Return access to the relaxationFactor
-            inline scalar relaxationFactor() const
-            {
-                return relaxationFactor_;
-            }
-
         //- Write
         virtual void write(Ostream&) const;
 };
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraintNew.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraintNew.C
similarity index 89%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraintNew.C
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraintNew.C
index fa74999aa5d8d3ec9dd785422758ade35fba4de7..b6f3e8fb1f195cee52efe82a3e65f2e993a6c592 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraintNew.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/sixDoFRigidBodyMotionConstraint/sixDoFRigidBodyMotionConstraintNew.C
@@ -28,16 +28,17 @@ License
 // * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
 
 Foam::autoPtr<Foam::sixDoFRigidBodyMotionConstraint>
-Foam::sixDoFRigidBodyMotionConstraint::New(const dictionary& sDoFRBMCDict)
+Foam::sixDoFRigidBodyMotionConstraint::New
+(
+    const word& name,
+    const dictionary& sDoFRBMCDict
+)
 {
     const word constraintType
     (
         sDoFRBMCDict.lookup("sixDoFRigidBodyMotionConstraint")
     );
 
-    // Info<< "Selecting sixDoFRigidBodyMotionConstraint function "
-    //     << constraintType << endl;
-
     dictionaryConstructorTable::iterator cstrIter =
         dictionaryConstructorTablePtr_->find(constraintType);
 
@@ -56,7 +57,10 @@ Foam::sixDoFRigidBodyMotionConstraint::New(const dictionary& sDoFRBMCDict)
             << exit(FatalError);
     }
 
-    return autoPtr<sixDoFRigidBodyMotionConstraint>(cstrIter()(sDoFRBMCDict));
+    return autoPtr<sixDoFRigidBodyMotionConstraint>
+    (
+        cstrIter()(name, sDoFRBMCDict)
+    );
 }
 
 
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/linearAxialAngularSpring/linearAxialAngularSpring.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/linearAxialAngularSpring/linearAxialAngularSpring.C
similarity index 98%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/linearAxialAngularSpring/linearAxialAngularSpring.C
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/linearAxialAngularSpring/linearAxialAngularSpring.C
index 76805d60d47a8bf1772957292ca5a1a88ef9169a..3701dd8bf951461d88b77fbfce32fa001bfc0aea 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/linearAxialAngularSpring/linearAxialAngularSpring.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/linearAxialAngularSpring/linearAxialAngularSpring.C
@@ -51,10 +51,11 @@ namespace sixDoFRigidBodyMotionRestraints
 Foam::sixDoFRigidBodyMotionRestraints::linearAxialAngularSpring::
 linearAxialAngularSpring
 (
+    const word& name,
     const dictionary& sDoFRBMRDict
 )
 :
-    sixDoFRigidBodyMotionRestraint(sDoFRBMRDict),
+    sixDoFRigidBodyMotionRestraint(name, sDoFRBMRDict),
     refQ_(),
     axis_(),
     stiffness_(),
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/linearAxialAngularSpring/linearAxialAngularSpring.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/linearAxialAngularSpring/linearAxialAngularSpring.H
similarity index 99%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/linearAxialAngularSpring/linearAxialAngularSpring.H
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/linearAxialAngularSpring/linearAxialAngularSpring.H
index d7f8c5e2805bc572d86f902dade04204c4efd074..4a30e30c65c14d576a49e57a93118057630370fb 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/linearAxialAngularSpring/linearAxialAngularSpring.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/linearAxialAngularSpring/linearAxialAngularSpring.H
@@ -81,6 +81,7 @@ public:
         //- Construct from components
         linearAxialAngularSpring
         (
+            const word& name,
             const dictionary& sDoFRBMRDict
         );
 
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/linearSpring/linearSpring.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/linearSpring/linearSpring.C
similarity index 98%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/linearSpring/linearSpring.C
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/linearSpring/linearSpring.C
index c6b1c10ca063592136c08861faa11022d9006566..a9ed4ce7a3f413eaa936e88be8a6ceeb0c8970fa 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/linearSpring/linearSpring.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/linearSpring/linearSpring.C
@@ -49,10 +49,11 @@ namespace sixDoFRigidBodyMotionRestraints
 
 Foam::sixDoFRigidBodyMotionRestraints::linearSpring::linearSpring
 (
+    const word& name,
     const dictionary& sDoFRBMRDict
 )
 :
-    sixDoFRigidBodyMotionRestraint(sDoFRBMRDict),
+    sixDoFRigidBodyMotionRestraint(name, sDoFRBMRDict),
     anchor_(),
     refAttachmentPt_(),
     stiffness_(),
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/linearSpring/linearSpring.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/linearSpring/linearSpring.H
similarity index 99%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/linearSpring/linearSpring.H
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/linearSpring/linearSpring.H
index c0610d974b39d9843580e78c81c473206e6370cd..dbd12372c3a928556a1ccdc6760be3b0194b925b 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/linearSpring/linearSpring.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/linearSpring/linearSpring.H
@@ -84,6 +84,7 @@ public:
         //- Construct from components
         linearSpring
         (
+            const word& name,
             const dictionary& sDoFRBMRDict
         );
 
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint.C
similarity index 98%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint.C
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint.C
index b06c5baf465f9262ec34ae7d69934c60c3584b38..31c16f85acdcc2d3e3870aa8378697038371d0f4 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint.C
@@ -39,9 +39,11 @@ defineRunTimeSelectionTable(sixDoFRigidBodyMotionRestraint, dictionary);
 
 Foam::sixDoFRigidBodyMotionRestraint::sixDoFRigidBodyMotionRestraint
 (
+    const word& name,
     const dictionary& sDoFRBMRDict
 )
 :
+    name_(name),
     sDoFRBMRCoeffs_
     (
         sDoFRBMRDict.subDict
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint.H
similarity index 92%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint.H
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint.H
index d8bdf1469a3d60b404ce8ab0f25157002ec1723a..41216a0c2ba55a29eff5f340dd5d9155e647ff36 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint.H
@@ -69,6 +69,9 @@ protected:
 
     // Protected data
 
+        //- Name of the restraint
+        word name_;
+
         //- Restraint model specific coefficient dictionary
         dictionary sDoFRBMRCoeffs_;
 
@@ -86,8 +89,8 @@ public:
             autoPtr,
             sixDoFRigidBodyMotionRestraint,
             dictionary,
-            (const dictionary& sDoFRBMRDict),
-            (sDoFRBMRDict)
+            (const word& name, const dictionary& sDoFRBMRDict),
+            (name, sDoFRBMRDict)
         );
 
 
@@ -96,6 +99,7 @@ public:
         //- Construct from the sDoFRBMRDict dictionary and Time
         sixDoFRigidBodyMotionRestraint
         (
+            const word& name,
             const dictionary& sDoFRBMRDict
         );
 
@@ -108,6 +112,7 @@ public:
         //- Select constructed from the sDoFRBMRDict dictionary and Time
         static autoPtr<sixDoFRigidBodyMotionRestraint> New
         (
+            const word& name,
             const dictionary& sDoFRBMRDict
         );
 
@@ -118,6 +123,12 @@ public:
 
     // Member Functions
 
+        //- Return the name
+        const word& name() const
+        {
+            return name_;
+        }
+
         //- Calculate the restraint position, force and moment.
         //  Global reference frame vectors.
         virtual void restrain
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraintNew.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraintNew.C
similarity index 89%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraintNew.C
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraintNew.C
index 9361e0ab4df1c3b788435bb944d02d6ca50563da..1bb047a77d6d270f40a6fd121bbbee03c70099b5 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraintNew.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sixDoFRigidBodyMotionRestraint/sixDoFRigidBodyMotionRestraintNew.C
@@ -28,16 +28,17 @@ License
 // * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * //
 
 Foam::autoPtr<Foam::sixDoFRigidBodyMotionRestraint>
-Foam::sixDoFRigidBodyMotionRestraint::New(const dictionary& sDoFRBMRDict)
+Foam::sixDoFRigidBodyMotionRestraint::New
+(
+    const word& name,
+    const dictionary& sDoFRBMRDict
+)
 {
     const word restraintType
     (
         sDoFRBMRDict.lookup("sixDoFRigidBodyMotionRestraint")
     );
 
-    // Info<< "Selecting sixDoFRigidBodyMotionRestraint function "
-    //     << restraintType << endl;
-
     dictionaryConstructorTable::iterator cstrIter =
         dictionaryConstructorTablePtr_->find(restraintType);
 
@@ -56,7 +57,10 @@ Foam::sixDoFRigidBodyMotionRestraint::New(const dictionary& sDoFRBMRDict)
             << exit(FatalError);
     }
 
-    return autoPtr<sixDoFRigidBodyMotionRestraint>(cstrIter()(sDoFRBMRDict));
+    return autoPtr<sixDoFRigidBodyMotionRestraint>
+    (
+        cstrIter()(name, sDoFRBMRDict)
+    );
 }
 
 
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sphericalAngularSpring/sphericalAngularSpring.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sphericalAngularSpring/sphericalAngularSpring.C
similarity index 98%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sphericalAngularSpring/sphericalAngularSpring.C
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sphericalAngularSpring/sphericalAngularSpring.C
index dbb480b93aa692727e6ee5ca9b45cdc572809e0c..f3dab425d7c7351ae7c67c61faa73298e9991d5f 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sphericalAngularSpring/sphericalAngularSpring.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sphericalAngularSpring/sphericalAngularSpring.C
@@ -50,10 +50,11 @@ namespace sixDoFRigidBodyMotionRestraints
 Foam::sixDoFRigidBodyMotionRestraints::sphericalAngularSpring::
 sphericalAngularSpring
 (
+    const word& name,
     const dictionary& sDoFRBMRDict
 )
 :
-    sixDoFRigidBodyMotionRestraint(sDoFRBMRDict),
+    sixDoFRigidBodyMotionRestraint(name, sDoFRBMRDict),
     refQ_(),
     stiffness_(),
     damping_()
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sphericalAngularSpring/sphericalAngularSpring.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sphericalAngularSpring/sphericalAngularSpring.H
similarity index 99%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sphericalAngularSpring/sphericalAngularSpring.H
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sphericalAngularSpring/sphericalAngularSpring.H
index a36ef5d4ab104f3e1f2683184cd8496b73cb33f6..f1bfa784d371d1e78d0eb77890fd5c7736919da4 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/sphericalAngularSpring/sphericalAngularSpring.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/sphericalAngularSpring/sphericalAngularSpring.H
@@ -78,6 +78,7 @@ public:
         //- Construct from components
         sphericalAngularSpring
         (
+            const word& name,
             const dictionary& sDoFRBMRDict
         );
 
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/tabulatedAxialAngularSpring/tabulatedAxialAngularSpring.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/tabulatedAxialAngularSpring/tabulatedAxialAngularSpring.C
similarity index 98%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/tabulatedAxialAngularSpring/tabulatedAxialAngularSpring.C
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/tabulatedAxialAngularSpring/tabulatedAxialAngularSpring.C
index 252aa471f7958fab956c2887b1aa6e209e4537f0..037639dde8560abb21d27b0d3a9f0625db0f1fc9 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/tabulatedAxialAngularSpring/tabulatedAxialAngularSpring.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/tabulatedAxialAngularSpring/tabulatedAxialAngularSpring.C
@@ -52,10 +52,11 @@ namespace sixDoFRigidBodyMotionRestraints
 Foam::sixDoFRigidBodyMotionRestraints::tabulatedAxialAngularSpring::
 tabulatedAxialAngularSpring
 (
+    const word& name,
     const dictionary& sDoFRBMRDict
 )
 :
-    sixDoFRigidBodyMotionRestraint(sDoFRBMRDict),
+    sixDoFRigidBodyMotionRestraint(name, sDoFRBMRDict),
     refQ_(),
     axis_(),
     moment_(),
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/tabulatedAxialAngularSpring/tabulatedAxialAngularSpring.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/tabulatedAxialAngularSpring/tabulatedAxialAngularSpring.H
similarity index 99%
rename from src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/tabulatedAxialAngularSpring/tabulatedAxialAngularSpring.H
rename to src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/tabulatedAxialAngularSpring/tabulatedAxialAngularSpring.H
index bb45f00d519361353833a4cb02574ccac7219757..bcd2c2c5b3f05362479d26028d2b698bcbe3aba9 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionRestraint/tabulatedAxialAngularSpring/tabulatedAxialAngularSpring.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/tabulatedAxialAngularSpring/tabulatedAxialAngularSpring.H
@@ -88,6 +88,7 @@ public:
         //- Construct from components
         tabulatedAxialAngularSpring
         (
+            const word& name,
             const dictionary& sDoFRBMRDict
         );
 
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.C
index 6f002c5e2fec80cf2d5113c0de2b817a89db08b5..4ee39646d04e84826d3b93274ef9bda3ba36dd23 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.C
@@ -41,7 +41,7 @@ void Foam::sixDoFRigidBodyMotion::applyRestraints()
         {
             if (report_)
             {
-                Info<< "Restraint " << restraintNames_[rI] << ": ";
+                Info<< "Restraint " << restraints_[rI].name() << ": ";
             }
 
             // restraint position
@@ -65,101 +65,6 @@ void Foam::sixDoFRigidBodyMotion::applyRestraints()
 }
 
 
-void Foam::sixDoFRigidBodyMotion::applyConstraints(scalar deltaT)
-{
-    if (constraints_.empty())
-    {
-        return;
-    }
-
-    if (Pstream::master())
-    {
-        label iteration = 0;
-
-        bool allConverged = true;
-
-        // constraint force accumulator
-        vector cFA = vector::zero;
-
-        // constraint moment accumulator
-        vector cMA = vector::zero;
-
-        do
-        {
-            allConverged = true;
-
-            forAll(constraints_, cI)
-            {
-                if (sixDoFRigidBodyMotionConstraint::debug)
-                {
-                    Info<< "Constraint " << constraintNames_[cI] << ": ";
-                }
-
-                // constraint position
-                point cP = vector::zero;
-
-                // constraint force
-                vector cF = vector::zero;
-
-                // constraint moment
-                vector cM = vector::zero;
-
-                bool constraintConverged = constraints_[cI].constrain
-                (
-                    *this,
-                    cFA,
-                    cMA,
-                    deltaT,
-                    cP,
-                    cF,
-                    cM
-                );
-
-                allConverged = allConverged && constraintConverged;
-
-                // Accumulate constraint force
-                cFA += cF;
-
-                // Accumulate constraint moment
-                cMA += cM + ((cP - centreOfMass()) ^ cF);
-            }
-
-        } while(++iteration < maxConstraintIterations_ && !allConverged);
-
-        if (iteration >= maxConstraintIterations_)
-        {
-            FatalErrorIn
-            (
-                "Foam::sixDoFRigidBodyMotion::applyConstraints(scalar)"
-            )
-                << nl << "Maximum number of sixDoFRigidBodyMotion constraint "
-                << "iterations ("
-                << maxConstraintIterations_
-                << ") exceeded." << nl
-                << exit(FatalError);
-        }
-
-        Info<< "sixDoFRigidBodyMotion constraints converged in "
-            << iteration << " iterations" << endl;
-
-        if (report_)
-        {
-            Info<< "Constraint force: " << cFA << nl
-                << "Constraint moment: " << cMA
-                << endl;
-        }
-
-        // Add the constraint forces and moments to the motion state variables
-        a() += cFA/mass_;
-
-        // The moment of constraint forces has already been added
-        // during accumulation.  Moments are returned in global axes,
-        // transforming to body local
-        tau() += Q().T() & cMA;
-    }
-}
-
-
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion()
@@ -167,17 +72,16 @@ Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion()
     motionState_(),
     motionState0_(),
     restraints_(),
-    restraintNames_(),
     constraints_(),
-    constraintNames_(),
-    maxConstraintIterations_(0),
     initialCentreOfMass_(vector::zero),
     initialQ_(I),
     momentOfInertia_(diagTensor::one*VSMALL),
     mass_(VSMALL),
     aRelax_(1.0),
     aDamp_(1.0),
-    report_(false)
+    report_(false),
+    tConstraints_(tensor::I),
+    rConstraints_(tensor::I)
 {}
 
 
@@ -209,17 +113,16 @@ Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion
     ),
     motionState0_(motionState_),
     restraints_(),
-    restraintNames_(),
     constraints_(),
-    constraintNames_(),
-    maxConstraintIterations_(0),
     initialCentreOfMass_(initialCentreOfMass),
     initialQ_(initialQ),
     momentOfInertia_(momentOfInertia),
     mass_(mass),
     aRelax_(aRelax),
     aDamp_(aDamp),
-    report_(report)
+    report_(report),
+    tConstraints_(tensor::I),
+    rConstraints_(tensor::I)
 {}
 
 
@@ -232,10 +135,7 @@ Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion
     motionState_(stateDict),
     motionState0_(motionState_),
     restraints_(),
-    restraintNames_(),
     constraints_(),
-    constraintNames_(),
-    maxConstraintIterations_(0),
     initialCentreOfMass_
     (
         dict.lookupOrDefault
@@ -256,7 +156,9 @@ Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion
     mass_(readScalar(dict.lookup("mass"))),
     aRelax_(dict.lookupOrDefault<scalar>("accelerationRelaxation", 1.0)),
     aDamp_(dict.lookupOrDefault<scalar>("accelerationDamping", 1.0)),
-    report_(dict.lookupOrDefault<Switch>("report", false))
+    report_(dict.lookupOrDefault<Switch>("report", false)),
+    tConstraints_(tensor::I),
+    rConstraints_(tensor::I)
 {
     addRestraints(dict);
     addConstraints(dict);
@@ -271,10 +173,7 @@ Foam::sixDoFRigidBodyMotion::sixDoFRigidBodyMotion
     motionState_(sDoFRBM.motionState_),
     motionState0_(sDoFRBM.motionState0_),
     restraints_(sDoFRBM.restraints_),
-    restraintNames_(sDoFRBM.restraintNames_),
     constraints_(sDoFRBM.constraints_),
-    constraintNames_(sDoFRBM.constraintNames_),
-    maxConstraintIterations_(sDoFRBM.maxConstraintIterations_),
     initialCentreOfMass_(sDoFRBM.initialCentreOfMass_),
     initialQ_(sDoFRBM.initialQ_),
     momentOfInertia_(sDoFRBM.momentOfInertia_),
@@ -306,29 +205,23 @@ void Foam::sixDoFRigidBodyMotion::addRestraints
 
         restraints_.setSize(restraintDict.size());
 
-        restraintNames_.setSize(restraintDict.size());
-
         forAllConstIter(IDLList<entry>, restraintDict, iter)
         {
             if (iter().isDict())
             {
-                // Info<< "Adding restraint: " << iter().keyword() << endl;
-
                 restraints_.set
                 (
-                    i,
-                    sixDoFRigidBodyMotionRestraint::New(iter().dict())
+                    i++,
+                    sixDoFRigidBodyMotionRestraint::New
+                    (
+                        iter().keyword(),
+                        iter().dict()
+                    )
                 );
-
-                restraintNames_[i] = iter().keyword();
-
-                i++;
             }
         }
 
         restraints_.setSize(i);
-
-        restraintNames_.setSize(i);
     }
 }
 
@@ -346,21 +239,25 @@ void Foam::sixDoFRigidBodyMotion::addConstraints
 
         constraints_.setSize(constraintDict.size());
 
-        constraintNames_.setSize(constraintDict.size());
+        pointConstraint pct;
+        pointConstraint pcr;
 
         forAllConstIter(IDLList<entry>, constraintDict, iter)
         {
             if (iter().isDict())
             {
-                // Info<< "Adding constraint: " << iter().keyword() << endl;
-
                 constraints_.set
                 (
                     i,
-                    sixDoFRigidBodyMotionConstraint::New(iter().dict())
+                    sixDoFRigidBodyMotionConstraint::New
+                    (
+                        iter().keyword(),
+                        iter().dict()
+                    )
                 );
 
-                constraintNames_[i] = iter().keyword();
+                constraints_[i].constrainTranslation(pct);
+                constraints_[i].constrainRotation(pcr);
 
                 i++;
             }
@@ -368,15 +265,11 @@ void Foam::sixDoFRigidBodyMotion::addConstraints
 
         constraints_.setSize(i);
 
-        constraintNames_.setSize(i);
+        tConstraints_ = pct.constraintTransformation();
+        rConstraints_ = pcr.constraintTransformation();
 
-        if (!constraints_.empty())
-        {
-            maxConstraintIterations_ = readLabel
-            (
-                constraintDict.lookup("maxIterations")
-            );
-        }
+        Info<< "Translational constraint tensor " << tConstraints_ << nl
+            << "Rotational constraint tensor " << rConstraints_ << endl;
     }
 }
 
@@ -392,8 +285,8 @@ void Foam::sixDoFRigidBodyMotion::updatePosition
 
     if (Pstream::master())
     {
-        v() = v0() + aDamp_*0.5*deltaT0*a();
-        pi() = pi0() + aDamp_*0.5*deltaT0*tau();
+        v() = tConstraints_ & aDamp_*(v0() + 0.5*deltaT0*a());
+        pi() = rConstraints_ & aDamp_*(pi0() + 0.5*deltaT0*tau());
 
         // Leapfrog move part
         centreOfMass() = centreOfMass0() + deltaT*v();
@@ -401,7 +294,7 @@ void Foam::sixDoFRigidBodyMotion::updatePosition
         // Leapfrog orientation adjustment
         Tuple2<tensor, vector> Qpi = rotate(Q0(), pi(), deltaT);
         Q() = Qpi.first();
-        pi() = Qpi.second();
+        pi() = rConstraints_ & Qpi.second();
     }
 
     Pstream::scatter(motionState_);
@@ -439,12 +332,9 @@ void Foam::sixDoFRigidBodyMotion::updateAcceleration
         }
         first = false;
 
-        // Apply constraints after relaxation
-        applyConstraints(deltaT);
-
         // Correct velocities
-        v() += aDamp_*0.5*deltaT*a();
-        pi() += aDamp_*0.5*deltaT*tau();
+        v() += tConstraints_ & aDamp_*0.5*deltaT*a();
+        pi() += rConstraints_ & aDamp_*0.5*deltaT*tau();
 
         if (report_)
         {
@@ -463,8 +353,8 @@ void Foam::sixDoFRigidBodyMotion::updateVelocity(scalar deltaT)
 
     if (Pstream::master())
     {
-        v() += aDamp_*0.5*deltaT*a();
-        pi() += aDamp_*0.5*deltaT*tau();
+        v() += tConstraints_ & aDamp_*0.5*deltaT*a();
+        pi() += rConstraints_ & aDamp_*0.5*deltaT*tau();
 
         if (report_)
         {
@@ -532,7 +422,10 @@ Foam::vector Foam::sixDoFRigidBodyMotion::predictedOrientation
     vector piTemp = pi() + deltaT*(tau() + (Q().T() & deltaMoment));
     Tuple2<tensor, vector> QpiTemp = rotate(Q0(), piTemp, deltaT);
 
-    return (QpiTemp.first() & initialQ_.T() & vInitial);
+    vector o(QpiTemp.first() & initialQ_.T() & vInitial);
+    o /= mag(o);
+
+    return o;
 }
 
 
@@ -564,8 +457,6 @@ Foam::tmp<Foam::pointField> Foam::sixDoFRigidBodyMotion::scaledPosition
     const scalarField& scale
 ) const
 {
-    Info<< "initialCentreOfMass " << initialCentreOfMass() << endl;
-
     // Calculate the transformation septerion from the initial state
     septernion s
     (
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.H
index 670004ba693e0eba489e2d7204ee1d6e8cd37b0b..34e5016e11a2b710e536d29662e7cd5577d049a3 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion.H
@@ -90,22 +90,12 @@ class sixDoFRigidBodyMotion
         //- Motion state data object for previous time-step
         sixDoFRigidBodyMotionState motionState0_;
 
-        //- Restraints on the motion
+        //- Motion restraints
         PtrList<sixDoFRigidBodyMotionRestraint> restraints_;
 
-        //- Names of the restraints
-        wordList restraintNames_;
-
-        //- Constaints on the motion
+        //- Motion constaints
         PtrList<sixDoFRigidBodyMotionConstraint> constraints_;
 
-        //- Names of the constraints
-        wordList constraintNames_;
-
-        //- Maximum number of iterations allowed to attempt to obey
-        //  constraints
-        label maxConstraintIterations_;
-
         //- Centre of mass of initial state
         point initialCentreOfMass_;
 
@@ -128,6 +118,10 @@ class sixDoFRigidBodyMotion
         //- Switch to turn reporting of motion data on and off
         Switch report_;
 
+        tensor tConstraints_;
+
+        tensor rConstraints_;
+
 
     // Private Member Functions
 
@@ -155,9 +149,6 @@ class sixDoFRigidBodyMotion
         //- Apply the restraints to the object
         void applyRestraints();
 
-        //- Apply the constraints to the object
-        void applyConstraints(scalar deltaT);
-
 
         // Access functions retained as private because of the risk of
         // confusion over what is a body local frame vector and what is global
@@ -168,20 +159,10 @@ class sixDoFRigidBodyMotion
             inline const PtrList<sixDoFRigidBodyMotionRestraint>&
                 restraints() const;
 
-            //- Return access to the restraintNames
-            inline const wordList& restraintNames() const;
-
             //- Return access to the constraints
             inline const PtrList<sixDoFRigidBodyMotionConstraint>&
                 constraints() const;
 
-            //- Return access to the constraintNames
-            inline const wordList& constraintNames() const;
-
-            //- Return access to the maximum allowed number of
-            //  constraint iterations
-            inline label maxConstraintIterations() const;
-
             //- Return access to the initial centre of mass
             inline const point& initialCentreOfMass() const;
 
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionI.H b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionI.H
index f70ba68ced1cc79c20dcc26b009130d4734201b4..3186ca2fa1251f190104e49dcbfbb368e59df12d 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionI.H
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionI.H
@@ -111,12 +111,6 @@ Foam::sixDoFRigidBodyMotion::restraints() const
 }
 
 
-inline const Foam::wordList& Foam::sixDoFRigidBodyMotion::restraintNames() const
-{
-    return restraintNames_;
-}
-
-
 inline const Foam::PtrList<Foam::sixDoFRigidBodyMotionConstraint>&
 Foam::sixDoFRigidBodyMotion::constraints() const
 {
@@ -124,19 +118,6 @@ Foam::sixDoFRigidBodyMotion::constraints() const
 }
 
 
-inline const Foam::wordList&
-Foam::sixDoFRigidBodyMotion::constraintNames() const
-{
-    return constraintNames_;
-}
-
-
-inline Foam::label Foam::sixDoFRigidBodyMotion::maxConstraintIterations() const
-{
-    return maxConstraintIterations_;
-}
-
-
 inline const Foam::point&
 Foam::sixDoFRigidBodyMotion::initialCentreOfMass() const
 {
diff --git a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionIO.C b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionIO.C
index 99bdba3ef022f370b9c096ab7482db75b2ede074..11670ba6231ceb64a269a506cbbaaac5d2397d35 100644
--- a/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionIO.C
+++ b/src/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionIO.C
@@ -54,7 +54,7 @@ void Foam::sixDoFRigidBodyMotion::write(Ostream& os) const
         {
             word restraintType = restraints_[rI].type();
 
-            os  << indent << restraintNames_[rI] << nl
+            os  << indent << restraints_[rI].name() << nl
                 << indent << token::BEGIN_BLOCK << incrIndent << endl;
 
             os.writeKeyword("sixDoFRigidBodyMotionRestraint")
@@ -79,14 +79,11 @@ void Foam::sixDoFRigidBodyMotion::write(Ostream& os) const
         os  << indent << "constraints" << nl
             << indent << token::BEGIN_BLOCK << incrIndent << nl;
 
-        os.writeKeyword("maxIterations")
-            << maxConstraintIterations_ << token::END_STATEMENT << nl;
-
         forAll(constraints_, rI)
         {
             word constraintType = constraints_[rI].type();
 
-            os  << indent << constraintNames_[rI] << nl
+            os  << indent << constraints_[rI].name() << nl
                 << indent << token::BEGIN_BLOCK << incrIndent << endl;
 
             os.writeKeyword("sixDoFRigidBodyMotionConstraint")