Index: /issm/trunk-jpl/src/c/Container/Elements.cpp
===================================================================
--- /issm/trunk-jpl/src/c/Container/Elements.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/Container/Elements.cpp	(revision 14951)
@@ -19,4 +19,8 @@
 #include "../shared/shared.h"
 #include "../EnumDefinitions/EnumDefinitions.h"
+#include "../classes/objects/Elements/Element.h"
+#include "../classes/objects/ExternalResults/GenericExternalResult.h"
+#include "../classes/Patch.h"
+#include "../classes/toolkits/Vector.h"
 
 using namespace std;
Index: /issm/trunk-jpl/src/c/Container/Inputs.cpp
===================================================================
--- /issm/trunk-jpl/src/c/Container/Inputs.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/Container/Inputs.cpp	(revision 14951)
@@ -19,4 +19,5 @@
 #include "../shared/shared.h"
 #include "../EnumDefinitions/EnumDefinitions.h"
+#include "../classes/objects/Inputs/Input.h"
 
 using namespace std;
Index: /issm/trunk-jpl/src/c/Container/Inputs.h
===================================================================
--- /issm/trunk-jpl/src/c/Container/Inputs.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/Container/Inputs.h	(revision 14951)
@@ -3,15 +3,7 @@
 
 /*forward declarations */
-class Materials;
 class Parameters;
-class Elements;
-class Vertices;
-class Loads;
-class Nodes;
 class DataSet;
 class Input;
-class Node;
-class GaussTria;
-class GaussPenta;
 #include "../shared/Numerics/types.h"
 
Index: /issm/trunk-jpl/src/c/Container/Loads.cpp
===================================================================
--- /issm/trunk-jpl/src/c/Container/Loads.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/Container/Loads.cpp	(revision 14951)
@@ -19,4 +19,5 @@
 #include "../shared/shared.h"
 #include "../EnumDefinitions/EnumDefinitions.h"
+#include "../classes/objects/Loads/Load.h"
 
 using namespace std;
Index: /issm/trunk-jpl/src/c/Container/Materials.cpp
===================================================================
--- /issm/trunk-jpl/src/c/Container/Materials.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/Container/Materials.cpp	(revision 14951)
@@ -19,4 +19,5 @@
 #include "../shared/shared.h"
 #include "../EnumDefinitions/EnumDefinitions.h"
+#include "../classes/objects/Materials/Material.h"
 
 using namespace std;
Index: /issm/trunk-jpl/src/c/Container/Nodes.cpp
===================================================================
--- /issm/trunk-jpl/src/c/Container/Nodes.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/Container/Nodes.cpp	(revision 14951)
@@ -19,4 +19,5 @@
 #include "../shared/shared.h"
 #include "../EnumDefinitions/EnumDefinitions.h"
+#include "../classes/objects/Node.h"
 
 using namespace std;
Index: /issm/trunk-jpl/src/c/Container/Parameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/Container/Parameters.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/Container/Parameters.cpp	(revision 14951)
@@ -19,4 +19,5 @@
 #include "../shared/shared.h"
 #include "../EnumDefinitions/EnumDefinitions.h"
+#include "../classes/objects/objects.h"
 
 using namespace std;
Index: /issm/trunk-jpl/src/c/Container/Results.cpp
===================================================================
--- /issm/trunk-jpl/src/c/Container/Results.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/Container/Results.cpp	(revision 14951)
@@ -19,4 +19,6 @@
 #include "../shared/shared.h"
 #include "../EnumDefinitions/EnumDefinitions.h"
+#include "../classes/objects/ExternalResults/ExternalResult.h"
+#include "../classes/objects/ElementResults/ElementResult.h"
 
 using namespace std;
Index: /issm/trunk-jpl/src/c/Container/Vertices.cpp
===================================================================
--- /issm/trunk-jpl/src/c/Container/Vertices.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/Container/Vertices.cpp	(revision 14951)
@@ -19,4 +19,5 @@
 #include "../shared/shared.h"
 #include "../EnumDefinitions/EnumDefinitions.h"
+#include "../classes/objects/Vertex.h"
 
 using namespace std;
Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 14950)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 14951)
@@ -216,8 +216,4 @@
 					./shared/Elements/Paterson.cpp\
 					./shared/Elements/Arrhenius.cpp\
-					./shared/Elements/GetVerticesCoordinates.cpp\
-					./shared/Elements/GetLocalDofList.cpp\
-					./shared/Elements/GetGlobalDofList.cpp\
-					./shared/Elements/GetNumberOfDofs.cpp\
 					./shared/Elements/PrintArrays.cpp\
 					./shared/Elements/PddSurfaceMassBalance.cpp\
@@ -487,9 +483,4 @@
 					      ./modules/ModelProcessorx/DiagnosticHutter/CreateConstraintsDiagnosticHutter.cpp \
 					      ./modules/ModelProcessorx/DiagnosticHutter/CreateLoadsDiagnosticHutter.cpp \
-						  ./shared/Elements/CoordinateSystemTransform.cpp\
-						  ./shared/Elements/TransformLoadVectorCoord.cpp \
-						  ./shared/Elements/TransformStiffnessMatrixCoord.cpp \
-						  ./shared/Elements/TransformInvStiffnessMatrixCoord.cpp \
-						  ./shared/Elements/TransformSolutionCoord.cpp\
 						  ./solutions/diagnostic_core.cpp\
 						  ./solvers/solver_stokescoupling_nonlinear.cpp
Index: /issm/trunk-jpl/src/c/classes/objects/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Elements/Element.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Elements/Element.h	(revision 14951)
@@ -11,4 +11,5 @@
 /*{{{*/
 #include "../Object.h"
+#include "../../Update.h"
 
 class DataSet;
Index: /issm/trunk-jpl/src/c/classes/objects/Elements/PentaRef.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Elements/PentaRef.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Elements/PentaRef.h	(revision 14951)
@@ -7,4 +7,5 @@
 #define _PENTAREF_H_
 
