diff -ur ../mbdyn-1.2/mbdyn/struct/vehj2.cc mbdyn/struct/vehj2.cc
--- ../mbdyn-1.2/mbdyn/struct/vehj2.cc	2006-01-18 17:30:03.000000000 +0100
+++ mbdyn/struct/vehj2.cc	2006-10-31 19:23:31.000000000 +0100
@@ -401,8 +401,10 @@
 	WM.Sub(1, 6 + 1, DTmp);
 	WM.Add(6 + 1, 6 + 1, DTmp);
 
+	Vec3 FTmp(F*dCoef);
+
 	/* delta g1 */
-	Mat3x3 MTmp(DTmp*Mat3x3(d1) - Mat3x3(F*dCoef));
+	Mat3x3 MTmp(DTmp*Mat3x3(d1) - Mat3x3(FTmp));
 	WM.Sub(1, 4, MTmp);
 	WM.Add(6 + 1, 4, MTmp);
 
@@ -421,7 +423,7 @@
 	WM.Sub(4, 6 + 1, MTmp);
 
 	/* delta g1 */
-	WM.Sub(4, 4, MTmp*Mat3x3(d1) - Mat3x3(f1.Cross(F*dCoef)));
+	WM.Sub(4, 4, MTmp*Mat3x3(d1) - Mat3x3(f1.Cross(FTmp)));
 
 	/* delta g2 */
 	WM.Add(4, 6 + 4, MTmp*Mat3x3(f2));
@@ -436,10 +438,10 @@
 	WM.Add(6 + 4, 6 + 1, MTmp);
 
 	/* delta g1 */
-	WM.Add(6 + 4, 4, MTmp*Mat3x3(d1) - Mat3x3(f2, F*dCoef));
+	WM.Add(6 + 4, 4, MTmp*Mat3x3(d1) - Mat3x3(f2, FTmp));
 
 	/* delta g2 */
-	WM.Sub(6 + 4, 6 + 4, MTmp*Mat3x3(f2) - Mat3x3(F*dCoef, f2));
+	WM.Sub(6 + 4, 6 + 4, MTmp*Mat3x3(f2) - Mat3x3(FTmp, f2));
 }
 
 /* assemblaggio residuo */
@@ -481,7 +483,8 @@
 		bFirstRes = false;
 
 	} else {
-		tilde_d = R1h.Transpose()*(pNode2->GetXCurr() + f2 - pNode1->GetXCurr() - f1);
+		tilde_d = R1h.Transpose()*(pNode2->GetXCurr() + f2
+			- pNode1->GetXCurr() - f1);
 
 		ConstitutiveLaw3DOwner::Update(tilde_d);
 	}
@@ -703,13 +706,13 @@
 
 	Mat3x3 MTmp(Mat3x3(f1)*FDEPrime);
 
-	WMB.Sub(4, 1, MTmp);
-	WMB.Add(4, 6 + 1, MTmp);
+	WMB.Add(4, 1, MTmp);
+	WMB.Sub(4, 6 + 1, MTmp);
 
 	MTmp = Mat3x3(f2)*FDEPrime;
 
-	WMB.Add(6 + 4, 1, MTmp);
-	WMB.Sub(6 + 4, 6 + 1, MTmp);
+	WMB.Sub(6 + 4, 1, MTmp);
+	WMB.Add(6 + 4, 6 + 1, MTmp);
 
 	/* F/dot{d} * [ ( w1 * dCoef ) x ] */
 	Mat3x3 CTmp = FDEPrime*Mat3x3(pNode1->GetWRef()*dCoef);
@@ -721,13 +724,13 @@
 
 	MTmp = Mat3x3(f1)*CTmp;
 
-	WMA.Add(4, 1, MTmp);
-	WMA.Sub(4, 6 + 1, MTmp);
+	WMA.Sub(4, 1, MTmp);
+	WMA.Add(4, 6 + 1, MTmp);
 
 	MTmp = Mat3x3(f2)*CTmp;
 
-	WMA.Sub(6 + 4, 1, MTmp);
-	WMA.Add(6 + 4, 6 + 1, MTmp);
+	WMA.Add(6 + 4, 1, MTmp);
+	WMA.Sub(6 + 4, 6 + 1, MTmp);
 
 	/* F/dot{d} * [ f2 x ] */
 	MTmp = FDEPrime*Mat3x3(f2);
