Index: /issm/trunk/src/c/DepthAverageInputx/DepthAverageInputx.cpp
===================================================================
--- /issm/trunk/src/c/DepthAverageInputx/DepthAverageInputx.cpp	(revision 3791)
+++ /issm/trunk/src/c/DepthAverageInputx/DepthAverageInputx.cpp	(revision 3791)
@@ -0,0 +1,16 @@
+/*!\file DepthAverageInputx
+ * \brief: average field throfieldh thickness
+ */
+
+#include "./DepthAverageInputx.h"
+
+#include "../shared/shared.h"
+#include "../include/include.h"
+#include "../toolkits/toolkits.h"
+#include "../EnumDefinitions/EnumDefinitions.h"
+
+void DepthAverageInputx( DataSet* elements,DataSet* nodes, DataSet* vertices, DataSet* loads, DataSet* materials, Parameters* parameters,int enum_type){
+
+	ISSMERROR(" not supported yet!");
+
+}
Index: /issm/trunk/src/c/DepthAverageInputx/DepthAverageInputx.h
===================================================================
--- /issm/trunk/src/c/DepthAverageInputx/DepthAverageInputx.h	(revision 3791)
+++ /issm/trunk/src/c/DepthAverageInputx/DepthAverageInputx.h	(revision 3791)
@@ -0,0 +1,14 @@
+/*!\file:  DepthAverageInputx.h
+ * \brief header file for averaging a field throfieldh thickness
+ */ 
+
+#ifndef _DEPTHAVERAGEINPUTX_H
+#define _DEPTHAVERAGEINPUTX_H
+
+#include "../DataSet/DataSet.h"
+
+/* local prototypes: */
+void DepthAverageInputx( DataSet* elements,DataSet* nodes, DataSet* vertices, DataSet* loads, DataSet* materials, Parameters* parameters,int enum_type);
+
+#endif  /* _DEPTHAVERAGEINPUTX_H */
+
Index: /issm/trunk/src/c/ExtrudeInputx/ExtrudeInputx.cpp
===================================================================
--- /issm/trunk/src/c/ExtrudeInputx/ExtrudeInputx.cpp	(revision 3791)
+++ /issm/trunk/src/c/ExtrudeInputx/ExtrudeInputx.cpp	(revision 3791)
@@ -0,0 +1,16 @@
+/*!\file ExtrudeInputx
+ * \brief: average field throfieldh thickness
+ */
+
+#include "./ExtrudeInputx.h"
+
+#include "../shared/shared.h"
+#include "../include/include.h"
+#include "../toolkits/toolkits.h"
+#include "../EnumDefinitions/EnumDefinitions.h"
+
+void ExtrudeInputx( DataSet* elements,DataSet* nodes, DataSet* vertices, DataSet* loads, DataSet* materials, Parameters* parameters,int enum_type){
+
+	ISSMERROR(" not supported yet!");
+
+}
Index: /issm/trunk/src/c/ExtrudeInputx/ExtrudeInputx.h
===================================================================
--- /issm/trunk/src/c/ExtrudeInputx/ExtrudeInputx.h	(revision 3791)
+++ /issm/trunk/src/c/ExtrudeInputx/ExtrudeInputx.h	(revision 3791)
@@ -0,0 +1,14 @@
+/*!\file:  ExtrudeInputx.h
+ * \brief header file for averaging a field throfieldh thickness
+ */ 
+
+#ifndef _EXTRUDEINPUTX_H
+#define _EXTRUDEINPUTX_H
+
+#include "../DataSet/DataSet.h"
+
+/* local prototypes: */
+void ExtrudeInputx( DataSet* elements,DataSet* nodes, DataSet* vertices, DataSet* loads, DataSet* materials, Parameters* parameters,int enum_type);
+
+#endif  /* _EXTRUDEINPUTX_H */
+
Index: /issm/trunk/src/c/Makefile.am
===================================================================
--- /issm/trunk/src/c/Makefile.am	(revision 3790)
+++ /issm/trunk/src/c/Makefile.am	(revision 3791)
@@ -66,4 +66,6 @@
 					./objects/Elements/Tria.h\
 					./objects/Elements/Tria.cpp\
+					./objects/Elements/TriaHook.h\
+					./objects/Elements/TriaHook.cpp\
 					./objects/Inputs/Input.h\
 					./objects/Inputs/TriaVertexInput.h\