+class GaussPenta;
 class PentaRef{
 
Index: /issm/trunk-jpl/src/c/classes/objects/Inputs/BoolInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Inputs/BoolInput.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Inputs/BoolInput.h	(revision 14951)
@@ -10,4 +10,5 @@
 #include "./Input.h"
 class GaussTria;
+class GaussPenta;
 /*}}}*/
 
Index: /issm/trunk-jpl/src/c/classes/objects/Inputs/ControlInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Inputs/ControlInput.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Inputs/ControlInput.h	(revision 14951)
@@ -10,4 +10,5 @@
 #include "./Input.h"
 class GaussTria;
+class GaussPenta;
 /*}}}*/
 
Index: /issm/trunk-jpl/src/c/classes/objects/Inputs/DatasetInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Inputs/DatasetInput.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Inputs/DatasetInput.h	(revision 14951)
@@ -10,4 +10,5 @@
 #include "./Input.h"
 class GaussTria;
+class GaussPenta;
 /*}}}*/
 
Index: /issm/trunk-jpl/src/c/classes/objects/Inputs/DoubleInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Inputs/DoubleInput.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Inputs/DoubleInput.h	(revision 14951)
@@ -10,4 +10,5 @@
 #include "./Input.h"
 class GaussTria;
+class GaussPenta;
 /*}}}*/
 
Index: /issm/trunk-jpl/src/c/classes/objects/Inputs/Input.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Inputs/Input.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Inputs/Input.h	(revision 14951)
@@ -13,4 +13,5 @@
 class GaussTria;
 class Parameters;
+class GaussPenta;
 /*}}}*/
 
Index: /issm/trunk-jpl/src/c/classes/objects/Inputs/IntInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Inputs/IntInput.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Inputs/IntInput.h	(revision 14951)
@@ -10,4 +10,5 @@
 #include "./Input.h"
 class GaussTria;
+class GaussPenta;
 /*}}}*/
 
Index: /issm/trunk-jpl/src/c/classes/objects/Inputs/PentaP1Input.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Inputs/PentaP1Input.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Inputs/PentaP1Input.h	(revision 14951)
@@ -11,4 +11,5 @@
 #include "../Elements/PentaRef.h"
 class GaussTria;
+class GaussPenta;
 /*}}}*/
 
Index: /issm/trunk-jpl/src/c/classes/objects/Inputs/TransientInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Inputs/TransientInput.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Inputs/TransientInput.h	(revision 14951)
@@ -11,4 +11,5 @@
 class GaussTria;
 class Parameters;
+class GaussPenta;
 /*}}}*/
 
Index: /issm/trunk-jpl/src/c/classes/objects/Inputs/TriaP1Input.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Inputs/TriaP1Input.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Inputs/TriaP1Input.h	(revision 14951)
@@ -11,4 +11,5 @@
 #include "../Elements/TriaRef.h"
 class GaussTria;
+class GaussPenta;
 /*}}}*/
 
Index: /issm/trunk-jpl/src/c/classes/objects/Loads/Friction.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Loads/Friction.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Loads/Friction.h	(revision 14951)
@@ -10,4 +10,6 @@
 class Inputs;
 class Matpar;
+class GaussPenta;
+class GaussTria;
 /*}}}*/
 
Index: /issm/trunk-jpl/src/c/classes/objects/Loads/Load.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Loads/Load.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Loads/Load.h	(revision 14951)
@@ -15,4 +15,5 @@
 
 #include "../Object.h"
+#include "../../Update.h"
 #include "../../../toolkits/toolkits.h"
 #include "../../../Container/Container.h"
Index: /issm/trunk-jpl/src/c/classes/objects/Materials/Material.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Materials/Material.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Materials/Material.h	(revision 14951)
@@ -10,4 +10,5 @@
 class Object;
 #include "../Object.h"
+#include "../../Update.h"
 #include "../../../toolkits/toolkits.h"
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/objects/Node.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Node.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Node.cpp	(revision 14951)
@@ -955,2 +955,387 @@
 }
 /*}}}*/