@@ -748,17 +751,18 @@
 	WMB.Sub(4, 4, Mat3x3(f1)*MTmp);
 	WMB.Add(6 + 4, 4, Mat3x3(f2)*MTmp);
 
-	/* F/dot{d} * ( [ ( f2 x w2 ) x ] - [ w1 x ] [ f2 x ] ) * dCoef */
-	MTmp = FDEPrime*(Mat3x3(f2.Cross(pNode2->GetWCurr()*dCoef))
+	/* F/dot{d} * ( [ ( w2 x f2 ) x ] - [ w1 x ] [ f2 x ] ) * dCoef */
+	MTmp = FDEPrime*(Mat3x3((pNode2->GetWCurr()).Cross(f2*dCoef))
 			- Mat3x3(pNode1->GetWCurr(), f2*dCoef));
-	WMA.Sub(1, 6 + 4, MTmp);
-	WMA.Add(6 + 1, 6 + 4, MTmp);
+	WMA.Add(1, 6 + 4, MTmp);
+	WMA.Sub(6 + 1, 6 + 4, MTmp);
 
-	WMA.Sub(4, 6 + 4, Mat3x3(f1)*MTmp);
-	WMA.Add(6 + 4, 6 + 4, Mat3x3(f2)*MTmp);
+	WMA.Add(4, 6 + 4, Mat3x3(f1)*MTmp);
+	WMA.Sub(6 + 4, 6 + 4, Mat3x3(f2)*MTmp);
 
 	/* F/dot{d} * ( [ d1Prime x ] - [ w1 x ] [ d1 x ] ) * dCoef */
-	Vec3 d1Prime(pNode2->GetVCurr() - f2.Cross(pNode2->GetWCurr()) - pNode1->GetVCurr());
+	Vec3 d1Prime(pNode2->GetVCurr() + pNode2->GetWCurr().Cross(f2)
+		- pNode1->GetVCurr());
 	MTmp = FDEPrime*(Mat3x3(d1Prime) - Mat3x3(pNode1->GetWCurr(), d1));
 	WMB.Sub(1, 4, MTmp);
 	WMB.Add(6 + 1, 4, MTmp);
@@ -766,17 +770,18 @@
 	WMB.Sub(4, 6 + 4, Mat3x3(f1)*MTmp);
 	WMB.Add(6 + 4, 6 + 4, Mat3x3(f2)*MTmp);
 
+	Vec3 FTmp(F*dCoef);
+
 	/* - [ F x ] * dCoef */
-	MTmp = Mat3x3(F*dCoef);
+	MTmp = Mat3x3(FTmp);
 	WMA.Add(1, 4, MTmp);
 	WMA.Sub(6 + 1, 4, MTmp);
 
-	WMA.Add(4, 6 + 4, Mat3x3(f1)*MTmp);
-	WMA.Sub(6 + 4, 6 + 4, Mat3x3(f2)*MTmp);
+	WMA.Add(4, 4, Mat3x3(f1.Cross(FTmp)));
+	WMA.Sub(6 + 4, 4, Mat3x3(f2)*MTmp);
 
 	/* [ F x ] [ fi x ] * dCoef */
-	WMA.Sub(4, 4, Mat3x3(F*dCoef, f1));
-	WMA.Add(6 + 4, 6 + 4, Mat3x3(F*dCoef, f2));
+	WMA.Add(6 + 4, 6 + 4, Mat3x3(FTmp, f2));
 }
 
 /* assemblaggio residuo */
@@ -818,9 +823,13 @@
 		bFirstRes = false;
 
 	} else {
-		tilde_dPrime = R1h.Transpose()*(pNode2->GetVCurr() - pNode1->GetVCurr()
-				-f2.Cross(pNode2->GetWCurr())
-				- (pNode2->GetXCurr() + f2 - pNode1->GetXCurr()).Cross(pNode1->GetWCurr()));
+		Vec3 d1(pNode2->GetXCurr() + f2 - pNode1->GetXCurr());
+		Vec3 d1Prime(pNode2->GetVCurr()
+			+ pNode2->GetWCurr().Cross(f2)
+			- pNode1->GetVCurr());
+
+		tilde_dPrime = R1h.Transpose()*(d1Prime
+			- pNode1->GetWCurr().Cross(d1));
 
 		IncrementalUpdate(Zero3, tilde_dPrime);
 	}