@@ -377,6 +379,10 @@
 					./FieldDepthAveragex/FieldDepthAveragex.cpp\
 					./FieldDepthAveragex/FieldDepthAveragex.h\
+					./DepthAverageInputx/DepthAverageInputx.cpp\
+					./DepthAverageInputx/DepthAverageInputx.h\
 					./FieldExtrudex/FieldExtrudex.cpp\
 					./FieldExtrudex/FieldExtrudex.h\
+					./ExtrudeInputx/ExtrudeInputx.cpp\
+					./ExtrudeInputx/ExtrudeInputx.h\
 					./OutputRiftsx/OutputRiftsx.h\
 					./OutputRiftsx/OutputRiftsx.cpp\
@@ -499,4 +505,6 @@
 					./objects/Elements/Tria.h\
 					./objects/Elements/Tria.cpp\
+					./objects/Elements/TriaHook.h\
+					./objects/Elements/TriaHook.cpp\
 					./objects/Inputs/Input.h\
 					./objects/Inputs/TriaVertexInput.h\
@@ -800,6 +808,10 @@
 					./FieldDepthAveragex/FieldDepthAveragex.cpp\
 					./FieldDepthAveragex/FieldDepthAveragex.h\
+					./DepthAverageInputx/DepthAverageInputx.cpp\
+					./DepthAverageInputx/DepthAverageInputx.h\
 					./FieldExtrudex/FieldExtrudex.cpp\
 					./FieldExtrudex/FieldExtrudex.h\
+					./ExtrudeInputx/ExtrudeInputx.cpp\
+					./ExtrudeInputx/ExtrudeInputx.h\
 					./OutputRiftsx/OutputRiftsx.h\
 					./OutputRiftsx/OutputRiftsx.cpp\
Index: /issm/trunk/src/c/modules.h
===================================================================
--- /issm/trunk/src/c/modules.h	(revision 3790)
+++ /issm/trunk/src/c/modules.h	(revision 3791)
@@ -59,3 +59,5 @@
 #include "./BamgConvertMeshx/BamgConvertMeshx.h"
 #include "./SplitSolutionVectorx/SplitSolutionVectorx.h"
+#include "./DepthAverageInputx/DepthAverageInputx.h"
+#include "./ExtrudeInputx/ExtrudeInputx.h"
 #endif
Index: /issm/trunk/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 3790)
+++ /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 3791)
@@ -352,6 +352,19 @@
 	tria_parameters=this->parameters;
 	tria_inputs=(Inputs*)this->inputs->Spawn(indices,3);
-
-	tria=new Tria(this->id,tria_hnodes,tria_hmatice,tria_hmatpar,tria_parameters,tria_inputs);
+	
+	tria=new Tria();
+	tria->id=this->id;
+	tria->inputs=tria_inputs;
+	tria->parameters=tria_parameters;
+
+	/*now deal with hooks and objects: */
+	tria->hnodes.copy(tria_hnodes);
+	tria->hmatice.copy(tria_hmatice);
+	tria->hmatpar.copy(tria_hmatpar);
+
+	/*recover objects: */
+	tria->nodes=(Node**)tria->hnodes.deliverp();
+	tria->matice=(Matice*)tria->hmatice.delivers();
+	tria->matpar=(Matpar*)tria->hmatpar.delivers();
 
 	delete tria_hnodes;
Index: /issm/trunk/src/c/objects/Elements/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 3790)
+++ /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 3791)
@@ -23,25 +23,15 @@
 /*FUNCTION Tria::Tria(){{{1*/
 Tria::Tria(){
+	this->nodes=NULL;
+	this->matice=NULL;
+	this->matpar=NULL;
 	this->inputs=NULL;
 	this->parameters=NULL;
 }
 /*}}}*/