+
+
+/*Methods inherent to Node: */
+int* GetLocalDofList(Node** nodes,int numnodes,int setenum,int approximation){ /*{{{*/
+
+	int  i,j,count,numdof,numgdof;
+	int* ndof_list=NULL;
+	int* ngdof_list_cumulative=NULL;
+	int *doflist = NULL;
+
+	if(numnodes){
+		/*allocate: */
+		ndof_list=xNew<int>(numnodes);
+		ngdof_list_cumulative=xNew<int>(numnodes);
+
+		/*Get number of dofs per node, and total for this given set*/
+		numdof=0;
+		numgdof=0;
+		for(i=0;i<numnodes;i++){
+
+			/*Cumulative list= number of dofs before node i*/
+			ngdof_list_cumulative[i]=numgdof;
+
+			/*Number of dofs for node i for given set and for the g set*/
+			ndof_list[i]=nodes[i]->GetNumberOfDofs(approximation,setenum);
+			numgdof    +=nodes[i]->GetNumberOfDofs(approximation,GsetEnum);
+			numdof     +=ndof_list[i];
+		}
+
+		if(numdof){
+			/*Allocate: */
+			doflist=xNew<int>(numdof);
+
+			/*Populate: */
+			count=0;
+			for(i=0;i<numnodes;i++){
+				nodes[i]->GetLocalDofList(&doflist[count],approximation,setenum);
+				count+=ndof_list[i];
+			}
+
+			/*We now have something like: [0 1 0 2 1 2]. Offset by gsize, to get something like: [0 1 2 4 6 7]:*/
+			count=0;
+			for(i=0;i<numnodes;i++){
+				for(j=0;j<ndof_list[i];j++){
+					doflist[count+j]+=ngdof_list_cumulative[i];
+				}
+				count+=ndof_list[i];
+			}
+		}
+		else doflist=NULL;
+	}
+
+	/*Free ressources:*/
+	xDelete<int>(ndof_list);
+	xDelete<int>(ngdof_list_cumulative);
+
+	/*CLean-up and return*/
+	return doflist;
+}
+/*}}}*/
+int* GetGlobalDofList(Node** nodes,int numnodes,int setenum,int approximation){/*{{{*/
+
+
+	int  i,numdof,count;
+	int* ndof_list=NULL;
+	int *doflist = NULL;
+
+	if(numnodes){
+
+		/*Allocate:*/
+		ndof_list=xNew<int>(numnodes);
+
+		/*First, figure out size of doflist: */
+		numdof=0;
+		for(i=0;i<numnodes;i++){
+			ndof_list[i]=nodes[i]->GetNumberOfDofs(approximation,setenum);
+			numdof+=ndof_list[i];
+		}
+
+		if(numdof){
+			/*Allocate: */
+			doflist=xNew<int>(numdof);
+
+			/*Populate: */
+			count=0;
+			for(i=0;i<numnodes;i++){
+				nodes[i]->GetDofList(&doflist[count],approximation,setenum);
+				count+=ndof_list[i];
+			}
+		}
+		else doflist=NULL;
+	}
+	/*Free ressources:*/
+	xDelete<int>(ndof_list);
+
+	return doflist;
+}
+/*}}}*/
+int GetNumberOfDofs(Node** nodes,int numnodes,int setenum,int approximation){/*{{{*/
+
+
+	/*output: */
+	int numberofdofs=0;
+
+	for(int i=0;i<numnodes;i++){
+		numberofdofs+=nodes[i]->GetNumberOfDofs(approximation,setenum);
+	}
+
+	return numberofdofs;
+}
+/*}}}*/
+#ifdef _HAVE_DIAGNOSTIC_
+void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum){/*{{{*/
+
+
+	int* cs_array=NULL;
+
+	/*All nodes have the same Coordinate System*/
+	cs_array=xNew<int>(numnodes);
+	for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;
+
+	/*Call core*/
+	TransformInvStiffnessMatrixCoord(Ke,nodes,numnodes,cs_array);
+
+	/*Clean-up*/
+	xDelete<int>(cs_array);
+}
+/*}}}*/
+void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array){/*{{{*/
+
+
+	int     i,j;
+	int     numdofs   = 0;
+	IssmDouble *transform = NULL;
+	IssmDouble *values    = NULL;
+
+	/*Get total number of dofs*/
+	for(i=0;i<numnodes;i++){
+		switch(cs_array[i]){
+			case XYEnum:   numdofs+=2; break;
+			case XYZPEnum: numdofs+=4; break;
+			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
+		}
+	}
+
+	/*Copy current stiffness matrix*/
+	values=xNew<IssmDouble>(Ke->nrows*Ke->ncols);
+	for(i=0;i<Ke->nrows;i++) for(j=0;j<Ke->ncols;j++) values[i*Ke->ncols+j]=Ke->values[i*Ke->ncols+j];
+
+	/*Get Coordinate Systems transform matrix*/
+	CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);
+
+	/*Transform matrix: R*Ke*R^T */
+	TripleMultiply(transform,numdofs,numdofs,0,
+				values,Ke->nrows,Ke->ncols,0,
+				transform,numdofs,numdofs,1,
+				&Ke->values[0],0);
+
+	/*Free Matrix*/
+	xDelete<IssmDouble>(transform);
+	xDelete<IssmDouble>(values);
+}
+/*}}}*/
+void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum){/*{{{*/
+
+	int* cs_array=NULL;
+
+	/*All nodes have the same Coordinate System*/
+	cs_array=xNew<int>(numnodes);
+	for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;
+
+	/*Call core*/
+	TransformLoadVectorCoord(pe,nodes,numnodes,cs_array);
+
+	/*Clean-up*/
+	xDelete<int>(cs_array);
+}
+/*}}}*/
+void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array){/*{{{*/
+
+
+	int     i;
+	int     numdofs   = 0;
+	IssmDouble *transform = NULL;
+	IssmDouble *values    = NULL;
+
+	/*Get total number of dofs*/
+	for(i=0;i<numnodes;i++){
+		switch(cs_array[i]){
+			case XYEnum:   numdofs+=2; break;
+			case XYZPEnum: numdofs+=4; break;
+			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
+		}
+	}
+
+	/*Copy current load vector*/
+	values=xNew<IssmDouble>(pe->nrows);
+	for(i=0;i<pe->nrows;i++) values[i]=pe->values[i];
+
+	/*Get Coordinate Systems transform matrix*/
+	CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);
+
+	/*Transform matrix: R^T*pe */
+	MatrixMultiply(transform,numdofs,numdofs,1,
+				values,pe->nrows,1,0,
+				&pe->values[0],0);
+
+	/*Free Matrices*/
+	xDelete<IssmDouble>(transform);
+	xDelete<IssmDouble>(values);
+}
+/*}}}*/
+void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int cs_enum){/*{{{*/
+
+
+	int* cs_array=NULL;
+
+	/*All nodes have the same Coordinate System*/
+	cs_array=xNew<int>(numnodes);
+	for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;
+
+	/*Call core*/
+	TransformSolutionCoord(solution,nodes,numnodes,cs_array);
+
+	/*Clean-up*/
+	xDelete<int>(cs_array);
+}
+/*}}}*/
+void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int* cs_array){/*{{{*/
+
+
+	int     i;
+	int     numdofs   = 0;
+	IssmDouble *transform = NULL;
+	IssmDouble *values    = NULL;
+
+	/*Get total number of dofs*/
+	for(i=0;i<numnodes;i++){
+		switch(cs_array[i]){
+			case XYEnum:   numdofs+=2; break;
+			case XYZPEnum: numdofs+=4; break;
+			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
+		}
+	}
+
+	/*Copy current solution vector*/
+	values=xNew<IssmDouble>(numdofs);
+	for(i=0;i<numdofs;i++) values[i]=solution[i];
+
+	/*Get Coordinate Systems transform matrix*/
+	CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);
+
+	/*Transform matrix: R*U */
+	MatrixMultiply(transform,numdofs,numdofs,0,
+				values,numdofs,1,0,
+				&solution[0],0);
+
+	/*Free Matrices*/
+	xDelete<IssmDouble>(transform);
+	xDelete<IssmDouble>(values);
+}
+/*}}}*/
+void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum){/*{{{*/
+
+
+	int* cs_array=NULL;
+
+	/*All nodes have the same Coordinate System*/
+	cs_array=xNew<int>(numnodes);
+	for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;
+
+	/*Call core*/
+	TransformStiffnessMatrixCoord(Ke,nodes,numnodes,cs_array);
+
+	/*Clean-up*/
+	xDelete<int>(cs_array);
+}
+/*}}}*/
+void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array){/*{{{*/
+
+
+	int     i,j;
+	int     numdofs   = 0;
+	IssmDouble *transform = NULL;
+	IssmDouble *values    = NULL;
+
+	/*Get total number of dofs*/
+	for(i=0;i<numnodes;i++){
+		switch(cs_array[i]){
+			case XYEnum:   numdofs+=2; break;
+			case XYZPEnum: numdofs+=4; break;
+			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
+		}
+	}
+
+	/*Copy current stiffness matrix*/
+	values=xNew<IssmDouble>(Ke->nrows*Ke->ncols);
+	for(i=0;i<Ke->nrows;i++) for(j=0;j<Ke->ncols;j++) values[i*Ke->ncols+j]=Ke->values[i*Ke->ncols+j];
+
+	/*Get Coordinate Systems transform matrix*/
+	CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);
+
+	/*Transform matrix: R^T*Ke*R */
+	TripleMultiply(transform,numdofs,numdofs,1,
+				values,Ke->nrows,Ke->ncols,0,
+				transform,numdofs,numdofs,0,
+				&Ke->values[0],0);
+
+	/*Free Matrix*/
+	xDelete<IssmDouble>(transform);
+	xDelete<IssmDouble>(values);
+}
+/*}}}*/
+void CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes,int numnodes,int* cs_array){/*{{{*/
+
+
+	int     i,counter;
+	int     numdofs           = 0;
+	IssmDouble  norm;
+	IssmDouble *transform         = NULL;
+	IssmDouble *values            = NULL;
+	IssmDouble  coord_system[3][3];
+
+	/*Some checks in debugging mode*/
+	_assert_(numnodes && nodes);
+
+	/*Get total number of dofs*/
+	for(i=0;i<numnodes;i++){
+		switch(cs_array[i]){
+			case XYEnum:   numdofs+=2; break;
+			case XYZPEnum: numdofs+=4; break;
+			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
+		}
+	}
+
+	/*Allocate and initialize transform matrix*/
+	transform=xNew<IssmDouble>(numdofs*numdofs);
+	for(i=0;i<numdofs*numdofs;i++) transform[i]=0.0;
+
+	/*Create transform matrix for all nodes (x,y for 2d and x,y,z for 3d). It is a block matrix
+	 *for 3 nodes:
+
+	 *     | T1 0  0 |
+	 * Q = | 0  T2 0 |
+	 *     | 0  0  T3|
+	 *
+	 * Where T1 is the transform matrix for node 1. It is a simple copy of the coordinate system
+	 * associated to this node*/
+	counter=0;
+	for(i=0;i<numnodes;i++){
+		nodes[i]->GetCoordinateSystem(&coord_system[0][0]);
+		switch(cs_array[i]){
+			case XYEnum:
+				/*We remove the z component, we need to renormalize x and y: x=[x1 x2 0] y=[-x2 x1 0]*/
+				norm = sqrt( coord_system[0][0]*coord_system[0][0] + coord_system[1][0]*coord_system[1][0]); _assert_(norm>1.e-4);
+				transform[(numdofs)*(counter+0) + counter+0] =   coord_system[0][0]/norm;
+				transform[(numdofs)*(counter+0) + counter+1] = - coord_system[1][0]/norm;
+				transform[(numdofs)*(counter+1) + counter+0] =   coord_system[1][0]/norm;
+				transform[(numdofs)*(counter+1) + counter+1] =   coord_system[0][0]/norm;
+				counter+=2;
+				break;
+			case XYZPEnum:
+				/*Only the first 3 coordinates are changed (x,y,z), leave the others (P) unchanged*/
+				transform[(numdofs)*(counter+0) + counter+0] = coord_system[0][0];
+				transform[(numdofs)*(counter+0) + counter+1] = coord_system[0][1];
+				transform[(numdofs)*(counter+0) + counter+2] = coord_system[0][2];
+				transform[(numdofs)*(counter+1) + counter+0] = coord_system[1][0];
+				transform[(numdofs)*(counter+1) + counter+1] = coord_system[1][1];
+				transform[(numdofs)*(counter+1) + counter+2] = coord_system[1][2];
+				transform[(numdofs)*(counter+2) + counter+0] = coord_system[2][0];
+				transform[(numdofs)*(counter+2) + counter+1] = coord_system[2][1];
+				transform[(numdofs)*(counter+2) + counter+2] = coord_system[2][2];
+				transform[(numdofs)*(counter+3) + counter+3] = 1.0;
+				counter+=4;
+				break;
+			default:
+				_error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
+		}
+	}
+
+	/*Assign output pointer*/
+	*ptransform=transform;
+}
+/*}}}*/
+#endif
Index: /issm/trunk-jpl/src/c/classes/objects/Node.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Node.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Node.h	(revision 14951)
@@ -18,4 +18,6 @@
 template <class doubletype> class  Vector;
 template <class doubletype> class  Matrix;