@@ -1076,6 +1085,8 @@
 	Vec3 f1(pNode1->GetRRef()*tilde_f1);
 	Vec3 f2(pNode2->GetRRef()*tilde_f2);
 	Vec3 d1(pNode2->GetXCurr() + f2 - pNode1->GetXCurr());
+	Vec3 d1Prime(pNode2->GetVCurr() + pNode2->GetWCurr().Cross(f2)
+		- pNode1->GetVCurr());
  
 	/* F/d */
 	Mat3x3 DTmp(FDE*dCoef);
@@ -1083,12 +1094,12 @@
 	/* Force equations */
 
 	/* delta x1 */
-	WMA.Sub(1, 1, DTmp);
-	WMA.Add(6 + 1, 1, DTmp);
+	WMA.Add(1, 1, DTmp);
+	WMA.Sub(6 + 1, 1, DTmp);
 
 	/* delta x2 */
-	WMA.Add(1, 6 + 1, DTmp);
-	WMA.Sub(6 + 1, 6 + 1, DTmp);
+	WMA.Sub(1, 6 + 1, DTmp);
+	WMA.Add(6 + 1, 6 + 1, DTmp);
 
 	/* delta g1 */
 	Mat3x3 MTmp(DTmp*Mat3x3(d1));
@@ -1104,10 +1115,10 @@
 	MTmp = Mat3x3(f1)*DTmp;
 
 	/* delta x1 */
-	WMA.Sub(4, 1, MTmp);
+	WMA.Add(4, 1, MTmp);
 
 	/* delta x2 */
-	WMA.Add(4, 6 + 1, MTmp);
+	WMA.Sub(4, 6 + 1, MTmp);
 
 	/* delta g1 */
 	WMA.Sub(4, 4, MTmp*Mat3x3(d1));
@@ -1138,13 +1149,13 @@
 
 	MTmp = Mat3x3(f1)*FDEPrime;
 
-	WMB.Sub(4, 1, MTmp);
-	WMB.Add(4, 6 + 1, MTmp);
+	WMB.Add(4, 1, MTmp);
+	WMB.Sub(4, 6 + 1, MTmp);
 
 	MTmp = Mat3x3(f2)*FDEPrime;
 
-	WMB.Add(6 + 4, 1, MTmp);
-	WMB.Sub(6 + 4, 6 + 1, MTmp);
+	WMB.Sub(6 + 4, 1, MTmp);
+	WMB.Add(6 + 4, 6 + 1, MTmp);
 
 	/* F/dot{d} * [ ( w1 * dCoef ) x ] */
 	Mat3x3 CTmp = FDEPrime*Mat3x3(pNode1->GetWRef()*dCoef);
@@ -1156,13 +1167,13 @@
 
 	MTmp = Mat3x3(f1)*CTmp;
 
-	WMA.Add(4, 1, MTmp);
-	WMA.Sub(4, 6 + 1, MTmp);
+	WMA.Sub(4, 1, MTmp);
+	WMA.Add(4, 6 + 1, MTmp);
 
 	MTmp = Mat3x3(f2)*CTmp;
 
-	WMA.Sub(6 + 4, 1, MTmp);
-	WMA.Add(6 + 4, 6 + 1, MTmp);
+	WMA.Add(6 + 4, 1, MTmp);
+	WMA.Sub(6 + 4, 6 + 1, MTmp);
 
 	/* F/dot{d} * [ f2 x ] */
 	MTmp = FDEPrime*Mat3x3(f2);
@@ -1182,35 +1193,35 @@
 	WMB.Sub(4, 4, Mat3x3(f1)*MTmp);
 	WMB.Add(6 + 4, 4, Mat3x3(f2)*MTmp);
 