-/*FUNCTION Tria::Tria(int id, Hook* hnodes, Hook* hmatice, Hook* hmatpar, Parameters* parameters, Inputs* tria_inputs) {{{1*/
-Tria::Tria(int tria_id,Hook* tria_hnodes, Hook* tria_hmatice, Hook* tria_hmatpar, Parameters* tria_parameters, Inputs* tria_inputs):
-	hnodes(tria_hnodes),
-	hmatice(tria_hmatice),
-	hmatpar(tria_hmatpar)
-{
-
-	/*all the initialization has been done by the initializer, just fill in the id: */
-	this->id=tria_id;
-	if(tria_inputs){
-		this->inputs=(Inputs*)tria_inputs->Copy();
-	}
-	else{
-		this->inputs=new Inputs();
-	}
-	/*point parameters: */
-	this->parameters=tria_parameters;
+/*FUNCTION Tria::~Tria(){{{1*/
+Tria::~Tria(){
+	delete inputs;
+	this->parameters=NULL;
 }
 /*}}}*/
@@ -76,7 +66,7 @@
 	tria_matpar_id=iomodel->numberofelements+1; //refers to the constant material parameters object
 
-	this->hnodes.Init(tria_node_ids,3);
-	this->hmatice.Init(&tria_matice_id,1);
-	this->hmatpar.Init(&tria_matpar_id,1);
+	this->InitHookNodes(tria_node_ids);
+	this->InitHookMatice(tria_matice_id);
+	this->InitHookMatpar(tria_matpar_id);
 
 	//intialize inputs, and add as many inputs per element as requested: 
@@ -187,8 +177,33 @@
 }
 /*}}}*/
-/*FUNCTION Tria::~Tria(){{{1*/
-Tria::~Tria(){
-	delete inputs;
-	this->parameters=NULL;
+/*FUNCTION Tria::copy {{{1*/
+Object* Tria::copy() {
+
+	Tria* tria=NULL;
+
+	tria=new Tria();
+
+	/*copy fields: */
+	tria->id=this->id;
+	if(this->inputs){
+		tria->inputs=(Inputs*)this->inputs->Copy();
+	}
+	else{
+		tria->inputs=new Inputs();
+	}
+	/*point parameters: */
+	tria->parameters=this->parameters;
+
+	/*now deal with hooks and objects: */
+	tria->hnodes.copy(&this->hnodes);
+	tria->hmatice.copy(&this->hmatice);
+	tria->hmatpar.copy(&this->hmatpar);
+
+	/*recover objects: */
+	tria->nodes=(Node**)tria->hnodes.deliverp();
+	tria->matice=(Matice*)tria->hmatice.delivers();
+	tria->matpar=(Matpar*)tria->hmatpar.delivers();
+
+	return tria;
 }
 /*}}}*/
@@ -200,7 +215,12 @@
 	/*Take care of hooking up all objects for this element, ie links the objects in the hooks to their respective 
 	 * datasets, using internal ids and offsets hidden in hooks: */
-	hnodes.configure(nodesin);
-	hmatice.configure(materialsin);
-	hmatpar.configure(materialsin);
+	this->hnodes.configure(nodesin);
+	this->hmatice.configure(materialsin);
+	this->hmatpar.configure(materialsin);
+
+	/*Now, go pick up the objects inside the hooks: */
+	this->nodes=(Node**)this->hnodes.deliverp();
+	this->matice=(Matice*)this->hmatice.delivers();
+	this->matpar=(Matpar*)this->hmatpar.delivers();
 
 	/*point parameters to real dataset: */
@@ -208,12 +228,4 @@
 
 }
-/*}}}*/
-/*FUNCTION Tria::copy {{{1*/
-Object* Tria::copy() {
-
-	return new Tria(this->id,&this->hnodes,&this->hmatice,&this->hmatpar,this->parameters,this->inputs);
-
-}
-
 /*}}}*/
 /*FUNCTION Tria::Demarshall {{{1*/
@@ -235,4 +247,9 @@
 	hmatice.Demarshall(&marshalled_dataset);
 	hmatpar.Demarshall(&marshalled_dataset);
+
+	/*pointers are garbabe, until configuration is carried out: */
+	nodes=NULL;
+	matice=NULL;
+	matpar=NULL;
 	
 	/*demarshall inputs: */
@@ -253,7 +270,9 @@
 	printf("Tria:\n");
 	printf("   id: %i\n",id);
-	hnodes.DeepEcho();
-	hmatice.DeepEcho();
-	hmatpar.DeepEcho();
+	nodes[0]->DeepEcho();
+	nodes[1]->DeepEcho();
+	nodes[2]->DeepEcho();
+	matice->DeepEcho();
+	matpar->DeepEcho();
 	printf("   parameters\n");
 	parameters->DeepEcho();