+class ElementVector;
+class ElementMatrix;
 #include "../Update.h"
 /*}}}*/
@@ -100,3 +102,19 @@
 };
 
+/*Methods inherent to Node: */
+int* GetLocalDofList(Node** nodes,int numnodes,int setenum,int approximation);
+int* GetGlobalDofList(Node** nodes,int numnodes,int setenum,int approximation);
+int  GetNumberOfDofs(Node** nodes,int numnodes,int setenum,int approximation);
+#ifdef _HAVE_DIAGNOSTIC_
+void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
+void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
+void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum);
+void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array);
+void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int cs_enum);
+void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int* cs_array);
+void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
+void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
+void CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes,int numnodes,int* cs_array);
+#endif
+
 #endif  /* _NODE_H_ */
Index: /issm/trunk-jpl/src/c/classes/objects/Profiler.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Profiler.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Profiler.cpp	(revision 14951)
@@ -11,4 +11,5 @@
 
 #include "./Profiler.h"
+#include "./Params/DoubleParam.h"
 /*}}}*/
 
Index: /issm/trunk-jpl/src/c/classes/objects/Vertex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Vertex.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Vertex.cpp	(revision 14951)
@@ -238,2 +238,15 @@
 }
 /*}}}*/
+
+/*Methods relating to Vertex, but not internal methods: */
+void GetVerticesCoordinates(IssmDouble* xyz,Vertex** vertices, int numvertices){ /*{{{*/
+
+	_assert_(vertices);
+	_assert_(xyz);
+
+	for(int i=0;i<numvertices;i++) {
+		xyz[i*3+0]=vertices[i]->GetX();
+		xyz[i*3+1]=vertices[i]->GetY();
+		xyz[i*3+2]=vertices[i]->GetZ();
+	}
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/objects/Vertex.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Vertex.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/classes/objects/Vertex.h	(revision 14951)
@@ -59,3 +59,7 @@
 		void       VertexCoordinates(Vector<IssmDouble>* vx,Vector<IssmDouble>* vy,Vector<IssmDouble>* vz);
 };