-	/* F/dot{d} * ( [ ( f2 x w2 ) x ] - [ w1 x ] [ f2 x ] ) * dCoef */
-	MTmp = FDEPrime*(Mat3x3(f2.Cross(pNode2->GetWCurr()*dCoef))
-			- Mat3x3(pNode1->GetWCurr(), f2*dCoef));
-	WMA.Sub(1, 6 + 4, MTmp);
-	WMA.Add(6 + 1, 6 + 4, MTmp);
+	/* F/dot{d} * ( [ ( w2 x f2 ) x ] - [ w1 x ] [ f2 x ] ) * dCoef */
+	MTmp = FDEPrime*(Mat3x3(pNode2->GetWCurr().Cross(f2*dCoef))
+		- Mat3x3(pNode1->GetWCurr(), f2*dCoef));
+	WMA.Add(1, 6 + 4, MTmp);
+	WMA.Sub(6 + 1, 6 + 4, MTmp);
 
-	WMA.Sub(4, 6 + 4, Mat3x3(f1)*MTmp);
-	WMA.Add(6 + 4, 6 + 4, Mat3x3(f2)*MTmp);
+	WMA.Add(4, 6 + 4, Mat3x3(f1)*MTmp);
+	WMA.Sub(6 + 4, 6 + 4, Mat3x3(f2)*MTmp);
 
 	/* F/dot{d} * ( [ d1Prime x ] - [ w1 x ] [ d1 x ] ) * dCoef */
-	Vec3 d1Prime(pNode2->GetVCurr() - f2.Cross(pNode2->GetWCurr()) - pNode1->GetVCurr());
-	MTmp = FDEPrime*(Mat3x3(d1Prime) - Mat3x3(pNode1->GetWCurr(), d1));
-	WMB.Sub(1, 4, MTmp);
-	WMB.Add(6 + 1, 4, MTmp);
+	MTmp = FDEPrime*(Mat3x3(d1Prime*dCoef) - Mat3x3(pNode1->GetWCurr(), d1*dCoef));
+	WMA.Sub(1, 4, MTmp);
+	WMA.Add(6 + 1, 4, MTmp);
 
-	WMB.Sub(4, 6 + 4, Mat3x3(f1)*MTmp);
-	WMB.Add(6 + 4, 6 + 4, Mat3x3(f2)*MTmp);
+	WMA.Sub(4, 6 + 4, Mat3x3(f1)*MTmp);
+	WMA.Add(6 + 4, 6 + 4, Mat3x3(f2)*MTmp);
+
+	Vec3 FTmp(F*dCoef);
 
 	/* - [ F x ] * dCoef */
-	MTmp = Mat3x3(F*dCoef);
+	MTmp = Mat3x3(FTmp);
 	WMA.Add(1, 4, MTmp);
 	WMA.Sub(6 + 1, 4, MTmp);
 
-	WMA.Add(4, 6 + 4, Mat3x3(f1)*MTmp);
-	WMA.Sub(6 + 4, 6 + 4, Mat3x3(f2)*MTmp);
+	WMA.Add(4, 4, Mat3x3(f1.Cross(FTmp)));
+	WMA.Sub(6 + 4, 4, Mat3x3(f2)*MTmp);
 
 	/* [ F x ] [ fi x ] * dCoef */
-	WMA.Sub(4, 4, Mat3x3(F*dCoef, f1));
-	WMA.Add(6 + 4, 6 + 4, Mat3x3(F*dCoef, f2));
+	WMA.Add(6 + 4, 6 + 4, Mat3x3(FTmp, f2));
 }
 
 /* assemblaggio residuo */
@@ -1252,10 +1263,13 @@
 		bFirstRes = false;
 
 	} else {
-		tilde_d = R1h.Transpose()*(pNode2->GetXCurr() + f2 - pNode1->GetXCurr() - f1);
-		tilde_dPrime = R1h.Transpose()*(pNode2->GetVCurr() - pNode1->GetVCurr()
-				-f2.Cross(pNode2->GetWCurr())
-				- (pNode2->GetXCurr() + f2 - pNode1->GetXCurr()).Cross(pNode1->GetWCurr()));
+		Mat3x3 R1hT(R1h.Transpose());
+		Vec3 d1(pNode2->GetXCurr() + f2 - pNode1->GetXCurr());
+		Vec3 d1Prime(pNode2->GetVCurr() - f2.Cross(pNode2->GetWCurr())
+				- pNode1->GetVCurr());
+
+		tilde_d = R1hT*(d1 - f1);
+		tilde_dPrime = R1hT*(d1Prime - d1.Cross(pNode1->GetWCurr()));
 
 		ConstitutiveLaw3DOwner::Update(tilde_d, tilde_dPrime);
 	}