@@ -267,14 +286,5 @@
 
 void Tria::Echo(void){
-
-	printf("Tria:\n");
-	printf("   id: %i\n",id);
-	hnodes.Echo();
-	hmatice.Echo();
-	hmatpar.Echo();
-	printf("   parameters\n");
-	parameters->Echo();
-	printf("   inputs\n");
-	inputs->Echo();
+	this->DeepEcho();
 }
 /*}}}*/
@@ -341,14 +351,4 @@
 	double  B_average;
 	double  new_h[3];
-
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/*Update internal data if inputs holds new values: */
@@ -500,14 +500,4 @@
 	double value;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-
 	/*plug local pressure values into global pressure vector: */
 	ISSMERROR("Not Implemented yet");
@@ -527,14 +517,4 @@
 	double gauss[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 	
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-
 	/*Get dof list on which we will plug the pressure values: */
 	GetDofList1(&doflist[0]);
@@ -563,14 +543,4 @@
 	int doflist[numgrids];
 	double value;
-
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=   NULL;
-	Matpar* matpar    =NULL;
-	Matice* matice= NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/*plug local pressure values into global pressure vector: */
@@ -619,9 +589,4 @@
 	double Jdet;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
 	/*inputs: */
 	bool onwater;
@@ -634,9 +599,4 @@
 	/*If on water, return 0: */
 	if(onwater)return 0;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/*retrieve some parameters: */
@@ -794,17 +754,6 @@
 	int     found=0;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
 	/*parameters: */
 	double artdiff;
-
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/* Get node coordinates and dof list: */
@@ -952,15 +901,4 @@
 	int     dofs[1]={0};
 	int     found;
-
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-
-	/*recover objects from hooks: */
-	nodes=(Node**)   hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/* Get node coordinates and dof list: */
@@ -1074,14 +1012,4 @@
 	double artdiff;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-
 	/*Recover velocity: */
 	inputs->GetParameterValues(&vx_list[0],&gaussgrids[0][0],3,VxAverageEnum);
@@ -1252,9 +1180,4 @@
 	int     dofs[2]={0,1};
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
 	/*inputs: */
 	bool onwater,shelf;
@@ -1269,9 +1192,4 @@
 	/*First, if we are on water, return empty matrix: */
 	if(onwater) return;
-
-	/*recover objects from hooks: */
-	nodes =(Node**) hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/* Get node coordinates and dof list: */
@@ -1402,15 +1320,4 @@
 	bool shelf;
 	int  drag_type;
-
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/*retrieve inputs :*/
@@ -1562,14 +1469,4 @@
 	double Ke_gg_gaussian[numdof][numdof]; //stiffness matrix evaluated at the gaussian point.
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-
 	/* Get node coordinates and dof list: */
 	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
@@ -1682,14 +1579,4 @@
 	double     tLD[3];
 	double     Ke_gaussian[numdof][numdof]={0.0};
-
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/*Recover constants of ice */
@@ -1796,14 +1683,4 @@
 	double artdiff;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-
 	/*retrieve some parameters: */
 	this->parameters->FindParam(&dt,DtEnum);
@@ -1972,14 +1849,4 @@
 	double dt;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)   hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-
 	/*retrieve some parameters: */
 	this->parameters->FindParam(&dt,DtEnum);
@@ -2087,14 +1954,4 @@
 	double Jdet;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-
 	/* Get node coordinates and dof list: */
 	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
@@ -2179,14 +2036,4 @@
 	/*parameters: */
 	double dt;
-
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/*retrieve some parameters: */
@@ -2327,14 +2174,4 @@
 	double  melting_g;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-
 	/* Get node coordinates and dof list: */
 	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
@@ -2412,14 +2249,4 @@
 	double  dhdt_g;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)   hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-
 	/* Get node coordinates and dof list: */
 	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
@@ -2497,14 +2324,4 @@
 	double  melting_g;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-
 	/* Get node coordinates and dof list: */
 	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
@@ -2589,14 +2406,4 @@
 	double  dbdx,dbdy;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-
 	/* Get node coordinates and dof list: */
 	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
@@ -2696,9 +2503,4 @@
 	double  thickness;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
 	/*inputs: */
 	bool onwater;
@@ -2711,9 +2513,4 @@
 	/*First, if we are on water, return empty vector: */
 	if(onwater)return;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/* Get node coordinates and dof list: */
@@ -2821,14 +2618,4 @@
 	double  dt;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-
 	/*retrieve some parameters: */
 	this->parameters->FindParam(&dt,DtEnum);