+
+/*Methods relating to Vertex object: */
+void GetVerticesCoordinates(IssmDouble* xyz,Vertex** vertices, int numvertices);
+
 #endif  /* _VERTEX_H */
Index: /issm/trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.cpp	(revision 14951)
@@ -8,4 +8,5 @@
 #include "../../shared/io/io.h"
 #include "../../toolkits/toolkits.h"
+#include "../../classes/classes.h"
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
Index: /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 14951)
@@ -8,4 +8,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 #include "../../Container/Container.h"
+#include "../../classes/classes.h"
 #include "./GroundinglineMigrationx.h"
 
Index: /issm/trunk-jpl/src/c/modules/InputControlUpdatex/InputControlUpdatex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputControlUpdatex/InputControlUpdatex.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/modules/InputControlUpdatex/InputControlUpdatex.cpp	(revision 14951)
@@ -5,4 +5,5 @@
 #include "./InputControlUpdatex.h"
 #include "../../shared/shared.h"
+#include "../../classes/classes.h"
 #include "../../toolkits/toolkits.h"
 #include "../../EnumDefinitions/EnumDefinitions.h"
Index: /issm/trunk-jpl/src/c/modules/InputConvergencex/InputConvergencex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputConvergencex/InputConvergencex.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/modules/InputConvergencex/InputConvergencex.cpp	(revision 14951)
@@ -5,4 +5,5 @@
 #include "../../shared/shared.h"
 #include "../../shared/io/io.h"
+#include "../../classes/classes.h"
 #include "../../toolkits/toolkits.h"
 #include "../../EnumDefinitions/EnumDefinitions.h"
Index: /issm/trunk-jpl/src/c/modules/InputDuplicatex/InputDuplicatex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputDuplicatex/InputDuplicatex.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/modules/InputDuplicatex/InputDuplicatex.cpp	(revision 14951)
@@ -5,4 +5,5 @@
 #include "./InputDuplicatex.h"
 #include "../../shared/shared.h"
+#include "../../classes/classes.h"
 #include "../../toolkits/toolkits.h"
 #include "../../EnumDefinitions/EnumDefinitions.h"
Index: /issm/trunk-jpl/src/c/modules/InputScalex/InputScalex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputScalex/InputScalex.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/modules/InputScalex/InputScalex.cpp	(revision 14951)
@@ -6,4 +6,5 @@
 #include "../../shared/shared.h"
 #include "../../toolkits/toolkits.h"
+#include "../../classes/classes.h"
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
Index: /issm/trunk-jpl/src/c/modules/InputToResultx/InputToResultx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputToResultx/InputToResultx.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/modules/InputToResultx/InputToResultx.cpp	(revision 14951)
@@ -5,4 +5,5 @@
 #include "./InputToResultx.h"
 #include "../../shared/shared.h"
+#include "../../classes/classes.h"
 #include "../../toolkits/toolkits.h"
 #include "../../EnumDefinitions/EnumDefinitions.h"
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNumberNodeToElementConnectivity.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNumberNodeToElementConnectivity.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNumberNodeToElementConnectivity.cpp	(revision 14951)
@@ -10,4 +10,5 @@
 
 #include "../../shared/shared.h"
+#include "../../classes/classes.h"
 #include "../../shared/io/io.h"
 #include "./ModelProcessorx.h"
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateSingleNodeToElementConnectivity.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateSingleNodeToElementConnectivity.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateSingleNodeToElementConnectivity.cpp	(revision 14951)
@@ -11,4 +11,5 @@
 #include "../../shared/shared.h"
 #include "../../shared/io/io.h"
+#include "../../classes/classes.h"
 #include "./ModelProcessorx.h"
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp	(revision 14951)
@@ -4,4 +4,5 @@
 
 #include "../../shared/shared.h"
+#include "../../classes/classes.h"
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
Index: /issm/trunk-jpl/src/c/shared/Elements/Arrhenius.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/Arrhenius.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/shared/Elements/Arrhenius.cpp	(revision 14951)
@@ -3,6 +3,7 @@
  */
 
+#include <math.h>
 #include "./elements.h"