@@ -1275,11 +1289,12 @@
 	Mat3x3 R1hT(R1h.Transpose());
 	Vec3 f1(pNode1->GetRCurr()*tilde_f1);
 	Vec3 f2(pNode2->GetRCurr()*tilde_f2);
-
-	tilde_d = R1hT*(pNode2->GetXCurr() + f2 - pNode1->GetXCurr() - f1);
-	tilde_dPrime = R1h.Transpose()*(pNode2->GetVCurr() - pNode1->GetVCurr()
-			-f2.Cross(pNode2->GetWCurr())
-			- (pNode2->GetXCurr() + f2 - pNode1->GetXCurr()).Cross(pNode1->GetWCurr()));
+	Vec3 d1(pNode2->GetXCurr() + f2 - pNode1->GetXCurr());
+	Vec3 d1Prime(pNode2->GetVCurr() - f2.Cross(pNode2->GetWCurr())
+			- pNode1->GetVCurr());
+	
+	tilde_d = R1hT*(d1 - f1);
+	tilde_dPrime = R1hT*(d1Prime - d1.Cross(pNode1->GetWCurr()));
 
 	ConstitutiveLaw3DOwner::Update(tilde_d, tilde_dPrime);
 
diff -ur ../mbdyn-1.2/mbdyn/struct/vehj.cc mbdyn/struct/vehj.cc
--- ../mbdyn-1.2/mbdyn/struct/vehj.cc	2006-01-18 17:30:03.000000000 +0100
+++ mbdyn/struct/vehj.cc	2006-10-31 21:20:04.000000000 +0100
@@ -89,11 +89,13 @@
 DeformableHingeJoint::Output(OutputHandler& OH) const
 {
 	if (fToBeOutput()) {
-		Vec3 d(MatR2EulerAngles(pNode1->GetRCurr().Transpose()
-					*pNode2->GetRCurr())*dRaDegr);
+		Mat3x3 R1 = pNode1->GetRCurr()*tilde_R1h;
+		Mat3x3 R2 = pNode2->GetRCurr()*tilde_R2h;
+
+		Vec3 d(MatR2EulerAngles(R1.Transpose()*R2)*dRaDegr);
 		Vec3 v(GetF());
 		Joint::Output(OH.Joints(), "DeformableHinge", GetLabel(),
-			Zero3, v, Zero3, pNode1->GetRCurr()*v)
+			Zero3, v, Zero3, R1*v)
 			<< " " << d << std::endl;
 	}
 }
@@ -951,12 +953,13 @@
 	Mat3x3 R1h(pNode1->GetRRef()*tilde_R1h);
 	Vec3 W2(pNode1->GetWRef());
 
-	WMB.Add(4, 4, FDEPrime);
-	WMB.Sub(1, 4, FDEPrime);
 	WMB.Add(1, 1, FDEPrime);
+	WMB.Sub(1, 4, FDEPrime);
 	WMB.Sub(4, 1, FDEPrime);
+	WMB.Add(4, 4, FDEPrime);
 
-	Mat3x3 Tmp(FDE*dCoef - FDEPrime*Mat3x3(W2*dCoef));
+	Mat3x3 Tmp(FDE*dCoef);
+	Tmp -= FDEPrime*Mat3x3(W2*dCoef);
 	WMA.Add(4, 4, Tmp);
 	WMA.Sub(1, 4, Tmp);
 
@@ -997,11 +1000,8 @@
 		Mat3x3 R1hT(R1h.Transpose());
 		Mat3x3 R2h(pNode2->GetRCurr()*tilde_R2h);
 
-		Vec3 W1(pNode1->GetWCurr());
-		Vec3 W2(pNode2->GetWCurr());
-
 		tilde_ThetaCurr = RotManip::VecRot(R1hT*R2h);
-		tilde_Omega = R1hT*(W2 - W1);
+		tilde_Omega = R1hT*(pNode2->GetWCurr() - pNode1->GetWCurr());
 
 		ConstitutiveLaw3DOwner::Update(tilde_ThetaCurr, tilde_Omega);
 	}