@@ -2910,14 +2697,4 @@
 	double  dt;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-
 	/*retrieve some parameters: */
 	this->parameters->FindParam(&dt,DtEnum);
@@ -2998,14 +2775,4 @@
 	double  pe_g_gaussian[numdof];
 	double  slope[2];
-
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/* Get node coordinates and dof list: */
@@ -3105,14 +2872,4 @@
 	double  scalar_ocean;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-	
 	/* Get node coordinates and dof list: */
 	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
@@ -3222,14 +2979,4 @@
 	double  scalar;
 
-
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/*retrieve inputs :*/
@@ -3383,14 +3130,4 @@
 	double S=0;
 	double fit=-1;
-
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/*retrieve some parameters: */
@@ -3594,10 +3331,4 @@
 	double x1,y1,x2,y2,x3,y3;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-
 	/*Get xyz list: */
 	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
@@ -3616,10 +3347,4 @@
 	double xyz_list[numgrids][3];
 	double x1,y1,x2,y2,x3,y3;
-
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
 
 	/*Get area: */
@@ -3800,10 +3525,4 @@
 	int numberofdofspernode;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	
 	for(i=0;i<3;i++){
 		nodes[i]->GetDofList(&doflist_per_node[0],&numberofdofspernode);
@@ -3821,10 +3540,4 @@
 void  Tria::GetDofList1(int* doflist){
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	
 	int i;
 	for(i=0;i<3;i++){
@@ -3980,10 +3693,4 @@
 void* Tria::GetMatPar(){
 
-	/*dynamic objects pointed to by hooks: */
-	Matpar* matpar=NULL;
-
-	/*recover objects from hooks: */
-	matpar=(Matpar*)hmatpar.delivers();
-
 	return matpar;
 }
@@ -4066,13 +3773,7 @@
 	Node** pnodes=NULL;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	
 	/*recover nodes: */
 	pnodes=(Node**)vpnodes;
 
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	
 	for(i=0;i<3;i++){
 		pnodes[i]=nodes[i];
@@ -4254,14 +3955,4 @@
 	double  cm_maxdmp_slope;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
-
 	/*retrieve some parameters: */
 	this->parameters->FindParam(&cm_noisedmp,CmNoiseDmpEnum);
@@ -4418,14 +4109,4 @@
 	double  cm_maxdmp_value;
 	double  cm_maxdmp_slope;
-
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/*retrieve inputs :*/
@@ -4630,9 +4311,4 @@
 	double  cm_maxdmp_slope;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
 	/*retrieve inputs :*/
 	inputs->GetParameterValue(&shelf,ElementOnIceShelfEnum);
@@ -4648,9 +4324,4 @@
 	/*Get out if shelf*/
 	if(shelf)return;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/* Get node coordinates and dof list: */
@@ -4808,12 +4479,4 @@
 	double rho_ice;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-
 	/*Get material parameters :*/
 	rho_ice=matpar->GetRhoIce();
@@ -4910,9 +4573,4 @@
 	double fit=-1;
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-	Matpar* matpar=NULL;
-	Matice* matice=NULL;
-
 	/*inputs: */
 	bool onwater;
@@ -4925,9 +4583,4 @@
 	/*If on water, return 0: */
 	if(onwater)return 0;
-
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-	matpar=(Matpar*)hmatpar.delivers();
-	matice=(Matice*)hmatice.delivers();
 
 	/* Get node coordinates and dof list: */
@@ -5119,7 +4772,4 @@
 	double normal[3];
 
-	/*dynamic objects pointed to by hooks: */
-	Node**  nodes=NULL;
-
 	/*inputs: */
 	bool onwater;
@@ -5133,7 +4783,4 @@
 	if(fit!=3)return 0;
 
-	/*recover objects from hooks: */
-	nodes=(Node**)hnodes.deliverp();
-
 	/*If on water, return 0: */
 	if(onwater)return 0;
Index: /issm/trunk/src/c/objects/Elements/Tria.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.h	(revision 3790)
+++ /issm/trunk/src/c/objects/Elements/Tria.h	(revision 3791)
@@ -9,8 +9,11 @@
 /*{{{1*/
 #include "./Element.h"
-class Hook;
+#include "./TriaHook.h"
 class Parameters;
 class Inputs;
 class IoModel;
+class Node;
+class Matice;
+class Matpar;
 
 #include "../../include/include.h"
@@ -18,5 +21,5 @@
 /*}}}*/
 
-class Tria: public Element{
+class Tria: public Element,public TriaHook{
 
 	public:
@@ -24,7 +27,7 @@
 		int  id;
 
-		Hook hnodes;  //hook to 3 nodes
-		Hook hmatice; //hook to 1 matice
-		Hook hmatpar; //hook to 1 matpar
+		Node** nodes;
+		Matice* matice; 
+		Matpar* matpar; 
 
 		Parameters* parameters; //pointer to solution parameters
@@ -33,5 +36,5 @@
 		/*FUNCTION constructors, destructors {{{1*/
 		Tria();
-		Tria(int tria_id,Hook* tria_hnodes, Hook* tria_hmatice, Hook* tria_hmatpar, Parameters* parameters, Inputs* tria_inputs);
+		Tria(int tria_id,Node* tria_nodes, Matice* tria_matice, Matpar* tria_matpar, Parameters* parameters, Inputs* tria_inputs);
 		Tria(int tria_id,int i, IoModel* iomodel);
 		~Tria();
Index: /issm/trunk/src/c/objects/Elements/TriaHook.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/TriaHook.cpp	(revision 3791)
+++ /issm/trunk/src/c/objects/Elements/TriaHook.cpp	(revision 3791)
@@ -0,0 +1,46 @@
+/*!\file TriaHook.c
+ * \brief: implementation of the TriaHook object
+ */
+
+/*Headers:*/
+/*{{{1*/
+#ifdef HAVE_CONFIG_H
+	#include "config.h"
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "stdio.h"
+#include <string.h>
+#include "../objects.h"
+#include "../../EnumDefinitions/EnumDefinitions.h"
+#include "../../shared/shared.h"
+#include "../../DataSet/DataSet.h"
+#include "../../include/include.h"
+/*}}}*/
+
+/*Object constructors and destructor*/
+/*FUNCTION TriaHook::TriaHook(){{{1*/
+TriaHook::TriaHook(){
+}
+/*}}}*/
+/*FUNCTION TriaHook::~TriaHook(){{{1*/
+TriaHook::~TriaHook(){
+}
+/*}}}*/
+/*FUNCTION TriaHook::InitHookNodes(int* node_ids){{{1*/
+void TriaHook::InitHookNodes(int* node_ids){
+	this->hnodes.Init(node_ids,3);
+
+}
+/*}}}*/
+/*FUNCTION TriaHook::InitHookMatice(int matice_id){{{1*/
+void TriaHook::InitHookMatice(int matice_id){
+	this->hmatice.Init(&matice_id,1);
+}
+
+/*FUNCTION TriaHook::InitHookMatpar(int matpar_id){{{1*/
+void TriaHook::InitHookMatpar(int matpar_id){
+	this->hmatpar.Init(&matpar_id,1);
+}
+
Index: /issm/trunk/src/c/objects/Elements/TriaHook.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/TriaHook.h	(revision 3791)
+++ /issm/trunk/src/c/objects/Elements/TriaHook.h	(revision 3791)
@@ -0,0 +1,30 @@
+/*!\file: TriaHook.h
+ * \brief prototypes for TriaHook.h
+ */ 
+
+#ifndef _TRIAHOOK_H_
+#define  _TRIAHOOK_H_
+
+class Hook;
+
+class TriaHook{
+
+	public: 
+		Hook hnodes;
+		Hook hmatice;
+		Hook hmatpar;
+
+
+		/*FUNCTION constructors, destructors {{{1*/
+		TriaHook();
+		~TriaHook();
+		void InitHookNodes(int* node_ids);
+		void InitHookMatice(int matice_id);
+		void InitHookMatpar(int matpar_id);
+		/*}}}*/
+
+};
+
+
+#endif //ifndef _TRIAHOOK_H_
+
Index: /issm/trunk/src/c/objects/Hook.cpp
===================================================================
--- /issm/trunk/src/c/objects/Hook.cpp	(revision 3790)
+++ /issm/trunk/src/c/objects/Hook.cpp	(revision 3791)
@@ -66,4 +66,32 @@
 /*FUNCTION Hook::Hook(Hook* input) {{{1*/
 Hook::Hook(Hook* input){
+
+	int i;
+	Object** input_objects=NULL;
+	int*     input_ids=NULL;
+	int*     input_offsets=NULL;
+
+	/*get internals of input: */
+	this->num=input->GetNum();
+	input_objects=input->GetObjects();
+	input_ids=input->Ids();
+	input_offsets=input->GetOffsets();
+
+	if(this->num){
+		this->objects=(Object**)xmalloc(this->num*sizeof(Object*));
+		this->ids=(int*)xmalloc(this->num*sizeof(int));
+		this->offsets=(int*)xmalloc(this->num*sizeof(int));
+	}
+	
+
+	for(i=0;i<this->num;i++){
+		this->objects[i]=input_objects[i];
+		this->offsets[i]=input_offsets[i];
+		this->ids[i]=input_ids[i];
+	}
+}
+/*}}}*/
+/*FUNCTION Hook::Hook(Hook* input) {{{1*/
+void Hook::copy(Hook* input){
 
 	int i;
Index: /issm/trunk/src/c/objects/Hook.h
===================================================================
--- /issm/trunk/src/c/objects/Hook.h	(revision 3790)
+++ /issm/trunk/src/c/objects/Hook.h	(revision 3791)
@@ -31,4 +31,5 @@
 		Hook(Object** objects, int* ids, int* offsets,int num);
 		Hook(Hook* hook);
+		void copy(Hook* hook);
 		~Hook();
 		void       Marshall(char** pmarshalled_dataset);
Index: /issm/trunk/src/c/parallel/prognostic_core.cpp
===================================================================
--- /issm/trunk/src/c/parallel/prognostic_core.cpp	(revision 3790)
+++ /issm/trunk/src/c/parallel/prognostic_core.cpp	(revision 3791)
@@ -17,7 +17,4 @@
 	Result* result=NULL;
 
-	/*intermediary: */
-	Vec u_g=NULL;
-
 	/*solutions: */
 	Vec h_g=NULL;
@@ -25,7 +22,4 @@
 	/*flags: */
 	int verbose=0;
-	int numberofdofspernode;
-	int numberofnodes;
-	int dofs[2]={1,1};
 
 	/*fem prognostic model: */
@@ -38,25 +32,23 @@
 	//first recover parameters common to all solutions
 	model->FindParam(&verbose,VerboseEnum);
-	model->FindParam(&numberofnodes,NumberOfNodesEnum);
-	model->FindParam(&numberofdofspernode,NumberOfDofsPerNodeEnum);
 
 	_printf_("depth averaging velocity...\n");
-	//u_g=inputs->Get("velocity",&dofs[0],2); 
-	ISSMERROR("not supported yet!");
-	FieldDepthAveragex( u_g, fem_p->elements,fem_p->nodes, fem_p->vertices,fem_p->loads, fem_p->materials,fem_p->parameters,"velocity");
-	//inputs->Add("velocity_average",u_g,2,numberofnodes);
+	DepthAverageInputx(fem_p->elements,fem_p->nodes, fem_p->vertices,fem_p->loads, fem_p->materials,fem_p->parameters,VxEnum);
+	DepthAverageInputx(fem_p->elements,fem_p->nodes, fem_p->vertices,fem_p->loads, fem_p->materials,fem_p->parameters,VyEnum);
 	
 	_printf_("call computational core:\n");
 	diagnostic_core_linear(&h_g,fem_p,PrognosticAnalysisEnum,NoneAnalysisEnum);
+		
+	_printf_("update inputs:\n");
+	fem_p->UpdateInputsFromSolution(h_g,PrognosticAnalysisEnum,NoneAnalysisEnum);
 
 	_printf_("extrude computed thickness on all layers:\n");
-	FieldExtrudex( h_g, fem_p->elements,fem_p->nodes, fem_p->vertices,fem_p->loads, fem_p->materials,fem_p->parameters,"thickness",0);
-
-	/*Plug results into output dataset: */
-	result=new Result(results->Size()+1,0,1,"h_g",h_g);
+	ExtrudeInputx(fem_p->elements,fem_p->nodes, fem_p->vertices,fem_p->loads, fem_p->materials,fem_p->parameters,ThicknessEnum);
+	
+	_printf_("extract result from extruded inputs: \n");
+	InputToResult(&result,fem_p->elements,fem_p->nodes, fem_p->vertices,fem_p->loads, fem_p->materials,fem_p->parameters,ThicknessEnum,results->Size()+1,0,1);
 	results->AddObject(result);
 
 	/*Free ressources:*/
-	VecFree(&u_g);
 	VecFree(&h_g);
 }