-#include <math.h>
+#include "../Exceptions/exceptions.h"
 
 IssmDouble Arrhenius(IssmDouble temperature,IssmDouble depth,IssmDouble n){
Index: /issm/trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/shared/Elements/ComputeDelta18oTemperaturePrecipitation.cpp	(revision 14951)
@@ -5,4 +5,5 @@
 
 #include "./elements.h"
+#include "../Numerics/numerics.h"
 
 void ComputeDelta18oTemperaturePrecipitation(IssmDouble Delta18oSurfacePresent, IssmDouble Delta18oSurfaceLgm, IssmDouble Delta18oSurfaceTime,
Index: sm/trunk-jpl/src/c/shared/Elements/CoordinateSystemTransform.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/CoordinateSystemTransform.cpp	(revision 14950)
+++ 	(revision )
@@ -1,75 +1,0 @@
-/*!\file:  GetGlobalDofList.cpp
- * \brief create transform matrix for different coordinate systems
- */ 
-#include "./elements.h"
-#include <math.h>
-
-void CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes,int numnodes,int* cs_array){
-
-	int     i,counter;
-	int     numdofs           = 0;
-	IssmDouble  norm;
-	IssmDouble *transform         = NULL;
-	IssmDouble *values            = NULL;
-	IssmDouble  coord_system[3][3];
-
-	/*Some checks in debugging mode*/
-	_assert_(numnodes && nodes);
-
-	/*Get total number of dofs*/
-	for(i=0;i<numnodes;i++){
-		switch(cs_array[i]){
-			case XYEnum:   numdofs+=2; break;
-			case XYZPEnum: numdofs+=4; break;
-			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
-		}
-	}
-
-	/*Allocate and initialize transform matrix*/
-	transform=xNew<IssmDouble>(numdofs*numdofs);
-	for(i=0;i<numdofs*numdofs;i++) transform[i]=0.0;
-
-	/*Create transform matrix for all nodes (x,y for 2d and x,y,z for 3d). It is a block matrix
-	 *for 3 nodes:
-
-	 *     | T1 0  0 |
-	 * Q = | 0  T2 0 |
-	 *     | 0  0  T3|
-	 *
-	 * Where T1 is the transform matrix for node 1. It is a simple copy of the coordinate system
-	 * associated to this node*/
-	counter=0;
-	for(i=0;i<numnodes;i++){
-		nodes[i]->GetCoordinateSystem(&coord_system[0][0]);
-		switch(cs_array[i]){
-			case XYEnum:
-				/*We remove the z component, we need to renormalize x and y: x=[x1 x2 0] y=[-x2 x1 0]*/
-				norm = sqrt( coord_system[0][0]*coord_system[0][0] + coord_system[1][0]*coord_system[1][0]); _assert_(norm>1.e-4);
-				transform[(numdofs)*(counter+0) + counter+0] =   coord_system[0][0]/norm;
-				transform[(numdofs)*(counter+0) + counter+1] = - coord_system[1][0]/norm;
-				transform[(numdofs)*(counter+1) + counter+0] =   coord_system[1][0]/norm;
-				transform[(numdofs)*(counter+1) + counter+1] =   coord_system[0][0]/norm;
-				counter+=2;
-				break;
-			case XYZPEnum:
-				/*Only the first 3 coordinates are changed (x,y,z), leave the others (P) unchanged*/
-				transform[(numdofs)*(counter+0) + counter+0] = coord_system[0][0];
-				transform[(numdofs)*(counter+0) + counter+1] = coord_system[0][1];
-				transform[(numdofs)*(counter+0) + counter+2] = coord_system[0][2];
-				transform[(numdofs)*(counter+1) + counter+0] = coord_system[1][0];
-				transform[(numdofs)*(counter+1) + counter+1] = coord_system[1][1];
-				transform[(numdofs)*(counter+1) + counter+2] = coord_system[1][2];
-				transform[(numdofs)*(counter+2) + counter+0] = coord_system[2][0];
-				transform[(numdofs)*(counter+2) + counter+1] = coord_system[2][1];
-				transform[(numdofs)*(counter+2) + counter+2] = coord_system[2][2];
-				transform[(numdofs)*(counter+3) + counter+3] = 1.0;
-				counter+=4;
-				break;
-			default:
-				_error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
-		}
-	}
-
-	/*Assign output pointer*/
-	*ptransform=transform;
-}
Index: sm/trunk-jpl/src/c/shared/Elements/GetGlobalDofList.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/GetGlobalDofList.cpp	(revision 14950)
+++ 	(revision )
@@ -1,41 +1,0 @@
-/*!\file:  GetGlobalDofList.cpp
- * \brief create new element matrix
- */ 
-#include "./elements.h"
-
-int* GetGlobalDofList(Node** nodes,int numnodes,int setenum,int approximation){
-
-	int  i,numdof,count;
-	int* ndof_list=NULL;
-	int *doflist = NULL;
-
-	if(numnodes){
-
-		/*Allocate:*/
-		ndof_list=xNew<int>(numnodes);
-
-		/*First, figure out size of doflist: */
-		numdof=0;
-		for(i=0;i<numnodes;i++){
-			ndof_list[i]=nodes[i]->GetNumberOfDofs(approximation,setenum);
-			numdof+=ndof_list[i];
-		}
-
-		if(numdof){
-			/*Allocate: */
-			doflist=xNew<int>(numdof);
-
-			/*Populate: */
-			count=0;
-			for(i=0;i<numnodes;i++){
-				nodes[i]->GetDofList(&doflist[count],approximation,setenum);
-				count+=ndof_list[i];
-			}
-		}
-		else doflist=NULL;
-	}
-	/*Free ressources:*/
-	xDelete<int>(ndof_list);
-
-	return doflist;
-}
Index: sm/trunk-jpl/src/c/shared/Elements/GetLocalDofList.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/GetLocalDofList.cpp	(revision 14950)
+++ 	(revision )
@@ -1,61 +1,0 @@
-/*!\file:  GetLocalDofList.cpp
- * \brief create new element matrix
- */ 
-#include "./elements.h"
-
-int* GetLocalDofList(Node** nodes,int numnodes,int setenum,int approximation){
-
-	int  i,j,count,numdof,numgdof;
-	int* ndof_list=NULL;
-	int* ngdof_list_cumulative=NULL;
-	int *doflist = NULL;
-
-	if(numnodes){
-		/*allocate: */
-		ndof_list=xNew<int>(numnodes);
-		ngdof_list_cumulative=xNew<int>(numnodes);
-
-		/*Get number of dofs per node, and total for this given set*/
-		numdof=0;
-		numgdof=0;
-		for(i=0;i<numnodes;i++){
-
-			/*Cumulative list= number of dofs before node i*/
-			ngdof_list_cumulative[i]=numgdof;
-
-			/*Number of dofs for node i for given set and for the g set*/
-			ndof_list[i]=nodes[i]->GetNumberOfDofs(approximation,setenum);
-			numgdof    +=nodes[i]->GetNumberOfDofs(approximation,GsetEnum);
-			numdof     +=ndof_list[i];
-		}
-
-		if(numdof){
-			/*Allocate: */
-			doflist=xNew<int>(numdof);
-
-			/*Populate: */
-			count=0;
-			for(i=0;i<numnodes;i++){
-				nodes[i]->GetLocalDofList(&doflist[count],approximation,setenum);
-				count+=ndof_list[i];
-			}
-
-			/*We now have something like: [0 1 0 2 1 2]. Offset by gsize, to get something like: [0 1 2 4 6 7]:*/
-			count=0;
-			for(i=0;i<numnodes;i++){
-				for(j=0;j<ndof_list[i];j++){
-					doflist[count+j]+=ngdof_list_cumulative[i];
-				}
-				count+=ndof_list[i];
-			}
-		}
-		else doflist=NULL;
-	}
-
-	/*Free ressources:*/
-	xDelete<int>(ndof_list);
-	xDelete<int>(ngdof_list_cumulative);
-
-	/*CLean-up and return*/
-	return doflist;
-}
Index: sm/trunk-jpl/src/c/shared/Elements/GetNumberOfDofs.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/GetNumberOfDofs.cpp	(revision 14950)
+++ 	(revision )
@@ -1,16 +1,0 @@
-/*!\file:  GetNumberOfDofs.cpp
- * \brief create new element matrix
- */ 
-#include "./elements.h"
-
-int GetNumberOfDofs(Node** nodes,int numnodes,int setenum,int approximation){
-
-	/*output: */
-	int numberofdofs=0;
-
-	for(int i=0;i<numnodes;i++){
-		numberofdofs+=nodes[i]->GetNumberOfDofs(approximation,setenum);
-	}
-
-	return numberofdofs;
-}
Index: sm/trunk-jpl/src/c/shared/Elements/GetVerticesCoordinates.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/GetVerticesCoordinates.cpp	(revision 14950)
+++ 	(revision )
@@ -1,17 +1,0 @@
-/*!\file:  GetVerticesCoordinates.cpp
- * \brief get node coordinates
- */ 
-
-#include "./elements.h"
-
-void GetVerticesCoordinates(IssmDouble* xyz,Vertex** vertices, int numvertices){
-
-	_assert_(vertices);
-	_assert_(xyz);
-
-	for(int i=0;i<numvertices;i++) {
-		xyz[i*3+0]=vertices[i]->GetX();
-		xyz[i*3+1]=vertices[i]->GetY();
-		xyz[i*3+2]=vertices[i]->GetZ();
-	}
-}
Index: /issm/trunk-jpl/src/c/shared/Elements/Paterson.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/Paterson.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/shared/Elements/Paterson.cpp	(revision 14951)
@@ -7,5 +7,5 @@
 #include <math.h>
 
-#include "../../shared/Numerics/types.h"
+#include "../Numerics/types.h"
 
 IssmDouble Paterson(IssmDouble temperature){
Index: /issm/trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/shared/Elements/PddSurfaceMassBalance.cpp	(revision 14951)
@@ -4,4 +4,5 @@
 
 #include "./elements.h"
+#include "../Numerics/numerics.h"
 
 IssmDouble PddSurfaceMassBlance(IssmDouble* monthlytemperatures, IssmDouble* monthlyprec, IssmDouble* pdds, IssmDouble* pds, IssmDouble signorm, IssmDouble yts, IssmDouble h, IssmDouble s, IssmDouble rho_ice, IssmDouble rho_water, IssmDouble desfac, IssmDouble s0p){ 
Index: /issm/trunk-jpl/src/c/shared/Elements/PrintArrays.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/PrintArrays.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/shared/Elements/PrintArrays.cpp	(revision 14951)
@@ -1,4 +1,5 @@
 
 #include "./elements.h"
+#include "../io/Print/Print.h"
 using namespace std;
 
Index: sm/trunk-jpl/src/c/shared/Elements/TransformInvStiffnessMatrixCoord.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/TransformInvStiffnessMatrixCoord.cpp	(revision 14950)
+++ 	(revision )
@@ -1,53 +1,0 @@
-/*!\file:  TransformInvStiffnessMatrixCoord.cpp
- * \brief transform stiffness matrix inverse coordinate system
- */ 
-#include "./elements.h"
-
-void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum){
-
-	int* cs_array=NULL;
-
-	/*All nodes have the same Coordinate System*/
-	cs_array=xNew<int>(numnodes);
-	for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;
-
-	/*Call core*/
-	TransformInvStiffnessMatrixCoord(Ke,nodes,numnodes,cs_array);
-
-	/*Clean-up*/
-	xDelete<int>(cs_array);
-}
-
-void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array){
-
-	int     i,j;
-	int     numdofs   = 0;
-	IssmDouble *transform = NULL;
-	IssmDouble *values    = NULL;
-
-	/*Get total number of dofs*/
-	for(i=0;i<numnodes;i++){
-		switch(cs_array[i]){
-			case XYEnum:   numdofs+=2; break;
-			case XYZPEnum: numdofs+=4; break;
-			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
-		}
-	}
-
-	/*Copy current stiffness matrix*/
-	values=xNew<IssmDouble>(Ke->nrows*Ke->ncols);
-	for(i=0;i<Ke->nrows;i++) for(j=0;j<Ke->ncols;j++) values[i*Ke->ncols+j]=Ke->values[i*Ke->ncols+j];
-
-	/*Get Coordinate Systems transform matrix*/
-	CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);
-
-	/*Transform matrix: R*Ke*R^T */
-	TripleMultiply(transform,numdofs,numdofs,0,
-				values,Ke->nrows,Ke->ncols,0,
-				transform,numdofs,numdofs,1,
-				&Ke->values[0],0);
-
-	/*Free Matrix*/
-	xDelete<IssmDouble>(transform);
-	xDelete<IssmDouble>(values);
-}
Index: sm/trunk-jpl/src/c/shared/Elements/TransformLoadVectorCoord.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/TransformLoadVectorCoord.cpp	(revision 14950)
+++ 	(revision )
@@ -1,51 +1,0 @@
-/*!\file:  TransformLoadVectorCoord.cpp
- * \brief transform load vector coordinate system
- */ 
-#include "./elements.h"
-
-void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum){
-	int* cs_array=NULL;
-
-	/*All nodes have the same Coordinate System*/
-	cs_array=xNew<int>(numnodes);
-	for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;
-
-	/*Call core*/
-	TransformLoadVectorCoord(pe,nodes,numnodes,cs_array);
-
-	/*Clean-up*/
-	xDelete<int>(cs_array);
-}
-
-void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array){
-
-	int     i;
-	int     numdofs   = 0;
-	IssmDouble *transform = NULL;
-	IssmDouble *values    = NULL;
-
-	/*Get total number of dofs*/
-	for(i=0;i<numnodes;i++){
-		switch(cs_array[i]){
-			case XYEnum:   numdofs+=2; break;
-			case XYZPEnum: numdofs+=4; break;
-			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
-		}
-	}
-
-	/*Copy current load vector*/
-	values=xNew<IssmDouble>(pe->nrows);
-	for(i=0;i<pe->nrows;i++) values[i]=pe->values[i];
-
-	/*Get Coordinate Systems transform matrix*/
-	CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);
-
-	/*Transform matrix: R^T*pe */
-	MatrixMultiply(transform,numdofs,numdofs,1,
-				values,pe->nrows,1,0,
-				&pe->values[0],0);
-
-	/*Free Matrices*/
-	xDelete<IssmDouble>(transform);
-	xDelete<IssmDouble>(values);
-}
Index: sm/trunk-jpl/src/c/shared/Elements/TransformSolutionCoord.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/TransformSolutionCoord.cpp	(revision 14950)
+++ 	(revision )
@@ -1,52 +1,0 @@
-/*!\file:  TransformSolutionCoord.cpp
- * \brief transform solution vector coordinate system
- */ 
-#include "./elements.h"
-
-void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int cs_enum){
-
-	int* cs_array=NULL;
-
-	/*All nodes have the same Coordinate System*/
-	cs_array=xNew<int>(numnodes);
-	for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;
-
-	/*Call core*/
-	TransformSolutionCoord(solution,nodes,numnodes,cs_array);
-
-	/*Clean-up*/
-	xDelete<int>(cs_array);
-}
-
-void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int* cs_array){
-
-	int     i;
-	int     numdofs   = 0;
-	IssmDouble *transform = NULL;
-	IssmDouble *values    = NULL;
-
-	/*Get total number of dofs*/
-	for(i=0;i<numnodes;i++){
-		switch(cs_array[i]){
-			case XYEnum:   numdofs+=2; break;
-			case XYZPEnum: numdofs+=4; break;
-			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
-		}
-	}
-
-	/*Copy current solution vector*/
-	values=xNew<IssmDouble>(numdofs);
-	for(i=0;i<numdofs;i++) values[i]=solution[i];
-
-	/*Get Coordinate Systems transform matrix*/
-	CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);
-
-	/*Transform matrix: R*U */
-	MatrixMultiply(transform,numdofs,numdofs,0,
-				values,numdofs,1,0,
-				&solution[0],0);
-
-	/*Free Matrices*/
-	xDelete<IssmDouble>(transform);
-	xDelete<IssmDouble>(values);
-}
Index: sm/trunk-jpl/src/c/shared/Elements/TransformStiffnessMatrixCoord.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/TransformStiffnessMatrixCoord.cpp	(revision 14950)
+++ 	(revision )
@@ -1,53 +1,0 @@
-/*!\file:  TransformStiffnessMatrixCoord.cpp
- * \brief transform stiffness matrix coordinate system
- */ 
-#include "./elements.h"
-
-void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum){
-
-	int* cs_array=NULL;
-
-	/*All nodes have the same Coordinate System*/
-	cs_array=xNew<int>(numnodes);
-	for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;
-
-	/*Call core*/
-	TransformStiffnessMatrixCoord(Ke,nodes,numnodes,cs_array);
-
-	/*Clean-up*/
-	xDelete<int>(cs_array);
-}
-
-void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array){
-
-	int     i,j;
-	int     numdofs   = 0;
-	IssmDouble *transform = NULL;
-	IssmDouble *values    = NULL;
-
-	/*Get total number of dofs*/
-	for(i=0;i<numnodes;i++){
-		switch(cs_array[i]){
-			case XYEnum:   numdofs+=2; break;
-			case XYZPEnum: numdofs+=4; break;
-			default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");
-		}
-	}
-
-	/*Copy current stiffness matrix*/
-	values=xNew<IssmDouble>(Ke->nrows*Ke->ncols);
-	for(i=0;i<Ke->nrows;i++) for(j=0;j<Ke->ncols;j++) values[i*Ke->ncols+j]=Ke->values[i*Ke->ncols+j];
-
-	/*Get Coordinate Systems transform matrix*/
-	CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);
-
-	/*Transform matrix: R^T*Ke*R */
-	TripleMultiply(transform,numdofs,numdofs,1,
-				values,Ke->nrows,Ke->ncols,0,
-				transform,numdofs,numdofs,0,
-				&Ke->values[0],0);
-
-	/*Free Matrix*/
-	xDelete<IssmDouble>(transform);
-	xDelete<IssmDouble>(values);
-}
Index: /issm/trunk-jpl/src/c/shared/Elements/elements.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Elements/elements.h	(revision 14950)
+++ /issm/trunk-jpl/src/c/shared/Elements/elements.h	(revision 14951)
@@ -6,9 +6,9 @@
 #define _SHARED_ELEMENTS_H_
 
-#include "../../classes/objects/objects.h"
-#include "../../Container/Container.h"
+#include "../Numerics/types.h"
 class ElementMatrix;
 class ElementVector;
 class Vertex;
+class Node;
 
 IssmDouble Paterson(IssmDouble temperature);
@@ -22,20 +22,4 @@
 				     IssmDouble* TemperaturesLgm, IssmDouble* TemperaturesPresentday, 
 					     IssmDouble* monthlytemperaturesout, IssmDouble* monthlyprecout);
-void   GetVerticesCoordinates(IssmDouble* xyz,Vertex** vertices,int numvertices);
-int    GetNumberOfDofs( Node** nodes,int numnodes,int setenum,int approximation_enum);
-int*   GetLocalDofList( Node** nodes,int numnodes,int setenum,int approximation_enum);
-int*   GetGlobalDofList(Node** nodes,int numnodes,int setenum,int approximation_enum);
-
-#ifdef _HAVE_DIAGNOSTIC_
-void   CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes,int numnodes,int* cs_array);
-void   TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
-void   TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
-void   TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
-void   TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
-void   TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum);
-void   TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array);
-void   TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int cs_enum);
-void   TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int* cs_array);
-#endif
 
 /*Print arrays*/
Index: /issm/trunk-jpl/src/c/shared/Exceptions/Exceptions.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Exceptions/Exceptions.cpp	(revision 14950)
+++ /issm/trunk-jpl/src/c/shared/Exceptions/Exceptions.cpp	(revision 14951)
@@ -9,5 +9,7 @@
 #endif
 
-#include "../shared.h"
+#include "./exceptions.h"
+#include "../io/Print/Print.h"
+#include "../io/Comm/Comm.h"
 
 ErrorException::ErrorException(const string &what_arg){/*{{{*/
