Index: /issm/trunk/src/c/Container/DataSet.cpp
===================================================================
--- /issm/trunk/src/c/Container/DataSet.cpp	(revision 6199)
+++ /issm/trunk/src/c/Container/DataSet.cpp	(revision 6200)
@@ -234,4 +234,10 @@
 				dataset->AddObject(pentavertexinput);}
 				break;
+			case ControlInputEnum:{
+			   ControlInput* controlinputinput=NULL;
+				controlinputinput=new ControlInput();
+				controlinputinput->Demarshall(&marshalled_dataset);
+				dataset->AddObject(controlinputinput);}
+				break;
 			case TriaVertexElementResultEnum:{
 				TriaVertexElementResult* triavertexelementresult=NULL;
Index: /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 6199)
+++ /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 6200)
@@ -127,4 +127,5 @@
 	PentaVertexInputEnum,
 	TriaVertexInputEnum,
+	ControlInputEnum,
 	/*Params: */
 	ParamEnum,
@@ -321,5 +322,4 @@
 	OldGradientEnum,
 	ConnectivityEnum,
-	ControlParameterEnum,
 	ControlSteadyEnum,
 	DakotaParameterEnum,
Index: /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp	(revision 6199)
+++ /issm/trunk/src/c/EnumDefinitions/EnumToString.cpp	(revision 6200)
@@ -110,4 +110,5 @@
 		case PentaVertexInputEnum : return "PentaVertexInput";
 		case TriaVertexInputEnum : return "TriaVertexInput";
+		case ControlInputEnum : return "ControlInput";
 		case ParamEnum : return "Param";
 		case BoolParamEnum : return "BoolParam";
@@ -283,5 +284,4 @@
 		case OldGradientEnum : return "OldGradient";
 		case ConnectivityEnum : return "Connectivity";
-		case ControlParameterEnum : return "ControlParameter";
 		case ControlSteadyEnum : return "ControlSteady";
 		case DakotaParameterEnum : return "DakotaParameter";
Index: /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp	(revision 6199)
+++ /issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp	(revision 6200)
@@ -108,4 +108,5 @@
 	else if (strcmp(name,"PentaVertexInput")==0) return PentaVertexInputEnum;
 	else if (strcmp(name,"TriaVertexInput")==0) return TriaVertexInputEnum;
+	else if (strcmp(name,"ControlInput")==0) return ControlInputEnum;
 	else if (strcmp(name,"Param")==0) return ParamEnum;
 	else if (strcmp(name,"BoolParam")==0) return BoolParamEnum;
@@ -281,5 +282,4 @@
 	else if (strcmp(name,"OldGradient")==0) return OldGradientEnum;
 	else if (strcmp(name,"Connectivity")==0) return ConnectivityEnum;
-	else if (strcmp(name,"ControlParameter")==0) return ControlParameterEnum;
 	else if (strcmp(name,"ControlSteady")==0) return ControlSteadyEnum;
 	else if (strcmp(name,"DakotaParameter")==0) return DakotaParameterEnum;
Index: /issm/trunk/src/c/Makefile.am
===================================================================
--- /issm/trunk/src/c/Makefile.am	(revision 6199)
+++ /issm/trunk/src/c/Makefile.am	(revision 6200)
@@ -150,4 +150,6 @@
 					./objects/Inputs/DoubleInput.h\
 					./objects/Inputs/DoubleInput.cpp\
+					./objects/Inputs/ControlInput.h\
+					./objects/Inputs/ControlInput.cpp\
 					./objects/Elements/Penta.h\
 					./objects/Elements/Penta.cpp\
@@ -544,4 +546,8 @@
 					./modules/MassFluxx/MassFluxx.cpp\
 					./modules/MassFluxx/MassFluxx.h\
+					./modules/ControlInputGetGradientx/ControlInputGetGradientx.cpp\
+					./modules/ControlInputGetGradientx/ControlInputGetGradientx.h\
+					./modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp\
+					./modules/ControlInputSetGradientx/ControlInputSetGradientx.h\
 					./modules/SystemMatricesx/SystemMatricesx.cpp\
 					./modules/SystemMatricesx/SystemMatricesx.h\
@@ -715,4 +721,6 @@
 					./objects/Inputs/DoubleInput.h\
 					./objects/Inputs/DoubleInput.cpp\
+					./objects/Inputs/ControlInput.h\
+					./objects/Inputs/ControlInput.cpp\
 					./objects/Elements/Penta.h\
 					./objects/Elements/Penta.cpp\
@@ -1101,4 +1109,8 @@
 					./modules/MassFluxx/MassFluxx.cpp\
 					./modules/MassFluxx/MassFluxx.h\
+					./modules/ControlInputGetGradientx/ControlInputGetGradientx.cpp\
+					./modules/ControlInputGetGradientx/ControlInputGetGradientx.h\
+					./modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp\
+					./modules/ControlInputSetGradientx/ControlInputSetGradientx.h\
 					./modules/SystemMatricesx/SystemMatricesx.cpp\
 					./modules/SystemMatricesx/SystemMatricesx.h\
Index: /issm/trunk/src/c/modules/ControlInputGetGradientx/ControlInputGetGradientx.cpp
===================================================================
--- /issm/trunk/src/c/modules/ControlInputGetGradientx/ControlInputGetGradientx.cpp	(revision 6200)
+++ /issm/trunk/src/c/modules/ControlInputGetGradientx/ControlInputGetGradientx.cpp	(revision 6200)
@@ -0,0 +1,26 @@
+/*!\file ControlInputGetGradientx
+ * \brief retrieve gradient from inputs in elements
+ */
+
+#include "./ControlInputGetGradientx.h"
+#include "../../shared/shared.h"
+#include "../../include/include.h"
+#include "../../toolkits/toolkits.h"
+#include "../../EnumDefinitions/EnumDefinitions.h"
+
+void ControlInputGetGradientx( Vec* pgradient, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, int NameEnum){
+
+	Vec gradient=NULL;
+	gradient=NewVec(vertices->NumberOfVertices());
+
+	for(int i=0;i<elements->Size();i++){
+		Element* element=(Element*)elements->GetObjectByOffset(i);
+		element->ControlInputGetGradient(gradient,NameEnum);
+	}
+
+	VecAssemblyBegin(gradient);
+	VecAssemblyEnd(gradient);
+
+	/*Assign output pointers:*/
+	*pgradient=gradient;
+}
Index: /issm/trunk/src/c/modules/ControlInputGetGradientx/ControlInputGetGradientx.h
===================================================================
--- /issm/trunk/src/c/modules/ControlInputGetGradientx/ControlInputGetGradientx.h	(revision 6200)
+++ /issm/trunk/src/c/modules/ControlInputGetGradientx/ControlInputGetGradientx.h	(revision 6200)
@@ -0,0 +1,12 @@
+/*!\file:  ControlInputGetGradientx.h
+ */ 
+
+#ifndef _CONTROLINPUTGETGRADIENTX_H
+#define _CONTROLINPUTGETGRADIENTX_H
+
+#include "../../objects/objects.h"
+#include "../../Container/Container.h"
+
+void	ControlInputGetGradientx( Vec* pgradient, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,int NameEnum);
+
+#endif
Index: /issm/trunk/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp
===================================================================
--- /issm/trunk/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp	(revision 6200)
+++ /issm/trunk/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp	(revision 6200)
@@ -0,0 +1,29 @@
+/*!\file ControlInputSetGradientx
+ * \brief retrieve gradient from inputs in elements
+ */
+
+#include "./ControlInputSetGradientx.h"
+#include "../../shared/shared.h"
+#include "../../include/include.h"
+#include "../../toolkits/toolkits.h"
+#include "../../EnumDefinitions/EnumDefinitions.h"
+
+void ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, int NameEnum,double* gradient){
+
+	for(int i=0;i<elements->Size();i++){
+		Element* element=(Element*)elements->GetObjectByOffset(i);
+		element->ControlInputSetGradient(gradient,NameEnum);
+	}
+
+}
+void ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, int NameEnum,Vec gradient){
+
+	/*Serialize gradient*/
+	double* serial_gradient=NULL;
+	VecToMPISerial(&serial_gradient,gradient);
+
+	ControlInputSetGradientx(elements,nodes,vertices, loads, materials, parameters, NameEnum,serial_gradient);
+
+	/*Clean up and return*/
+	xfree((void**)&serial_gradient);
+}
Index: /issm/trunk/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.h
===================================================================
--- /issm/trunk/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.h	(revision 6200)
+++ /issm/trunk/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.h	(revision 6200)
@@ -0,0 +1,13 @@
+/*!\file:  ControlInputSetGradientx.h
+ */ 
+
+#ifndef _CONTROLINPUTSSETGRADIENTX_H
+#define _CONTROLINPUTSSETGRADIENTX_H
+
+#include "../../objects/objects.h"
+#include "../../Container/Container.h"
+
+void	ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,int NameEnum,double* gradient);
+void	ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,int NameEnum,Vec gradient);
+
+#endif
Index: /issm/trunk/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 6199)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 6200)
@@ -71,5 +71,4 @@
 
 		IoModelFetchData(&control_parameter,NULL,NULL,iomodel_handle,EnumToModelField(iomodel->control_type));
-		parameters->AddObject(new DoubleVecParam(ControlParameterEnum,control_parameter,iomodel->nsteps));
 		xfree((void**)&control_parameter);
 	}
Index: /issm/trunk/src/c/modules/modules.h
===================================================================
--- /issm/trunk/src/c/modules/modules.h	(revision 6199)
+++ /issm/trunk/src/c/modules/modules.h	(revision 6200)
@@ -19,4 +19,6 @@
 #include "./ContourToMeshx/ContourToMeshx.h"
 #include "./ContourToNodesx/ContourToNodesx.h"
+#include "./ControlInputGetGradientx/ControlInputGetGradientx.h"
+#include "./ControlInputSetGradientx/ControlInputSetGradientx.h"
 #include "./CostFunctionx/CostFunctionx.h"
 #include "./CreateNodalConstraintsx/CreateNodalConstraintsx.h"
Index: /issm/trunk/src/c/objects/Elements/Element.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Element.h	(revision 6199)
+++ /issm/trunk/src/c/objects/Elements/Element.h	(revision 6200)
@@ -58,4 +58,6 @@
 		virtual void   UpdateGeometry(void)=0;
 		virtual void   InputToResult(int enum_type,int step,double time)=0;
+		virtual void   ControlInputGetGradient(Vec gradient,int enum_type)=0;
+		virtual void   ControlInputSetGradient(double* gradient,int enum_type)=0;
 		virtual void   ProcessResultsUnits(void)=0;
 		virtual void   MinVel(double* pminvel, bool process_units)=0;
Index: /issm/trunk/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 6199)
+++ /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 6200)
@@ -627,4 +627,45 @@
 }
 /*}}}*/
+/*FUNCTION Penta::ControlInputGetGradient{{{1*/
+void Penta::ControlInputGetGradient(Vec gradient,int enum_type){
+
+	int doflist1[NUMVERTICES];
+	Input* input=NULL;
+
+	if(enum_type==RheologyBbarEnum){
+		if(!IsOnBed()) return;
+		input=(Input*)matice->inputs->GetInput(RheologyBEnum);
+	}
+	else{
+		input=inputs->GetInput(enum_type);
+	}
+	if (!input) ISSMERROR("Input %s not found",EnumToString(enum_type));
+
+	this->GetDofList1(&doflist1[0]);
+	((ControlInput*)input)->GetGradient(gradient,&doflist1[0]);
+
+}/*}}}*/
+/*FUNCTION Penta::ControlInputSetGradient{{{1*/
+void Penta::ControlInputSetGradient(double* gradient,int enum_type){
+
+	int    doflist1[NUMVERTICES];
+	double grad_list[NUMVERTICES];
+	Input* grad_input=NULL;
+	Input* input=NULL;
+
+	if(enum_type==RheologyBbarEnum){
+		input=(Input*)matice->inputs->GetInput(RheologyBEnum);
+	}
+	else{
+		input=inputs->GetInput(enum_type);
+	}
+	if (!input) ISSMERROR("Input %s not found",EnumToString(enum_type));
+
+	this->GetDofList1(&doflist1[0]);
+	for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[doflist1[i]];
+	grad_input=new PentaVertexInput(GradientEnum,grad_list);
+	((ControlInput*)input)->SetGradient(grad_input);
+
+}/*}}}*/
 /*FUNCTION Penta::RegularizeInversion {{{1*/
 double Penta::RegularizeInversion(void){
@@ -918,7 +959,7 @@
 
 	/*Intermediary*/
+	int    control_type;
 	Input* input=NULL;
 	double cm_min,cm_max;
-	int    control_type;
 
 	/*retrieve some parameters: */
@@ -927,52 +968,20 @@
 	this->parameters->FindParam(&control_type,ControlTypeEnum);
 
-	/*Rheology*/
 	if(control_type==RheologyBbarEnum){
-
-		/*The update is done by the element on bed only*/
 		if (!IsOnBed()) return;
-
-		/*First, get revert to previous parameter value (kept in ControlParameter input)*/
-		matice->inputs->DuplicateInput(ControlParameterEnum,RheologyBEnum);
-
-		/*Now, update using the gradient new = old + scalar * gradient*/
-		//matice->inputs->AXPY(RheologyBbarEnum,scalar,GradientEnum);
-		// For now: Gradient is in element (TO BE CHANGED) and parameter in matice
-		Input* input_B   =(Input*)matice->inputs->GetInput(RheologyBEnum); ISSMASSERT(input_B);
-		Input* input_Grad=(Input*)this->inputs->GetInput(GradientEnum); ISSMASSERT(input_Grad);
-		input_B->AXPY(input_Grad,scalar);
-
-		/*Constrain constrain input*/
 		input=(Input*)matice->inputs->GetInput(RheologyBEnum); ISSMASSERT(input);
-		input->Constrain(cm_min,cm_max);
-
-		/*OK, now we can propagate the new parameter up*/
+	}
+	else{
+		input=(Input*)this->inputs->GetInput(control_type);   ISSMASSERT(input);
+	}
+
+	if (input->Enum()!=ControlInputEnum) ISSMERROR("input %s is not a ControlInput",EnumToString(control_type));
+
+	((ControlInput*)input)->UpdateValue(scalar);
+	input->Constrain(cm_min,cm_max);
+	if (save_parameter) ((ControlInput*)input)->SaveValue();
+
+	if(control_type==RheologyBbarEnum){
 		this->InputExtrude(RheologyBEnum,MaterialsEnum);
-
-		/*Finally: save input if requested*/
-		if (save_parameter){
-			matice->inputs->DuplicateInput(RheologyBEnum,ControlParameterEnum);
-			this->InputExtrude(ControlParameterEnum,MaterialsEnum);
-		}
-
-	}
-	else if(control_type==DragCoefficientEnum){
-
-		/*First, get revert to previous parameter value (kept in ControlParameter input)*/
-		this->inputs->DuplicateInput(ControlParameterEnum,DragCoefficientEnum);
-
-		/*Now, update using the gradient new = old + scalar * gradient*/
-		this->inputs->AXPY(DragCoefficientEnum,scalar,GradientEnum);
-
-		/*Constrain input*/
-		input=(Input*)this->inputs->GetInput(DragCoefficientEnum); ISSMASSERT(input);
-		input->Constrain(cm_min,cm_max);
-
-		/*Finally: save input if requested*/
-		if (save_parameter) inputs->DuplicateInput(DragCoefficientEnum,ControlParameterEnum);
-
-	}
-	else{
-		ISSMERROR("control type %s not implemented yet",EnumToString(control_type));
 	}
 }
@@ -1022,4 +1031,6 @@
 			if (original_input->Enum()==PentaVertexInputEnum)
 			 total_integrated_input=new PentaVertexInput(average_enum_type,zeros_list);
+			else if (original_input->Enum()==ControlInputEnum)
+			 total_integrated_input=new PentaVertexInput(average_enum_type,zeros_list);
 			else if (original_input->Enum()==DoubleInputEnum)
 			 total_integrated_input=new DoubleInput(average_enum_type,0.0);
@@ -1118,10 +1129,6 @@
 
 	/*Go through all the input objects, and find the one corresponding to enum_type, if it exists: */
-	if (enum_type==RheologyBbarEnum){
-		input=this->matice->inputs->GetInput(RheologyBEnum);
-	}
-	else{
-		input=this->inputs->GetInput(enum_type);
-	}
+	if (enum_type==RheologyBbarEnum) input=this->matice->inputs->GetInput(RheologyBEnum);
+	else input=this->inputs->GetInput(enum_type);
 	if (!input) ISSMERROR("Input %s not found in penta->inputs",EnumToString(enum_type));
 
@@ -1129,4 +1136,5 @@
 	 * object out of the input, with the additional step and time information: */
 	this->results->AddObject((Object*)input->SpawnResult(step,time));
+	if(input->Enum()==ControlInputEnum) this->results->AddObject((Object*)((ControlInput*)input)->SpawnGradient(step,time));
 
 }
@@ -1742,8 +1750,4 @@
 		this->inputs->AddInput(new IntInput(DragTypeEnum,iomodel->drag_type));
 
-	}
-	if (iomodel->control_parameter) {
-		for(i=0;i<6;i++)nodeinputs[i]=iomodel->control_parameter[penta_vertex_ids[i]-1];
-		this->inputs->AddInput(new PentaVertexInput(ControlParameterEnum,nodeinputs));
 	}
 	if (iomodel->melting_rate) {
@@ -1882,5 +1886,38 @@
 			/*No update for other solution types*/
 			break;
-
+	}
+
+	/*Control Inputs*/
+	if (iomodel->control_analysis){
+		switch(iomodel->control_type){
+			case DhDtEnum:
+				if (iomodel->dhdt){
+					for(i=0;i<6;i++)nodeinputs[i]=iomodel->dhdt[penta_vertex_ids[i]-1]/iomodel->yts;
+					this->inputs->AddInput(new ControlInput(DhDtEnum,PentaVertexInputEnum,nodeinputs));
+				}
+				break;
+			case VxEnum:
+				if (iomodel->vx){
+					for(i=0;i<6;i++)nodeinputs[i]=iomodel->vx[penta_vertex_ids[i]-1]/iomodel->yts;
+					this->inputs->AddInput(new ControlInput(VxEnum,PentaVertexInputEnum,nodeinputs));
+				}
+				break;
+			case VyEnum:
+				if (iomodel->vy){
+					for(i=0;i<6;i++)nodeinputs[i]=iomodel->vy[penta_vertex_ids[i]-1]/iomodel->yts;
+					this->inputs->AddInput(new ControlInput(VyEnum,PentaVertexInputEnum,nodeinputs));
+				}
+				break;
+			case DragCoefficientEnum:
+				if (iomodel->drag_coefficient){
+					for(i=0;i<6;i++)nodeinputs[i]=iomodel->drag_coefficient[penta_vertex_ids[i]-1];
+					this->inputs->AddInput(new ControlInput(DragCoefficientEnum,PentaVertexInputEnum,nodeinputs));
+				}
+				break;
+			case RheologyBbarEnum:
+				/*Matice will take care of it*/ break;
+			default:
+				ISSMERROR("Control %s not implemented yet",EnumToString(iomodel->control_type));
+		}
 	}
 
@@ -5357,5 +5394,4 @@
 				name==VzObsEnum ||
 				name==TemperatureEnum ||
-				name==ControlParameterEnum ||
 				name==CmResponseEnum ||
 				name==DragCoefficientEnum ||
Index: /issm/trunk/src/c/objects/Elements/Penta.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.h	(revision 6199)
+++ /issm/trunk/src/c/objects/Elements/Penta.h	(revision 6200)
@@ -93,4 +93,6 @@
 		void   InputDuplicate(int original_enum,int new_enum);
 		void   InputScale(int enum_type,double scale_factor);
+		void   ControlInputGetGradient(Vec gradient,int enum_type);
+		void   ControlInputSetGradient(double* gradient,int enum_type);
 		void   InputToResult(int enum_type,int step,double time);
 		double MassFlux(double* segment,bool process_units);
Index: /issm/trunk/src/c/objects/Elements/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 6199)
+++ /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 6200)
@@ -628,4 +628,45 @@
 }
 /*}}}*/
+/*FUNCTION Tria::ControlInputGetGradient{{{1*/
+void Tria::ControlInputGetGradient(Vec gradient,int enum_type){
+
+	int doflist1[NUMVERTICES];
+	Input* input=NULL;
+
+	if(enum_type==RheologyBbarEnum){
+		input=(Input*)matice->inputs->GetInput(enum_type);
+	}
+	else{
+		input=inputs->GetInput(enum_type);
+	}
+	if (!input) ISSMERROR("Input %s not found",EnumToString(enum_type));
+
+	this->GetDofList1(&doflist1[0]);
+	((ControlInput*)input)->GetGradient(gradient,&doflist1[0]);
+
+}/*}}}*/
+/*FUNCTION Tria::ControlInputSetGradient{{{1*/
+void Tria::ControlInputSetGradient(double* gradient,int enum_type){
+
+	int    doflist1[NUMVERTICES];
+	double grad_list[NUMVERTICES];
+	Input* grad_input=NULL;
+	Input* input=NULL;
+
+	if(enum_type==RheologyBbarEnum){
+		input=(Input*)matice->inputs->GetInput(enum_type);
+	}
+	else{
+		input=inputs->GetInput(enum_type);
+	}
+	if (!input) ISSMERROR("Input %s not found",EnumToString(enum_type));
+
+	this->GetDofList1(&doflist1[0]);
+	for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[doflist1[i]];
+	grad_input=new TriaVertexInput(GradientEnum,grad_list);
+
+	((ControlInput*)input)->SetGradient(grad_input);
+
+}/*}}}*/
 /*FUNCTION Tria::RegularizeInversion {{{1*/
 double Tria::RegularizeInversion(){
@@ -1155,63 +1196,18 @@
 	this->parameters->FindParam(&control_type,ControlTypeEnum);
 
-	/*Rheology*/
-	switch(control_type){
-
-		case RheologyBbarEnum:{
-
-			/*First, get revert to previous parameter value (kept in ControlParameter input)*/
-			matice->inputs->DuplicateInput(ControlParameterEnum,RheologyBbarEnum);
-
-			/*Now, update using the gradient new = old + scalar * gradient*/
-			//matice->inputs->AXPY(RheologyBbarEnum,scalar,GradientEnum);
-			// For now: Gradient is in element (TO BE CHANGED) and parameter in matice
-			Input* input_B   =(Input*)matice->inputs->GetInput(RheologyBbarEnum); ISSMASSERT(input_B);
-			Input* input_Grad=(Input*)this->inputs->GetInput(GradientEnum); ISSMASSERT(input_Grad);
-			input_B->AXPY(input_Grad,scalar);
-
-			/*Constrain constrain input*/
-			input=(Input*)matice->inputs->GetInput(RheologyBbarEnum); ISSMASSERT(input);
-			input->Constrain(cm_min,cm_max);
-
-			/*Finally: save input if requested*/
-			if (save_parameter) matice->inputs->DuplicateInput(RheologyBbarEnum,ControlParameterEnum);
-									 }
-			break;
-
-		case DragCoefficientEnum:{
-			this->inputs->DuplicateInput(ControlParameterEnum,DragCoefficientEnum);
-			this->inputs->AXPY(DragCoefficientEnum,scalar,GradientEnum);
-			input=(Input*)this->inputs->GetInput(DragCoefficientEnum); ISSMASSERT(input);
-			input->Constrain(cm_min,cm_max);
-			if (save_parameter) inputs->DuplicateInput(DragCoefficientEnum,ControlParameterEnum);
-										 }
-			break;
-		case DhDtEnum:{
-			this->inputs->DuplicateInput(ControlParameterEnum,DhDtEnum);
-			this->inputs->AXPY(DhDtEnum,scalar,GradientEnum);
-			input=(Input*)this->inputs->GetInput(DhDtEnum); ISSMASSERT(input);
-			input->Constrain(cm_min,cm_max);
-			if (save_parameter) inputs->DuplicateInput(DhDtEnum,ControlParameterEnum);
-						  }
-			break;
-		case VxEnum:{
-			this->inputs->DuplicateInput(ControlParameterEnum,VxEnum);
-			this->inputs->AXPY(VxEnum,scalar,GradientEnum);
-			input=(Input*)this->inputs->GetInput(VxEnum); ISSMASSERT(input);
-			input->Constrain(cm_min,cm_max);
-			if (save_parameter) inputs->DuplicateInput(VxEnum,ControlParameterEnum);
-						  }
-			break;
-		case VyEnum:{
-			this->inputs->DuplicateInput(ControlParameterEnum,VyEnum);
-			this->inputs->AXPY(VyEnum,scalar,GradientEnum);
-			input=(Input*)this->inputs->GetInput(VyEnum); ISSMASSERT(input);
-			input->Constrain(cm_min,cm_max);
-			if (save_parameter) inputs->DuplicateInput(VyEnum,ControlParameterEnum);
-						  }
-			break;
-		default:
-			ISSMERROR("control type %s not implemented yet",EnumToString(control_type));
-	}
+	if(control_type==RheologyBbarEnum){
+		input=(Input*)matice->inputs->GetInput(control_type); ISSMASSERT(input);
+	}
+	else{
+		input=(Input*)this->inputs->GetInput(control_type);   ISSMASSERT(input);
+	}
+
+	if (input->Enum()!=ControlInputEnum){
+		ISSMERROR("input %s is not a ControlInput",EnumToString(control_type));
+	}
+
+	((ControlInput*)input)->UpdateValue(scalar);
+	input->Constrain(cm_min,cm_max);
+	if (save_parameter) ((ControlInput*)input)->SaveValue();
 }
 /*}}}*/
@@ -1318,5 +1314,4 @@
 	if (enum_type==RheologyBbarEnum) input=this->matice->inputs->GetInput(enum_type);
 	else input=this->inputs->GetInput(enum_type);
-
 	if (!input) ISSMERROR("Input %s not found in tria->inputs",EnumToString(enum_type));
 
@@ -1324,4 +1319,5 @@
 	 * object out of the input, with the additional step and time information: */
 	this->results->AddObject((Object*)input->SpawnResult(step,time));
+	if(input->Enum()==ControlInputEnum) this->results->AddObject((Object*)((ControlInput*)input)->SpawnGradient(step,time));
 }
 /*}}}*/
@@ -2138,5 +2134,4 @@
 	/*Recover element type*/
 	if ((analysis_type==PrognosticAnalysisEnum || analysis_type==BalancedthicknessAnalysisEnum) && iomodel->prognostic_DG){
-
 		/*P1 Discontinuous Galerkin*/
 		tria_type=P1DGEnum;
@@ -2191,8 +2186,4 @@
 		this->inputs->AddInput(new IntInput(DragTypeEnum,iomodel->drag_type));
 	}
-	if (iomodel->control_parameter) {
-		for(i=0;i<3;i++)nodeinputs[i]=iomodel->control_parameter[tria_vertex_ids[i]-1];
-		this->inputs->AddInput(new TriaVertexInput(ControlParameterEnum,nodeinputs));
-	}
 	if (iomodel->thickness_obs) {
 		for(i=0;i<3;i++)nodeinputs[i]=iomodel->thickness_obs[tria_vertex_ids[i]-1];
@@ -2211,9 +2202,9 @@
 		this->inputs->AddInput(new TriaVertexInput(GeothermalFluxEnum,nodeinputs));
 	}
-	if (iomodel->dhdt) {
+	if (iomodel->dhdt){
 		for(i=0;i<3;i++)nodeinputs[i]=iomodel->dhdt[tria_vertex_ids[i]-1]/iomodel->yts;
 		this->inputs->AddInput(new TriaVertexInput(DhDtEnum,nodeinputs));
 	}
-	if (iomodel->pressure) {
+	if (iomodel->pressure){
 		for(i=0;i<3;i++)nodeinputs[i]=iomodel->pressure[tria_vertex_ids[i]-1];
 		this->inputs->AddInput(new TriaVertexInput(PressureEnum,nodeinputs));
@@ -2305,4 +2296,39 @@
 	}
 
+	/*Control Inputs*/
+	if (iomodel->control_analysis){
+		switch(iomodel->control_type){
+			case DhDtEnum:
+				if (iomodel->dhdt){
+					for(i=0;i<3;i++)nodeinputs[i]=iomodel->dhdt[tria_vertex_ids[i]-1]/iomodel->yts;
+					this->inputs->AddInput(new ControlInput(DhDtEnum,TriaVertexInputEnum,nodeinputs));
+				}
+				break;
+			case VxEnum:
+				if (iomodel->vx){
+					for(i=0;i<3;i++)nodeinputs[i]=iomodel->vx[tria_vertex_ids[i]-1]/iomodel->yts;
+					this->inputs->AddInput(new ControlInput(VxEnum,TriaVertexInputEnum,nodeinputs));
+				}
+				break;
+			case VyEnum:
+				if (iomodel->vy){
+					for(i=0;i<3;i++)nodeinputs[i]=iomodel->vy[tria_vertex_ids[i]-1]/iomodel->yts;
+					this->inputs->AddInput(new ControlInput(VyEnum,TriaVertexInputEnum,nodeinputs));
+				}
+				break;
+			case DragCoefficientEnum:
+				if (iomodel->drag_coefficient){
+					for(i=0;i<3;i++)nodeinputs[i]=iomodel->drag_coefficient[tria_vertex_ids[i]-1];
+					this->inputs->AddInput(new ControlInput(DragCoefficientEnum,TriaVertexInputEnum,nodeinputs));
+				}
+				break;
+			case RheologyBbarEnum:
+				/*Matice will take care of it*/ break;
+			default:
+				ISSMERROR("Control %s not implemented yet",EnumToString(iomodel->control_type));
+		}
+
+	}
+
 	//this->parameters: we still can't point to it, it may not even exist. Configure will handle this.
 	this->parameters=NULL;
@@ -4981,5 +5007,4 @@
 				name==AccumulationRateEnum ||
 				name==SurfaceAreaEnum||
-				name==ControlParameterEnum ||
 				name==VxEnum ||
 				name==VyEnum ||
Index: /issm/trunk/src/c/objects/Elements/Tria.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.h	(revision 6199)
+++ /issm/trunk/src/c/objects/Elements/Tria.h	(revision 6200)
@@ -94,4 +94,6 @@
 		void   InputDuplicate(int original_enum,int new_enum);
 		void   InputScale(int enum_type,double scale_factor);
+		void   ControlInputGetGradient(Vec gradient,int enum_type);
+		void   ControlInputSetGradient(double* gradient,int enum_type);
 		void   InputToResult(int enum_type,int step,double time);
 		void   DeleteResults(void);
Index: /issm/trunk/src/c/objects/Inputs/ControlInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/ControlInput.cpp	(revision 6200)
+++ /issm/trunk/src/c/objects/Inputs/ControlInput.cpp	(revision 6200)
@@ -0,0 +1,336 @@
+/*!\file ControlInput.c
+ * \brief: implementation of the ControlInput object
+ */
+
+#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 "../../Container/Container.h"
+#include "../../include/include.h"
+
+/*ControlInput constructors and destructor*/
+/*FUNCTION ControlInput::ControlInput(){{{1*/
+ControlInput::ControlInput(){
+	values     =NULL;
+	savedvalues =NULL;
+	gradient   =NULL;
+}
+/*}}}*/
+/*FUNCTION ControlInput::ControlInput(int enum_type,int enum_input,double* pvalues){{{1*/
+ControlInput::ControlInput(int in_enum_type,int enum_input,double* pvalues){
+	enum_type=in_enum_type;
+	switch(enum_input){
+		case TriaVertexInputEnum:
+			values     =new TriaVertexInput(enum_type,pvalues);
+			savedvalues=new TriaVertexInput(enum_type,pvalues);
+			break;
+		case PentaVertexInputEnum:
+			values     =new PentaVertexInput(enum_type,pvalues);
+			savedvalues=new PentaVertexInput(enum_type,pvalues);
+			break;
+		default:
+			ISSMERROR("Input of Enum %s not supported yet by ControlInput",EnumToString(enum_input));
+	}
+	gradient   =NULL;
+}
+/*}}}*/
+/*FUNCTION ControlInput::~ControlInput(){{{1*/
+ControlInput::~ControlInput(){
+	delete values;
+	delete savedvalues;
+	delete gradient;
+}
+/*}}}*/
+
+/*Object virtual functions definitions:*/
+		/*FUNCTION ControlInput::Echo {{{1*/
+void ControlInput::Echo(void){
+	this->DeepEcho();
+}
+/*}}}*/
+/*FUNCTION ControlInput::DeepEcho{{{1*/
+void ControlInput::DeepEcho(void){
+
+	printf("ControlInput:\n");
+	printf("   enum: %i (%s)\n",this->enum_type,EnumToString(this->enum_type));
+	printf("---values: \n");      if (values)      values->Echo();
+	printf("---savedvalues: \n"); if (savedvalues) savedvalues->Echo();
+	printf("---gradient: \n");    if (gradient)    gradient->Echo();
+}
+/*}}}*/
+/*FUNCTION ControlInput::Id{{{1*/
+int    ControlInput::Id(void){ return -1; }
+/*}}}*/
+/*FUNCTION ControlInput::MyRank{{{1*/
+int    ControlInput::MyRank(void){ 
+	extern int my_rank;
+	return my_rank; 
+}
+/*}}}*/
+/*FUNCTION ControlInput::Marshall{{{1*/
+void  ControlInput::Marshall(char** pmarshalled_dataset){
+
+	char* marshalled_dataset=NULL;
+	int   enum_value=0;
+	int   flag;
+
+	/*recover marshalled_dataset: */
+	marshalled_dataset=*pmarshalled_dataset;
+
+	/*get enum value of ControlInput: */
+	enum_value=ControlInputEnum;
+	
+	/*marshall enum: */
+	memcpy(marshalled_dataset,&enum_value,sizeof(enum_value));marshalled_dataset+=sizeof(enum_value);
+	
+	/*marshall enum_type: */
+	memcpy(marshalled_dataset,&enum_type,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type);
+
+	/*marshal values*/
+	if(!values){
+		flag=0;
+		memcpy(marshalled_dataset,&flag,sizeof(flag));marshalled_dataset+=sizeof(flag);
+	}
+	else{
+		flag=1;
+		memcpy(marshalled_dataset,&flag,sizeof(flag));marshalled_dataset+=sizeof(flag);
+		this->values->Marshall(&marshalled_dataset);
+	}
+
+	/*marshal savedvalues*/
+	if(!savedvalues){
+		flag=0;
+		memcpy(marshalled_dataset,&flag,sizeof(flag));marshalled_dataset+=sizeof(flag);
+	}
+	else{
+		flag=1;
+		memcpy(marshalled_dataset,&flag,sizeof(flag));marshalled_dataset+=sizeof(flag);
+		this->savedvalues->Marshall(&marshalled_dataset);
+	}
+
+	/*marshal gradient*/
+	if(!gradient){
+		flag=0;
+		memcpy(marshalled_dataset,&flag,sizeof(flag));marshalled_dataset+=sizeof(flag);
+	}
+	else{
+		flag=1;
+		memcpy(marshalled_dataset,&flag,sizeof(flag));marshalled_dataset+=sizeof(flag);
+		this->gradient->Marshall(&marshalled_dataset);
+	}
+
+	/*clean up and assign output pointer*/
+	*pmarshalled_dataset=marshalled_dataset;
+}
+/*}}}*/
+/*FUNCTION ControlInput::MarshallSize{{{1*/
+int   ControlInput::MarshallSize(){
+	
+	int size=0;
+
+	size=sizeof(enum_type)+
+	  +3*sizeof(int) //3 flags
+	  +sizeof(int); //sizeof(int) for enum value
+
+	if(values)     size+=values->MarshallSize();
+	if(savedvalues)size+=savedvalues->MarshallSize();
+	if(gradient)   size+=gradient->MarshallSize();
+	return size;
+}
+/*}}}*/
+/*FUNCTION ControlInput::Demarshall{{{1*/
+void  ControlInput::Demarshall(char** pmarshalled_dataset){
+
+	char* marshalled_dataset=NULL;
+	int   flag,input_enum_type;
+
+	/*recover marshalled_dataset: */
+	marshalled_dataset=*pmarshalled_dataset;
+
+	/*this time, no need to get enum type, the pointer directly points to the beginning of the 
+	 *object data (thanks to DataSet::Demarshall):*/
+	memcpy(&enum_type,marshalled_dataset,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type);
+
+	/*Demarshal values*/
+	memcpy(&flag,marshalled_dataset,sizeof(int));marshalled_dataset+=sizeof(int);
+	if(flag){
+		memcpy(&input_enum_type,marshalled_dataset,sizeof(int)); marshalled_dataset+=sizeof(int);
+		if(input_enum_type==PentaVertexInputEnum){
+			values=new PentaVertexInput();
+			values->Demarshall(&marshalled_dataset);
+		}
+		else if(input_enum_type==TriaVertexInputEnum){
+			values=new TriaVertexInput();
+			values->Demarshall(&marshalled_dataset);
+		}
+		else ISSMERROR("Not supported yet");
+	}
+	else{
+		values=NULL;
+	}
+
+	/*Demarshal savedvalues*/
+	memcpy(&flag,marshalled_dataset,sizeof(int));marshalled_dataset+=sizeof(int);
+	if(flag){
+		memcpy(&input_enum_type,marshalled_dataset,sizeof(int)); marshalled_dataset+=sizeof(int);
+		if(input_enum_type==PentaVertexInputEnum){
+			savedvalues=new PentaVertexInput();
+			savedvalues->Demarshall(&marshalled_dataset);
+		}
+		else if(input_enum_type==TriaVertexInputEnum){
+			savedvalues=new TriaVertexInput();
+			savedvalues->Demarshall(&marshalled_dataset);
+		}
+		else ISSMERROR("Not supported yet");
+	}
+	else{
+		savedvalues=NULL;
+	}
+
+	/*Demarshal gradient*/
+	memcpy(&flag,marshalled_dataset,sizeof(int));marshalled_dataset+=sizeof(int);
+	if(flag){
+		memcpy(&input_enum_type,marshalled_dataset,sizeof(int)); marshalled_dataset+=sizeof(int);
+		if(input_enum_type==PentaVertexInputEnum){
+			gradient=new PentaVertexInput();
+			gradient->Demarshall(&marshalled_dataset);
+		}
+		else if(input_enum_type==TriaVertexInputEnum){
+			gradient=new TriaVertexInput();
+			gradient->Demarshall(&marshalled_dataset);
+		}
+		else ISSMERROR("Not supported yet");
+	}
+	else{
+		gradient=NULL;
+	}
+
+	/*return: */
+	*pmarshalled_dataset=marshalled_dataset;
+	return;
+}
+/*}}}*/
+/*FUNCTION ControlInput::Enum{{{1*/
+int ControlInput::Enum(void){
+
+	return ControlInputEnum;
+
+}
+/*}}}*/
+/*FUNCTION ControlInput::copy{{{1*/
+Object* ControlInput::copy() {
+	
+	ControlInput* output=NULL;
+
+	output = new ControlInput();
+	output->enum_type=this->enum_type;
+
+	if(values)      output->values=(Input*)this->values->copy();
+	if(savedvalues) output->savedvalues=(Input*)this->savedvalues->copy();
+	if(gradient)    output->gradient=(Input*)this->gradient->copy();
+
+	return output;
+}
+/*}}}*/
+	
+/*ControlInput management*/
+/*FUNCTION ControlInput::EnumType{{{1*/
+int ControlInput::EnumType(void){
+
+	return this->enum_type;
+
+}
+/*}}}*/
+
+/*Object functions*/
+/*FUNCTION ControlInput::Constrain{{{1*/
+void ControlInput::Constrain(double cm_min, double cm_max){
+	values->Constrain(cm_min,cm_max);
+}/*}}}*/
+/*FUNCTION ControlInput::Extrude{{{1*/
+void ControlInput::Extrude(void){
+	values->Extrude();
+	savedvalues->Extrude();
+	//gradient->Extrude();
+}/*}}}*/
+/*FUNCTION ControlInput::GetGradient{{{1*/
+void ControlInput::GetGradient(Vec gradient_vec,int* doflist){
+	if(gradient) gradient->GetVectorFromInputs(gradient_vec,doflist);
+}/*}}}*/
+/*FUNCTION ControlInput::SetGradient{{{1*/
+void ControlInput::SetGradient(Input* gradient_in){
+	if(gradient) delete gradient;
+	gradient=gradient_in;
+}/*}}}*/
+/*FUNCTION ControlInput::SpawnResult{{{1*/
+ElementResult* ControlInput::SpawnResult(int step, double time){
+	return savedvalues->SpawnResult(step,time);
+}/*}}}*/
+/*FUNCTION ControlInput::SpawnTriaInput{{{1*/
+Input* ControlInput::SpawnTriaInput(int* indices){
+	return values->SpawnTriaInput(indices);
+}/*}}}*/
+/*FUNCTION ControlInput::SpawnGradient{{{1*/
+ElementResult* ControlInput::SpawnGradient(int step, double time){
+	gradient->SpawnResult(step,time);
+}/*}}}*/
+/*FUNCTION ControlInput::GetParameterAverage(double* pvalue){{{1*/
+void ControlInput::GetParameterAverage(double* pvalue){
+	values->GetParameterAverage(pvalue);
+}/*}}}*/
+/*FUNCTION ControlInput::GetParameterValue(bool* pvalue){{{1*/
+void ControlInput::GetParameterValue(bool* pvalue){
+	values->GetParameterValue(pvalue);
+}/*}}}*/
+/*FUNCTION ControlInput::GetParameterValue(int* pvalue){{{1*/
+void ControlInput::GetParameterValue(int* pvalue){
+	values->GetParameterValue(pvalue);
+}/*}}}*/
+/*FUNCTION ControlInput::GetParameterValue(double* pvalue){{{1*/
+void ControlInput::GetParameterValue(double* pvalue){
+	values->GetParameterValue(pvalue);
+}/*}}}*/
+/*FUNCTION ControlInput::GetParameterValue(double* pvalue){{{1*/
+void ControlInput::GetParameterValue(double* pvalue,GaussTria* gauss){
+	values->GetParameterValue(pvalue,gauss);
+}/*}}}*/
+/*FUNCTION ControlInput::GetParameterValue(double* pvalue){{{1*/
+void ControlInput::GetParameterValue(double* pvalue,GaussPenta* gauss){
+	values->GetParameterValue(pvalue,gauss);
+}/*}}}*/
+/*FUNCTION ControlInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss){{{1*/
+void ControlInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss){
+	values->GetParameterDerivativeValue(derivativevalues,xyz_list,gauss);
+}/*}}}*/
+/*FUNCTION ControlInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussPenta* gauss){{{1*/
+void ControlInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussPenta* gauss){
+	values->GetParameterDerivativeValue(derivativevalues,xyz_list,gauss);
+}/*}}}*/
+/*FUNCTION ControlInput::SaveValue{{{1*/
+void ControlInput::SaveValue(void){
+	if(!values) ISSMERROR("Values of %s not found",EnumToString(this->enum_type));
+
+	if(savedvalues) delete this->savedvalues;
+	this->savedvalues=(Input*)this->values->copy();
+}/*}}}*/
+/*FUNCTION ControlInput::UpdateValue{{{1*/
+void ControlInput::UpdateValue(double scalar){
+	if(!gradient)    ISSMERROR("Gradient of %s not found",EnumToString(this->enum_type));
+	if(!savedvalues) ISSMERROR("Values of %s not found",EnumToString(this->enum_type));
+
+	if(values) delete this->values;
+	this->values=(Input*)this->savedvalues->copy();
+	this->values->AXPY(gradient,scalar);
+}/*}}}*/
+/*FUNCTION ControlInput::VerticallyIntegrate{{{1*/
+void ControlInput::VerticallyIntegrate(Input* thickness_input){
+	values->VerticallyIntegrate(thickness_input);
+}/*}}}*/
Index: /issm/trunk/src/c/objects/Inputs/ControlInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/ControlInput.h	(revision 6200)
+++ /issm/trunk/src/c/objects/Inputs/ControlInput.h	(revision 6200)
@@ -0,0 +1,86 @@
+/*! \file ControlInput.h 
+ *  \brief: header file for triavertexinput object
+ */
+
+
+#ifndef _CONTROLINPUT_H_
+#define _CONTROLINPUT_H_
+
+/*Headers:*/
+/*{{{1*/
+#include "./Input.h"
+#include "../../include/include.h"
+class GaussTria;
+/*}}}*/
+
+class ControlInput: public Input{
+
+	public:
+		int    enum_type;
+		Input* values;
+		Input* savedvalues;
+		Input* gradient;
+
+		/*ControlInput constructors, destructors: {{{1*/
+		ControlInput();
+		ControlInput(int enum_type,int enum_input,double* pvalues);
+		~ControlInput();
+		/*}}}*/
+		/*Object virtual functions definitions:{{{1 */
+		void  Echo();
+		void  DeepEcho();
+		int   Id(); 
+		int   MyRank();
+		void  Marshall(char** pmarshalled_dataset);
+		int   MarshallSize();
+		void  Demarshall(char** pmarshalled_dataset);
+		int   Enum();
+		Object* copy();
+		/*}}}*/
+		/*ControlInput management: {{{1*/
+		int    EnumType();
+		Input* SpawnTriaInput(int* indices);
+		Input* PointwiseDivide(Input* inputB){ISSMERROR("not implemented yet");};
+		ElementResult* SpawnResult(int step, double time);
+		/*}}}*/
+		/*numerics: {{{1*/
+		void GetParameterValue(bool* pvalue);
+		void GetParameterValue(int* pvalue);
+		void GetParameterValue(double* pvalue);
+		void GetParameterValue(double* pvalue,GaussTria* gauss);
+		void GetParameterValue(double* pvalue,GaussPenta* gauss);
+		void GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss);
+		void GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussPenta* gauss);
+		void GetParameterAverage(double* pvalue);
+		void GetVxStrainRate2d(double* epsilonvx,double* xyz_list, GaussTria* gauss){ISSMERROR("not implemented yet");};
+		void GetVyStrainRate2d(double* epsilonvy,double* xyz_list, GaussTria* gauss){ISSMERROR("not implemented yet");};
+		void GetVxStrainRate3d(double* epsilonvx,double* xyz_list, GaussPenta* gauss){ISSMERROR("not implemented yet");};
+		void GetVyStrainRate3d(double* epsilonvy,double* xyz_list, GaussPenta* gauss){ISSMERROR("not implemented yet");};
+		void GetVzStrainRate3d(double* epsilonvz,double* xyz_list, GaussPenta* gauss){ISSMERROR("not implemented yet");};
+		void GetVxStrainRate3dPattyn(double* epsilonvx,double* xyz_list, GaussPenta* gauss){ISSMERROR("not implemented yet");};
+		void GetVyStrainRate3dPattyn(double* epsilonvy,double* xyz_list, GaussPenta* gauss){ISSMERROR("not implemented yet");};
+		void ChangeEnum(int newenumtype){ISSMERROR("not implemented yet");};
+		void SquareMin(double* psquaremin, bool process_units,Parameters* parameters){ISSMERROR("not implemented yet");};
+		void ConstrainMin(double minimum){ISSMERROR("not implemented yet");};
+		void Scale(double scale_factor){ISSMERROR("not implemented yet");};
+		void ArtificialNoise(double min,double max){ISSMERROR("not implemented yet");};
+		void AXPY(Input* xinput,double scalar){ISSMERROR("not implemented yet");};
+		void Constrain(double cm_min, double cm_max);
+		double InfinityNorm(void){ISSMERROR("not implemented yet");};
+		double Max(void){ISSMERROR("not implemented yet");};
+		double MaxAbs(void){ISSMERROR("not implemented yet");};
+		double Min(void){ISSMERROR("not implemented yet");};
+		double MinAbs(void){ISSMERROR("not implemented yet");};
+		void Extrude(void);
+		void VerticallyIntegrate(Input* thickness_input);
+		void GetVectorFromInputs(Vec vector,int* doflist){ISSMERROR("not implemented yet");};
+		void GetValuesPtr(double** pvalues,int* pnum_values){ISSMERROR("not implemented yet");};
+		ElementResult* SpawnGradient(int step, double time);
+		void GetGradient(Vec gradient_vec,int* doflist);
+		void SetGradient(Input* gradient_in);
+		void UpdateValue(double scalar);
+		void SaveValue(void);
+		/*}}}*/
+
+};
+#endif  /* _CONTROLINPUT_H */
Index: /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp	(revision 6199)
+++ /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp	(revision 6200)
@@ -494,16 +494,20 @@
 	int i;
 	const int numgrids=6;
-	PentaVertexInput*  xpentavertexinput=NULL;
 
 	/*xinput is of the same type, so cast it: */
-	xpentavertexinput=(PentaVertexInput*)xinput;
 
 	/*Carry out the AXPY operation depending on type:*/
 	switch(xinput->Enum()){
 
-		case PentaVertexInputEnum:
-			for(i=0;i<numgrids;i++)this->values[i]=this->values[i]+scalar*xpentavertexinput->values[i];
+		case PentaVertexInputEnum:{
+			PentaVertexInput* cast_input=(PentaVertexInput*)xinput;
+			for(i=0;i<numgrids;i++)this->values[i]=this->values[i]+scalar*(cast_input->values[i]);}
 			return;
-
+		case ControlInputEnum:{
+			ControlInput* cont_input=(ControlInput*)xinput;
+			if(cont_input->values->Enum()!=PentaVertexInputEnum) ISSMERROR("not supported yet");
+			PentaVertexInput* cast_input=(PentaVertexInput*)cont_input->values;
+			for(i=0;i<numgrids;i++)this->values[i]=this->values[i]+scalar*(cast_input->values[i]);}
+			return;
 		default:
 			ISSMERROR("not implemented yet");
Index: /issm/trunk/src/c/objects/Materials/Matice.cpp
===================================================================
--- /issm/trunk/src/c/objects/Materials/Matice.cpp	(revision 6199)
+++ /issm/trunk/src/c/objects/Materials/Matice.cpp	(revision 6200)
@@ -56,8 +56,16 @@
 		}
 
-		/*Get control_parameter*/
-		if (iomodel->control_parameter) {
-			for(i=0;i<num_vertices;i++)nodeinputs[i]=iomodel->control_parameter[int(iomodel->elements[num_vertices*index+i]-1)];
-			this->inputs->AddInput(new TriaVertexInput(ControlParameterEnum,nodeinputs));
+		/*Control Inputs*/
+		if (iomodel->control_analysis){
+			switch(iomodel->control_type){
+				case RheologyBbarEnum:
+					if (iomodel->rheology_B){
+						for(i=0;i<num_vertices;i++)nodeinputs[i]=iomodel->rheology_B[int(iomodel->elements[num_vertices*index+i]-1)];
+						this->inputs->AddInput(new ControlInput(RheologyBbarEnum,TriaVertexInputEnum,nodeinputs));
+					}
+					break;
+				default:
+					/*Nothing*/;
+			}
 		}
 	}
@@ -82,12 +90,20 @@
 		}
 
-		/*Get control_parameter*/
-		if (iomodel->control_parameter) {
-			for(i=0;i<num_vertices;i++)nodeinputs[i]=iomodel->control_parameter[int(iomodel->elements[num_vertices*index+i]-1)];
-			this->inputs->AddInput(new PentaVertexInput(ControlParameterEnum,nodeinputs));
-		}
-	}
-	/*Else*/
-	else ISSMERROR(" Mesh type not supported yet!");
+		/*Control Inputs*/
+		if (iomodel->control_analysis){
+			switch(iomodel->control_type){
+				case RheologyBbarEnum:
+					if (iomodel->rheology_B){
+						for(i=0;i<num_vertices;i++)nodeinputs[i]=iomodel->rheology_B[int(iomodel->elements[num_vertices*index+i]-1)];
+						this->inputs->AddInput(new ControlInput(RheologyBEnum,PentaVertexInputEnum,nodeinputs));
+					}
+					break;
+			}
+		}
+	}
+	else{
+		ISSMERROR(" Mesh type not supported yet!");
+	}
+
 
 	/*Hooks: */
@@ -653,6 +669,5 @@
 				name==RheologyBEnum ||
 				name==RheologyBbarEnum ||
-				name==RheologyNEnum ||
-				name==ControlParameterEnum
+				name==RheologyNEnum
 		){
 		return true;
Index: /issm/trunk/src/c/objects/objects.h
===================================================================
--- /issm/trunk/src/c/objects/objects.h	(revision 6199)
+++ /issm/trunk/src/c/objects/objects.h	(revision 6200)
@@ -51,4 +51,5 @@
 #include "./Inputs/PentaVertexInput.h"
 #include "./Inputs/TriaVertexInput.h"
+#include "./Inputs/ControlInput.h"
 
 /*ElementResults: */
Index: /issm/trunk/src/c/solutions/control_core.cpp
===================================================================
--- /issm/trunk/src/c/solutions/control_core.cpp	(revision 6199)
+++ /issm/trunk/src/c/solutions/control_core.cpp	(revision 6200)
@@ -104,5 +104,5 @@
 		//OptimalSearch(&search_scalar,J+n,&optpars,&objectivefunctionC,&optargs);
 
-		_printf_("%s\n","      updating parameter using optimized search scalar..."); //true means update parameter and copy it onto ControlParameter input
+		_printf_("%s\n","      updating parameter using optimized search scalar..."); //true means update save controls
 		InputControlUpdatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,search_scalar*optscal[n],true);
 		
@@ -123,5 +123,4 @@
 	if(!qmu_analysis){ //do not save this if we are running the control core from a qmu run!
 		InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_type); //the parameter itself!
-		InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,GradientEnum); 
 		femmodel->results->AddObject(new DoubleVecExternalResult(femmodel->results->Size()+1,JEnum,J,nsteps,1,0));
 		femmodel->results->AddObject(new StringExternalResult(femmodel->results->Size()+1,ControlTypeEnum,EnumToString(control_type),1,0));
Index: /issm/trunk/src/c/solutions/gradient_core.cpp
===================================================================
--- /issm/trunk/src/c/solutions/gradient_core.cpp	(revision 6199)
+++ /issm/trunk/src/c/solutions/gradient_core.cpp	(revision 6200)
@@ -32,28 +32,22 @@
 	if(verbose)_printf_("%s\n","      compute gradient:");
 	Gradjx(&gradient, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters, control_type);
-	
-	if(verbose)_printf_("%s\n","      retrieve old gradient:");
-	GetVectorFromInputsx(&old_gradient, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters, OldGradientEnum,VertexEnum);
 
 	if(control_steady)diagnostic_core(femmodel);
 	
 	if (step>0 && search_scalar==0){
-		_printf_("%s","      orthogonalization...");
+		_printf_("%s","      orthogonalization...\n");
+		if(verbose)_printf_("%s\n","      retrieve old gradient:");
+		ControlInputGetGradientx(&old_gradient,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters,control_type);
 		Orthx(&new_gradient,gradient,old_gradient);
+		VecFree(&old_gradient);
 	}
 	else{ 
-		_printf_("%s","      normalizing directions...");
+		_printf_("%s","      normalizing directions...\n");
 		Orthx(&new_gradient,gradient,NULL);
 	}
-	_printf_("%s\n"," done.");
-	
-	/*point gradient and old_gradient to new_gradient: */
-	VecFree(&gradient); gradient=new_gradient;
-	VecFree(&old_gradient); old_gradient=new_gradient;
+	VecFree(&gradient);
 
 	/*plug back into inputs: */
-	InputUpdateFromVectorx(femmodel-> elements,femmodel-> nodes, femmodel-> vertices,femmodel-> loads, femmodel-> materials,  femmodel->parameters,gradient,GradientEnum,VertexEnum);
-	InputUpdateFromVectorx(femmodel-> elements,femmodel-> nodes, femmodel-> vertices,femmodel-> loads, femmodel-> materials,  femmodel->parameters,old_gradient,OldGradientEnum,VertexEnum);
-	//InputArtificialNoisex(  femmodel-> elements,femmodel-> nodes, femmodel-> vertices,femmodel-> loads, femmodel-> materials,  femmodel->parameters,GradientEnum,-0.5,0.5);
+	ControlInputSetGradientx(femmodel-> elements,femmodel-> nodes, femmodel-> vertices,femmodel-> loads, femmodel-> materials,  femmodel->parameters,control_type,new_gradient);
 
 	/*Free ressources and return:*/
Index: /issm/trunk/src/c/solutions/objectivefunctionC.cpp
===================================================================
--- /issm/trunk/src/c/solutions/objectivefunctionC.cpp	(revision 6199)
+++ /issm/trunk/src/c/solutions/objectivefunctionC.cpp	(revision 6200)
@@ -62,5 +62,5 @@
 	}
 
-	/*update parameter according to scalar: */ //false means: do not copy updated parameter onto ControlParameter input
+	/*update parameter according to scalar: */ //false means: do not save control
 	InputControlUpdatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,search_scalar*optscal[n],false);
 
Index: /issm/trunk/src/m/enum/AbsoluteEnum.m
===================================================================
--- /issm/trunk/src/m/enum/AbsoluteEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/AbsoluteEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=AbsoluteEnum()
 
-macro=248;
+macro=249;
Index: /issm/trunk/src/m/enum/AccumulationRateEnum.m
===================================================================
--- /issm/trunk/src/m/enum/AccumulationRateEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/AccumulationRateEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=AccumulationRateEnum()
 
-macro=117;
+macro=118;
Index: /issm/trunk/src/m/enum/AdjointEnum.m
===================================================================
--- /issm/trunk/src/m/enum/AdjointEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/AdjointEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=AdjointEnum()
 
-macro=263;
+macro=264;
Index: /issm/trunk/src/m/enum/AdjointpEnum.m
===================================================================
--- /issm/trunk/src/m/enum/AdjointpEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/AdjointpEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=AdjointpEnum()
 
-macro=121;
+macro=122;
Index: /issm/trunk/src/m/enum/AdjointxEnum.m
===================================================================
--- /issm/trunk/src/m/enum/AdjointxEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/AdjointxEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=AdjointxEnum()
 
-macro=118;
+macro=119;
Index: /issm/trunk/src/m/enum/AdjointyEnum.m
===================================================================
--- /issm/trunk/src/m/enum/AdjointyEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/AdjointyEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=AdjointyEnum()
 
-macro=119;
+macro=120;
Index: /issm/trunk/src/m/enum/AdjointzEnum.m
===================================================================
--- /issm/trunk/src/m/enum/AdjointzEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/AdjointzEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=AdjointzEnum()
 
-macro=120;
+macro=121;
Index: /issm/trunk/src/m/enum/AirEnum.m
===================================================================
--- /issm/trunk/src/m/enum/AirEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/AirEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=AirEnum()
 
-macro=115;
+macro=116;
Index: /issm/trunk/src/m/enum/ArtDiffEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ArtDiffEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ArtDiffEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ArtDiffEnum()
 
-macro=122;
+macro=123;
Index: /issm/trunk/src/m/enum/BedEnum.m
===================================================================
--- /issm/trunk/src/m/enum/BedEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/BedEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=BedEnum()
 
-macro=123;
+macro=124;
Index: /issm/trunk/src/m/enum/BedSlopeXEnum.m
===================================================================
--- /issm/trunk/src/m/enum/BedSlopeXEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/BedSlopeXEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=BedSlopeXEnum()
 
-macro=124;
+macro=125;
Index: /issm/trunk/src/m/enum/BedSlopeYEnum.m
===================================================================
--- /issm/trunk/src/m/enum/BedSlopeYEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/BedSlopeYEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=BedSlopeYEnum()
 
-macro=125;
+macro=126;
Index: /issm/trunk/src/m/enum/BetaEnum.m
===================================================================
--- /issm/trunk/src/m/enum/BetaEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/BetaEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=BetaEnum()
 
-macro=258;
+macro=259;
Index: /issm/trunk/src/m/enum/BoolExternalResultEnum.m
===================================================================
--- /issm/trunk/src/m/enum/BoolExternalResultEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/BoolExternalResultEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=BoolExternalResultEnum()
 
-macro=222;
+macro=223;
Index: /issm/trunk/src/m/enum/BoolParamEnum.m
===================================================================
--- /issm/trunk/src/m/enum/BoolParamEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/BoolParamEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=BoolParamEnum()
 
-macro=95;
+macro=96;
Index: /issm/trunk/src/m/enum/BoundaryEnum.m
===================================================================
--- /issm/trunk/src/m/enum/BoundaryEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/BoundaryEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=BoundaryEnum()
 
-macro=126;
+macro=127;
Index: /issm/trunk/src/m/enum/CflCoefficientEnum.m
===================================================================
--- /issm/trunk/src/m/enum/CflCoefficientEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/CflCoefficientEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=CflCoefficientEnum()
 
-macro=140;
+macro=141;
Index: /issm/trunk/src/m/enum/CmGradientEnum.m
===================================================================
--- /issm/trunk/src/m/enum/CmGradientEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/CmGradientEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=CmGradientEnum()
 
-macro=259;
+macro=260;
Index: /issm/trunk/src/m/enum/CmJumpEnum.m
===================================================================
--- /issm/trunk/src/m/enum/CmJumpEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/CmJumpEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=CmJumpEnum()
 
-macro=260;
+macro=261;
Index: /issm/trunk/src/m/enum/CmMaxEnum.m
===================================================================
--- /issm/trunk/src/m/enum/CmMaxEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/CmMaxEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=CmMaxEnum()
 
-macro=261;
+macro=262;
Index: /issm/trunk/src/m/enum/CmMinEnum.m
===================================================================
--- /issm/trunk/src/m/enum/CmMinEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/CmMinEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=CmMinEnum()
 
-macro=262;
+macro=263;
Index: /issm/trunk/src/m/enum/CmNoiseDmpEnum.m
===================================================================
--- /issm/trunk/src/m/enum/CmNoiseDmpEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/CmNoiseDmpEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=CmNoiseDmpEnum()
 
-macro=129;
+macro=130;
Index: /issm/trunk/src/m/enum/CmResponseEnum.m
===================================================================
--- /issm/trunk/src/m/enum/CmResponseEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/CmResponseEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=CmResponseEnum()
 
-macro=127;
+macro=128;
Index: /issm/trunk/src/m/enum/CmResponsesEnum.m
===================================================================
--- /issm/trunk/src/m/enum/CmResponsesEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/CmResponsesEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=CmResponsesEnum()
 
-macro=128;
+macro=129;
Index: /issm/trunk/src/m/enum/ColinearEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ColinearEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ColinearEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ColinearEnum()
 
-macro=256;
+macro=257;
Index: /issm/trunk/src/m/enum/ConnectivityEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ConnectivityEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ConnectivityEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ConnectivityEnum()
 
-macro=266;
+macro=267;
Index: /issm/trunk/src/m/enum/ConstantEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ConstantEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ConstantEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ConstantEnum()
 
-macro=130;
+macro=131;
Index: /issm/trunk/src/m/enum/ControlInputEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ControlInputEnum.m	(revision 6200)
+++ /issm/trunk/src/m/enum/ControlInputEnum.m	(revision 6200)
@@ -0,0 +1,11 @@
+function macro=ControlInputEnum()
+%CONTROLINPUTENUM - Enum of ControlInput
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/SynchronizeMatlabEnum
+%            Please read src/c/README for more information
+%
+%   Usage:
+%      macro=ControlInputEnum()
+
+macro=94;
Index: sm/trunk/src/m/enum/ControlParameterEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ControlParameterEnum.m	(revision 6199)
+++ 	(revision )
@@ -1,11 +1,0 @@
-function macro=ControlParameterEnum()
-%CONTROLPARAMETERENUM - Enum of ControlParameter
-%
-%   WARNING: DO NOT MODIFY THIS FILE
-%            this file has been automatically generated by src/c/SynchronizeMatlabEnum
-%            Please read src/c/README for more information
-%
-%   Usage:
-%      macro=ControlParameterEnum()
-
-macro=267;
Index: /issm/trunk/src/m/enum/ControlTypeEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ControlTypeEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ControlTypeEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ControlTypeEnum()
 
-macro=131;
+macro=132;
Index: /issm/trunk/src/m/enum/ConvergedEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ConvergedEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ConvergedEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ConvergedEnum()
 
-macro=132;
+macro=133;
Index: /issm/trunk/src/m/enum/DhDtEnum.m
===================================================================
--- /issm/trunk/src/m/enum/DhDtEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/DhDtEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=DhDtEnum()
 
-macro=133;
+macro=134;
Index: /issm/trunk/src/m/enum/DoubleElementResultEnum.m
===================================================================
--- /issm/trunk/src/m/enum/DoubleElementResultEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/DoubleElementResultEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=DoubleElementResultEnum()
 
-macro=219;
+macro=220;
Index: /issm/trunk/src/m/enum/DoubleExternalResultEnum.m
===================================================================
--- /issm/trunk/src/m/enum/DoubleExternalResultEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/DoubleExternalResultEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=DoubleExternalResultEnum()
 
-macro=223;
+macro=224;
Index: /issm/trunk/src/m/enum/DoubleMatArrayParamEnum.m
===================================================================
--- /issm/trunk/src/m/enum/DoubleMatArrayParamEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/DoubleMatArrayParamEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=DoubleMatArrayParamEnum()
 
-macro=97;
+macro=98;
Index: /issm/trunk/src/m/enum/DoubleMatExternalResultEnum.m
===================================================================
--- /issm/trunk/src/m/enum/DoubleMatExternalResultEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/DoubleMatExternalResultEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=DoubleMatExternalResultEnum()
 
-macro=225;
+macro=226;
Index: /issm/trunk/src/m/enum/DoubleMatParamEnum.m
===================================================================
--- /issm/trunk/src/m/enum/DoubleMatParamEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/DoubleMatParamEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=DoubleMatParamEnum()
 
-macro=96;
+macro=97;
Index: /issm/trunk/src/m/enum/DoubleParamEnum.m
===================================================================
--- /issm/trunk/src/m/enum/DoubleParamEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/DoubleParamEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=DoubleParamEnum()
 
-macro=98;
+macro=99;
Index: /issm/trunk/src/m/enum/DoubleVecExternalResultEnum.m
===================================================================
--- /issm/trunk/src/m/enum/DoubleVecExternalResultEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/DoubleVecExternalResultEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=DoubleVecExternalResultEnum()
 
-macro=224;
+macro=225;
Index: /issm/trunk/src/m/enum/DoubleVecParamEnum.m
===================================================================
--- /issm/trunk/src/m/enum/DoubleVecParamEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/DoubleVecParamEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=DoubleVecParamEnum()
 
-macro=99;
+macro=100;
Index: /issm/trunk/src/m/enum/DragCoefficientEnum.m
===================================================================
--- /issm/trunk/src/m/enum/DragCoefficientEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/DragCoefficientEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=DragCoefficientEnum()
 
-macro=134;
+macro=135;
Index: /issm/trunk/src/m/enum/DragPEnum.m
===================================================================
--- /issm/trunk/src/m/enum/DragPEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/DragPEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=DragPEnum()
 
-macro=135;
+macro=136;
Index: /issm/trunk/src/m/enum/DragQEnum.m
===================================================================
--- /issm/trunk/src/m/enum/DragQEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/DragQEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=DragQEnum()
 
-macro=136;
+macro=137;
Index: /issm/trunk/src/m/enum/DragTypeEnum.m
===================================================================
--- /issm/trunk/src/m/enum/DragTypeEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/DragTypeEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=DragTypeEnum()
 
-macro=137;
+macro=138;
Index: /issm/trunk/src/m/enum/DtEnum.m
===================================================================
--- /issm/trunk/src/m/enum/DtEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/DtEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=DtEnum()
 
-macro=138;
+macro=139;
Index: /issm/trunk/src/m/enum/ElementOnBedEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ElementOnBedEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ElementOnBedEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ElementOnBedEnum()
 
-macro=141;
+macro=142;
Index: /issm/trunk/src/m/enum/ElementOnIceShelfEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ElementOnIceShelfEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ElementOnIceShelfEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ElementOnIceShelfEnum()
 
-macro=142;
+macro=143;
Index: /issm/trunk/src/m/enum/ElementOnSurfaceEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ElementOnSurfaceEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ElementOnSurfaceEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ElementOnSurfaceEnum()
 
-macro=143;
+macro=144;
Index: /issm/trunk/src/m/enum/ElementOnWaterEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ElementOnWaterEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ElementOnWaterEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ElementOnWaterEnum()
 
-macro=144;
+macro=145;
Index: /issm/trunk/src/m/enum/ElementResultEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ElementResultEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ElementResultEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ElementResultEnum()
 
-macro=107;
+macro=108;
Index: /issm/trunk/src/m/enum/EnumToString.m
===================================================================
--- /issm/trunk/src/m/enum/EnumToString.m	(revision 6199)
+++ /issm/trunk/src/m/enum/EnumToString.m	(revision 6200)
@@ -105,4 +105,5 @@
 case PentaVertexInputEnum(), string='PentaVertexInput'; return
 case TriaVertexInputEnum(), string='TriaVertexInput'; return
+case ControlInputEnum(), string='ControlInput'; return
 case ParamEnum(), string='Param'; return
 case BoolParamEnum(), string='BoolParam'; return
@@ -278,5 +279,4 @@
 case OldGradientEnum(), string='OldGradient'; return
 case ConnectivityEnum(), string='Connectivity'; return
-case ControlParameterEnum(), string='ControlParameter'; return
 case ControlSteadyEnum(), string='ControlSteady'; return
 case DakotaParameterEnum(), string='DakotaParameter'; return
Index: /issm/trunk/src/m/enum/EpsVelEnum.m
===================================================================
--- /issm/trunk/src/m/enum/EpsVelEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/EpsVelEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=EpsVelEnum()
 
-macro=145;
+macro=146;
Index: /issm/trunk/src/m/enum/ExtToIuEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ExtToIuEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ExtToIuEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ExtToIuEnum()
 
-macro=153;
+macro=154;
Index: /issm/trunk/src/m/enum/ExternalResultEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ExternalResultEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ExternalResultEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ExternalResultEnum()
 
-macro=108;
+macro=109;
Index: /issm/trunk/src/m/enum/FileParamEnum.m
===================================================================
--- /issm/trunk/src/m/enum/FileParamEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/FileParamEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=FileParamEnum()
 
-macro=102;
+macro=103;
Index: /issm/trunk/src/m/enum/FillEnum.m
===================================================================
--- /issm/trunk/src/m/enum/FillEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/FillEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=FillEnum()
 
-macro=146;
+macro=147;
Index: /issm/trunk/src/m/enum/FractionIncrementEnum.m
===================================================================
--- /issm/trunk/src/m/enum/FractionIncrementEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/FractionIncrementEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=FractionIncrementEnum()
 
-macro=147;
+macro=148;
Index: /issm/trunk/src/m/enum/FrictionEnum.m
===================================================================
--- /issm/trunk/src/m/enum/FrictionEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/FrictionEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=FrictionEnum()
 
-macro=148;
+macro=149;
Index: /issm/trunk/src/m/enum/GeographyEnum.m
===================================================================
--- /issm/trunk/src/m/enum/GeographyEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/GeographyEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=GeographyEnum()
 
-macro=110;
+macro=111;
Index: /issm/trunk/src/m/enum/GeothermalFluxEnum.m
===================================================================
--- /issm/trunk/src/m/enum/GeothermalFluxEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/GeothermalFluxEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=GeothermalFluxEnum()
 
-macro=149;
+macro=150;
Index: /issm/trunk/src/m/enum/GradientEnum.m
===================================================================
--- /issm/trunk/src/m/enum/GradientEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/GradientEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=GradientEnum()
 
-macro=264;
+macro=265;
Index: /issm/trunk/src/m/enum/GravityEnum.m
===================================================================
--- /issm/trunk/src/m/enum/GravityEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/GravityEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=GravityEnum()
 
-macro=251;
+macro=252;
Index: /issm/trunk/src/m/enum/IceEnum.m
===================================================================
--- /issm/trunk/src/m/enum/IceEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/IceEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=IceEnum()
 
-macro=114;
+macro=115;
Index: /issm/trunk/src/m/enum/IceSheetEnum.m
===================================================================
--- /issm/trunk/src/m/enum/IceSheetEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/IceSheetEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=IceSheetEnum()
 
-macro=111;
+macro=112;
Index: /issm/trunk/src/m/enum/IceShelfEnum.m
===================================================================
--- /issm/trunk/src/m/enum/IceShelfEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/IceShelfEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=IceShelfEnum()
 
-macro=112;
+macro=113;
Index: /issm/trunk/src/m/enum/IntExternalResultEnum.m
===================================================================
--- /issm/trunk/src/m/enum/IntExternalResultEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/IntExternalResultEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=IntExternalResultEnum()
 
-macro=226;
+macro=227;
Index: /issm/trunk/src/m/enum/IntParamEnum.m
===================================================================
--- /issm/trunk/src/m/enum/IntParamEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/IntParamEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=IntParamEnum()
 
-macro=100;
+macro=101;
Index: /issm/trunk/src/m/enum/IntVecParamEnum.m
===================================================================
--- /issm/trunk/src/m/enum/IntVecParamEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/IntVecParamEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=IntVecParamEnum()
 
-macro=101;
+macro=102;
Index: /issm/trunk/src/m/enum/InternalEnum.m
===================================================================
--- /issm/trunk/src/m/enum/InternalEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/InternalEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=InternalEnum()
 
-macro=150;
+macro=151;
Index: /issm/trunk/src/m/enum/IntersectEnum.m
===================================================================
--- /issm/trunk/src/m/enum/IntersectEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/IntersectEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=IntersectEnum()
 
-macro=255;
+macro=256;
Index: /issm/trunk/src/m/enum/IuToExtEnum.m
===================================================================
--- /issm/trunk/src/m/enum/IuToExtEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/IuToExtEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=IuToExtEnum()
 
-macro=152;
+macro=153;
Index: /issm/trunk/src/m/enum/JEnum.m
===================================================================
--- /issm/trunk/src/m/enum/JEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/JEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=JEnum()
 
-macro=229;
+macro=230;
Index: /issm/trunk/src/m/enum/KflagEnum.m
===================================================================
--- /issm/trunk/src/m/enum/KflagEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/KflagEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=KflagEnum()
 
-macro=151;
+macro=152;
Index: /issm/trunk/src/m/enum/MassFluxEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MassFluxEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MassFluxEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MassFluxEnum()
 
-macro=154;
+macro=155;
Index: /issm/trunk/src/m/enum/MaxAbsVxEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MaxAbsVxEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MaxAbsVxEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MaxAbsVxEnum()
 
-macro=239;
+macro=240;
Index: /issm/trunk/src/m/enum/MaxAbsVyEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MaxAbsVyEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MaxAbsVyEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MaxAbsVyEnum()
 
-macro=242;
+macro=243;
Index: /issm/trunk/src/m/enum/MaxAbsVzEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MaxAbsVzEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MaxAbsVzEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MaxAbsVzEnum()
 
-macro=245;
+macro=246;
Index: /issm/trunk/src/m/enum/MaxPenetrationEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MaxPenetrationEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MaxPenetrationEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MaxPenetrationEnum()
 
-macro=161;
+macro=162;
Index: /issm/trunk/src/m/enum/MaxVelEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MaxVelEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MaxVelEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MaxVelEnum()
 
-macro=236;
+macro=237;
Index: /issm/trunk/src/m/enum/MaxVxEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MaxVxEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MaxVxEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MaxVxEnum()
 
-macro=238;
+macro=239;
Index: /issm/trunk/src/m/enum/MaxVyEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MaxVyEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MaxVyEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MaxVyEnum()
 
-macro=241;
+macro=242;
Index: /issm/trunk/src/m/enum/MaxVzEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MaxVzEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MaxVzEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MaxVzEnum()
 
-macro=244;
+macro=245;
Index: /issm/trunk/src/m/enum/MeanVelEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MeanVelEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MeanVelEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MeanVelEnum()
 
-macro=162;
+macro=163;
Index: /issm/trunk/src/m/enum/MelangeEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MelangeEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MelangeEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MelangeEnum()
 
-macro=116;
+macro=117;
Index: /issm/trunk/src/m/enum/MeltingOffsetEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MeltingOffsetEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MeltingOffsetEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MeltingOffsetEnum()
 
-macro=163;
+macro=164;
Index: /issm/trunk/src/m/enum/MeltingRateEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MeltingRateEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MeltingRateEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MeltingRateEnum()
 
-macro=164;
+macro=165;
Index: /issm/trunk/src/m/enum/MinVelEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MinVelEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MinVelEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MinVelEnum()
 
-macro=235;
+macro=236;
Index: /issm/trunk/src/m/enum/MinVxEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MinVxEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MinVxEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MinVxEnum()
 
-macro=237;
+macro=238;
Index: /issm/trunk/src/m/enum/MinVyEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MinVyEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MinVyEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MinVyEnum()
 
-macro=240;
+macro=241;
Index: /issm/trunk/src/m/enum/MinVzEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MinVzEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MinVzEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MinVzEnum()
 
-macro=243;
+macro=244;
Index: /issm/trunk/src/m/enum/MiniEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MiniEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MiniEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MiniEnum()
 
-macro=218;
+macro=219;
Index: /issm/trunk/src/m/enum/MisfitEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MisfitEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MisfitEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MisfitEnum()
 
-macro=165;
+macro=166;
Index: /issm/trunk/src/m/enum/MixedLayerCapacityEnum.m
===================================================================
--- /issm/trunk/src/m/enum/MixedLayerCapacityEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/MixedLayerCapacityEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=MixedLayerCapacityEnum()
 
-macro=253;
+macro=254;
Index: /issm/trunk/src/m/enum/NodeOnBedEnum.m
===================================================================
--- /issm/trunk/src/m/enum/NodeOnBedEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/NodeOnBedEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=NodeOnBedEnum()
 
-macro=166;
+macro=167;
Index: /issm/trunk/src/m/enum/NodeOnIceSheetEnum.m
===================================================================
--- /issm/trunk/src/m/enum/NodeOnIceSheetEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/NodeOnIceSheetEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=NodeOnIceSheetEnum()
 
-macro=167;
+macro=168;
Index: /issm/trunk/src/m/enum/NodeOnIceShelfEnum.m
===================================================================
--- /issm/trunk/src/m/enum/NodeOnIceShelfEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/NodeOnIceShelfEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=NodeOnIceShelfEnum()
 
-macro=168;
+macro=169;
Index: /issm/trunk/src/m/enum/NodeOnSurfaceEnum.m
===================================================================
--- /issm/trunk/src/m/enum/NodeOnSurfaceEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/NodeOnSurfaceEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=NodeOnSurfaceEnum()
 
-macro=169;
+macro=170;
Index: /issm/trunk/src/m/enum/NumberNodeToElementConnectivityEnum.m
===================================================================
--- /issm/trunk/src/m/enum/NumberNodeToElementConnectivityEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/NumberNodeToElementConnectivityEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=NumberNodeToElementConnectivityEnum()
 
-macro=170;
+macro=171;
Index: /issm/trunk/src/m/enum/OldGradientEnum.m
===================================================================
--- /issm/trunk/src/m/enum/OldGradientEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/OldGradientEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=OldGradientEnum()
 
-macro=265;
+macro=266;
Index: /issm/trunk/src/m/enum/OutputFrequencyEnum.m
===================================================================
--- /issm/trunk/src/m/enum/OutputFrequencyEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/OutputFrequencyEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=OutputFrequencyEnum()
 
-macro=234;
+macro=235;
Index: /issm/trunk/src/m/enum/P0Enum.m
===================================================================
--- /issm/trunk/src/m/enum/P0Enum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/P0Enum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=P0Enum()
 
-macro=215;
+macro=216;
Index: /issm/trunk/src/m/enum/P1DGEnum.m
===================================================================
--- /issm/trunk/src/m/enum/P1DGEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/P1DGEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=P1DGEnum()
 
-macro=217;
+macro=218;
Index: /issm/trunk/src/m/enum/P1Enum.m
===================================================================
--- /issm/trunk/src/m/enum/P1Enum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/P1Enum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=P1Enum()
 
-macro=216;
+macro=217;
Index: /issm/trunk/src/m/enum/ParamEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ParamEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ParamEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ParamEnum()
 
-macro=94;
+macro=95;
Index: /issm/trunk/src/m/enum/PatchEnum.m
===================================================================
--- /issm/trunk/src/m/enum/PatchEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/PatchEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=PatchEnum()
 
-macro=230;
+macro=231;
Index: /issm/trunk/src/m/enum/PatchNodesEnum.m
===================================================================
--- /issm/trunk/src/m/enum/PatchNodesEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/PatchNodesEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=PatchNodesEnum()
 
-macro=232;
+macro=233;
Index: /issm/trunk/src/m/enum/PatchVerticesEnum.m
===================================================================
--- /issm/trunk/src/m/enum/PatchVerticesEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/PatchVerticesEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=PatchVerticesEnum()
 
-macro=231;
+macro=232;
Index: /issm/trunk/src/m/enum/PenaltyOffsetEnum.m
===================================================================
--- /issm/trunk/src/m/enum/PenaltyOffsetEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/PenaltyOffsetEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=PenaltyOffsetEnum()
 
-macro=171;
+macro=172;
Index: /issm/trunk/src/m/enum/PentaVertexElementResultEnum.m
===================================================================
--- /issm/trunk/src/m/enum/PentaVertexElementResultEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/PentaVertexElementResultEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=PentaVertexElementResultEnum()
 
-macro=221;
+macro=222;
Index: /issm/trunk/src/m/enum/PetscMatParamEnum.m
===================================================================
--- /issm/trunk/src/m/enum/PetscMatParamEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/PetscMatParamEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=PetscMatParamEnum()
 
-macro=103;
+macro=104;
Index: /issm/trunk/src/m/enum/PetscVecExternalResultEnum.m
===================================================================
--- /issm/trunk/src/m/enum/PetscVecExternalResultEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/PetscVecExternalResultEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=PetscVecExternalResultEnum()
 
-macro=227;
+macro=228;
Index: /issm/trunk/src/m/enum/PetscVecParamEnum.m
===================================================================
--- /issm/trunk/src/m/enum/PetscVecParamEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/PetscVecParamEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=PetscVecParamEnum()
 
-macro=104;
+macro=105;
Index: /issm/trunk/src/m/enum/PflagEnum.m
===================================================================
--- /issm/trunk/src/m/enum/PflagEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/PflagEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=PflagEnum()
 
-macro=172;
+macro=173;
Index: /issm/trunk/src/m/enum/PressureEnum.m
===================================================================
--- /issm/trunk/src/m/enum/PressureEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/PressureEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=PressureEnum()
 
-macro=173;
+macro=174;
Index: /issm/trunk/src/m/enum/PressureOldEnum.m
===================================================================
--- /issm/trunk/src/m/enum/PressureOldEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/PressureOldEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=PressureOldEnum()
 
-macro=174;
+macro=175;
Index: /issm/trunk/src/m/enum/QmuPressureEnum.m
===================================================================
--- /issm/trunk/src/m/enum/QmuPressureEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/QmuPressureEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=QmuPressureEnum()
 
-macro=175;
+macro=176;
Index: /issm/trunk/src/m/enum/QmuVxEnum.m
===================================================================
--- /issm/trunk/src/m/enum/QmuVxEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/QmuVxEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=QmuVxEnum()
 
-macro=200;
+macro=201;
Index: /issm/trunk/src/m/enum/QmuVyEnum.m
===================================================================
--- /issm/trunk/src/m/enum/QmuVyEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/QmuVyEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=QmuVyEnum()
 
-macro=205;
+macro=206;
Index: /issm/trunk/src/m/enum/QmuVzEnum.m
===================================================================
--- /issm/trunk/src/m/enum/QmuVzEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/QmuVzEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=QmuVzEnum()
 
-macro=213;
+macro=214;
Index: /issm/trunk/src/m/enum/RelativeEnum.m
===================================================================
--- /issm/trunk/src/m/enum/RelativeEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/RelativeEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=RelativeEnum()
 
-macro=246;
+macro=247;
Index: /issm/trunk/src/m/enum/ResetPenaltiesEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ResetPenaltiesEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ResetPenaltiesEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ResetPenaltiesEnum()
 
-macro=176;
+macro=177;
Index: /issm/trunk/src/m/enum/ResidualEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ResidualEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ResidualEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ResidualEnum()
 
-macro=247;
+macro=248;
Index: /issm/trunk/src/m/enum/RheologyBEnum.m
===================================================================
--- /issm/trunk/src/m/enum/RheologyBEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/RheologyBEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=RheologyBEnum()
 
-macro=177;
+macro=178;
Index: /issm/trunk/src/m/enum/RheologyBbarEnum.m
===================================================================
--- /issm/trunk/src/m/enum/RheologyBbarEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/RheologyBbarEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=RheologyBbarEnum()
 
-macro=178;
+macro=179;
Index: /issm/trunk/src/m/enum/RheologyNEnum.m
===================================================================
--- /issm/trunk/src/m/enum/RheologyNEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/RheologyNEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=RheologyNEnum()
 
-macro=179;
+macro=180;
Index: /issm/trunk/src/m/enum/RhoIceEnum.m
===================================================================
--- /issm/trunk/src/m/enum/RhoIceEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/RhoIceEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=RhoIceEnum()
 
-macro=249;
+macro=250;
Index: /issm/trunk/src/m/enum/RhoWaterEnum.m
===================================================================
--- /issm/trunk/src/m/enum/RhoWaterEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/RhoWaterEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=RhoWaterEnum()
 
-macro=250;
+macro=251;
Index: /issm/trunk/src/m/enum/SegmentOnIceShelfEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SegmentOnIceShelfEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/SegmentOnIceShelfEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=SegmentOnIceShelfEnum()
 
-macro=180;
+macro=181;
Index: /issm/trunk/src/m/enum/SeparateEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SeparateEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/SeparateEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=SeparateEnum()
 
-macro=257;
+macro=258;
Index: /issm/trunk/src/m/enum/SpcEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SpcEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/SpcEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=SpcEnum()
 
-macro=109;
+macro=110;
Index: /issm/trunk/src/m/enum/StabilizeConstraintsEnum.m
===================================================================
--- /issm/trunk/src/m/enum/StabilizeConstraintsEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/StabilizeConstraintsEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=StabilizeConstraintsEnum()
 
-macro=181;
+macro=182;
Index: /issm/trunk/src/m/enum/StokesReconditioningEnum.m
===================================================================
--- /issm/trunk/src/m/enum/StokesReconditioningEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/StokesReconditioningEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=StokesReconditioningEnum()
 
-macro=182;
+macro=183;
Index: /issm/trunk/src/m/enum/StringArrayParamEnum.m
===================================================================
--- /issm/trunk/src/m/enum/StringArrayParamEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/StringArrayParamEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=StringArrayParamEnum()
 
-macro=105;
+macro=106;
Index: /issm/trunk/src/m/enum/StringExternalResultEnum.m
===================================================================
--- /issm/trunk/src/m/enum/StringExternalResultEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/StringExternalResultEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=StringExternalResultEnum()
 
-macro=228;
+macro=229;
Index: /issm/trunk/src/m/enum/StringParamEnum.m
===================================================================
--- /issm/trunk/src/m/enum/StringParamEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/StringParamEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=StringParamEnum()
 
-macro=106;
+macro=107;
Index: /issm/trunk/src/m/enum/StringToEnum.m
===================================================================
--- /issm/trunk/src/m/enum/StringToEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/StringToEnum.m	(revision 6200)
@@ -103,4 +103,5 @@
 			elseif (strcmpi(name,'PentaVertexInput')), enum=PentaVertexInputEnum(); return
 			elseif (strcmpi(name,'TriaVertexInput')), enum=TriaVertexInputEnum(); return
+			elseif (strcmpi(name,'ControlInput')), enum=ControlInputEnum(); return
 			elseif (strcmpi(name,'Param')), enum=ParamEnum(); return
 			elseif (strcmpi(name,'BoolParam')), enum=BoolParamEnum(); return
@@ -276,5 +277,4 @@
 			elseif (strcmpi(name,'OldGradient')), enum=OldGradientEnum(); return
 			elseif (strcmpi(name,'Connectivity')), enum=ConnectivityEnum(); return
-			elseif (strcmpi(name,'ControlParameter')), enum=ControlParameterEnum(); return
 			elseif (strcmpi(name,'ControlSteady')), enum=ControlSteadyEnum(); return
 			elseif (strcmpi(name,'DakotaParameter')), enum=DakotaParameterEnum(); return
Index: /issm/trunk/src/m/enum/SurfaceAbsVelMisfitEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SurfaceAbsVelMisfitEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/SurfaceAbsVelMisfitEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=SurfaceAbsVelMisfitEnum()
 
-macro=156;
+macro=157;
Index: /issm/trunk/src/m/enum/SurfaceAreaEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SurfaceAreaEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/SurfaceAreaEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=SurfaceAreaEnum()
 
-macro=183;
+macro=184;
Index: /issm/trunk/src/m/enum/SurfaceAverageVelMisfitEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SurfaceAverageVelMisfitEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/SurfaceAverageVelMisfitEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=SurfaceAverageVelMisfitEnum()
 
-macro=160;
+macro=161;
Index: /issm/trunk/src/m/enum/SurfaceEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SurfaceEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/SurfaceEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=SurfaceEnum()
 
-macro=184;
+macro=185;
Index: /issm/trunk/src/m/enum/SurfaceLogVelMisfitEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SurfaceLogVelMisfitEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/SurfaceLogVelMisfitEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=SurfaceLogVelMisfitEnum()
 
-macro=158;
+macro=159;
Index: /issm/trunk/src/m/enum/SurfaceLogVxVyMisfitEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SurfaceLogVxVyMisfitEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/SurfaceLogVxVyMisfitEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=SurfaceLogVxVyMisfitEnum()
 
-macro=159;
+macro=160;
Index: /issm/trunk/src/m/enum/SurfaceRelVelMisfitEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SurfaceRelVelMisfitEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/SurfaceRelVelMisfitEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=SurfaceRelVelMisfitEnum()
 
-macro=157;
+macro=158;
Index: /issm/trunk/src/m/enum/SurfaceSlopeXEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SurfaceSlopeXEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/SurfaceSlopeXEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=SurfaceSlopeXEnum()
 
-macro=185;
+macro=186;
Index: /issm/trunk/src/m/enum/SurfaceSlopeYEnum.m
===================================================================
--- /issm/trunk/src/m/enum/SurfaceSlopeYEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/SurfaceSlopeYEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=SurfaceSlopeYEnum()
 
-macro=186;
+macro=187;
Index: /issm/trunk/src/m/enum/TemperatureEnum.m
===================================================================
--- /issm/trunk/src/m/enum/TemperatureEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/TemperatureEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=TemperatureEnum()
 
-macro=187;
+macro=188;
Index: /issm/trunk/src/m/enum/TemperatureOldEnum.m
===================================================================
--- /issm/trunk/src/m/enum/TemperatureOldEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/TemperatureOldEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=TemperatureOldEnum()
 
-macro=189;
+macro=190;
Index: /issm/trunk/src/m/enum/TemporaryTemperatureEnum.m
===================================================================
--- /issm/trunk/src/m/enum/TemporaryTemperatureEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/TemporaryTemperatureEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=TemporaryTemperatureEnum()
 
-macro=188;
+macro=189;
Index: /issm/trunk/src/m/enum/ThermalConductivityEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ThermalConductivityEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ThermalConductivityEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ThermalConductivityEnum()
 
-macro=252;
+macro=253;
Index: /issm/trunk/src/m/enum/ThermalExchangeVelocityEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ThermalExchangeVelocityEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ThermalExchangeVelocityEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ThermalExchangeVelocityEnum()
 
-macro=254;
+macro=255;
Index: /issm/trunk/src/m/enum/ThicknessAbsMisfitEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ThicknessAbsMisfitEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ThicknessAbsMisfitEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ThicknessAbsMisfitEnum()
 
-macro=155;
+macro=156;
Index: /issm/trunk/src/m/enum/ThicknessEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ThicknessEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ThicknessEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ThicknessEnum()
 
-macro=190;
+macro=191;
Index: /issm/trunk/src/m/enum/ThicknessObsEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ThicknessObsEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ThicknessObsEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ThicknessObsEnum()
 
-macro=191;
+macro=192;
Index: /issm/trunk/src/m/enum/TimeAdaptEnum.m
===================================================================
--- /issm/trunk/src/m/enum/TimeAdaptEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/TimeAdaptEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=TimeAdaptEnum()
 
-macro=139;
+macro=140;
Index: /issm/trunk/src/m/enum/TimeEnum.m
===================================================================
--- /issm/trunk/src/m/enum/TimeEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/TimeEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=TimeEnum()
 
-macro=233;
+macro=234;
Index: /issm/trunk/src/m/enum/TriaVertexElementResultEnum.m
===================================================================
--- /issm/trunk/src/m/enum/TriaVertexElementResultEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/TriaVertexElementResultEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=TriaVertexElementResultEnum()
 
-macro=220;
+macro=221;
Index: /issm/trunk/src/m/enum/TypeEnum.m
===================================================================
--- /issm/trunk/src/m/enum/TypeEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/TypeEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=TypeEnum()
 
-macro=192;
+macro=193;
Index: /issm/trunk/src/m/enum/VelEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VelEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VelEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VelEnum()
 
-macro=193;
+macro=194;
Index: /issm/trunk/src/m/enum/VelObsEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VelObsEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VelObsEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VelObsEnum()
 
-macro=194;
+macro=195;
Index: /issm/trunk/src/m/enum/ViscosityOvershootEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ViscosityOvershootEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/ViscosityOvershootEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=ViscosityOvershootEnum()
 
-macro=195;
+macro=196;
Index: /issm/trunk/src/m/enum/VxAverageEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VxAverageEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VxAverageEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VxAverageEnum()
 
-macro=196;
+macro=197;
Index: /issm/trunk/src/m/enum/VxEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VxEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VxEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VxEnum()
 
-macro=197;
+macro=198;
Index: /issm/trunk/src/m/enum/VxObsEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VxObsEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VxObsEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VxObsEnum()
 
-macro=198;
+macro=199;
Index: /issm/trunk/src/m/enum/VxOldEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VxOldEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VxOldEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VxOldEnum()
 
-macro=199;
+macro=200;
Index: /issm/trunk/src/m/enum/VyAverageEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VyAverageEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VyAverageEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VyAverageEnum()
 
-macro=201;
+macro=202;
Index: /issm/trunk/src/m/enum/VyEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VyEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VyEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VyEnum()
 
-macro=202;
+macro=203;
Index: /issm/trunk/src/m/enum/VyObsEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VyObsEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VyObsEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VyObsEnum()
 
-macro=203;
+macro=204;
Index: /issm/trunk/src/m/enum/VyOldEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VyOldEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VyOldEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VyOldEnum()
 
-macro=204;
+macro=205;
Index: /issm/trunk/src/m/enum/VzAverageEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VzAverageEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VzAverageEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VzAverageEnum()
 
-macro=206;
+macro=207;
Index: /issm/trunk/src/m/enum/VzEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VzEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VzEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VzEnum()
 
-macro=207;
+macro=208;
Index: /issm/trunk/src/m/enum/VzMacAyealEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VzMacAyealEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VzMacAyealEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VzMacAyealEnum()
 
-macro=210;
+macro=211;
Index: /issm/trunk/src/m/enum/VzObsEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VzObsEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VzObsEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VzObsEnum()
 
-macro=208;
+macro=209;
Index: /issm/trunk/src/m/enum/VzOldEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VzOldEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VzOldEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VzOldEnum()
 
-macro=209;
+macro=210;
Index: /issm/trunk/src/m/enum/VzPattynEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VzPattynEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VzPattynEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VzPattynEnum()
 
-macro=211;
+macro=212;
Index: /issm/trunk/src/m/enum/VzStokesEnum.m
===================================================================
--- /issm/trunk/src/m/enum/VzStokesEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/VzStokesEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=VzStokesEnum()
 
-macro=212;
+macro=213;
Index: /issm/trunk/src/m/enum/WaterEnum.m
===================================================================
--- /issm/trunk/src/m/enum/WaterEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/WaterEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=WaterEnum()
 
-macro=113;
+macro=114;
Index: /issm/trunk/src/m/enum/WeightsEnum.m
===================================================================
--- /issm/trunk/src/m/enum/WeightsEnum.m	(revision 6199)
+++ /issm/trunk/src/m/enum/WeightsEnum.m	(revision 6200)
@@ -9,3 +9,3 @@
 %      macro=WeightsEnum()
 
-macro=214;
+macro=215;
Index: /issm/trunk/src/m/solutions/control_core.m
===================================================================
--- /issm/trunk/src/m/solutions/control_core.m	(revision 6199)
+++ /issm/trunk/src/m/solutions/control_core.m	(revision 6200)
@@ -84,5 +84,4 @@
 	%Some results not computed by diagnostic or steadystate
 	femmodel.elements=InputToResult(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,control_type);
-	femmodel.elements=InputToResult(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,GradientEnum);
 	femmodel.results=AddExternalResult(femmodel.results,JEnum,J);
 	femmodel.results=AddExternalResult(femmodel.results,ControlTypeEnum,control_type);
Index: /issm/trunk/src/m/solutions/gradient_core.m
===================================================================
--- /issm/trunk/src/m/solutions/gradient_core.m	(revision 6199)
+++ /issm/trunk/src/m/solutions/gradient_core.m	(revision 6200)
@@ -25,9 +25,7 @@
 	control_steady=femmodel.parameters.ControlSteady;
 
-	displaystring(verbose,'\n%s',['      compute gradient...']);
+	displaystring(verbose,'%s\n',['      compute gradient...']);
 	grad=Gradj(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters);
 
-	displaystring(verbose,'\n%s',['      retrieve old gradient...']);
-	old_gradient=GetVectorFromInputs(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,OldGradientEnum,VertexEnum);
 
 	if control_steady;
@@ -36,17 +34,13 @@
 
 	if (step>1 && search_scalar==0),
-		displaystring(verbose,'\n%s',['      orthogonalization...']);
+		displaystring(verbose,'%s\n',['      orthogonalization...']);
+		displaystring(verbose,'%s\n',['      retrieve old gradient...']);
+		old_gradient=ControlInputGetGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials,femmodel.parameters,control_type);
 		new_gradient=Orth(grad,old_gradient);
 	else
-		displaystring(verbose,'\n%s',['      normalizing direction...']);
+		displaystring(verbose,'%s\n',['      normalizing direction...']);
 		new_gradient=Orth(grad,[]);
 	end
-	displaystring(verbose,'\n%s',['      done...']);
-
-	%point gradient and old_gradient to new_gradient:
-	grad=new_gradient;
-	old_gradient=new_gradient;
 
 	%plug back into inputs:
-	[femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters]=InputUpdateFromVector(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,grad,GradientEnum,VertexEnum);
-	[femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters]=InputUpdateFromVector(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,old_gradient,OldGradientEnum,VertexEnum);
+	[femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters]=ControlInputSetGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials,  femmodel.parameters,control_type,new_gradient);
Index: /issm/trunk/src/mex/ControlInputGetGradient/ControlInputGetGradient.cpp
===================================================================
--- /issm/trunk/src/mex/ControlInputGetGradient/ControlInputGetGradient.cpp	(revision 6200)
+++ /issm/trunk/src/mex/ControlInputGetGradient/ControlInputGetGradient.cpp	(revision 6200)
@@ -0,0 +1,63 @@
+/*\file ControlInputGetGradient.c
+ *\brief: recover velocity ug from inputs
+ */
+
+#include "./ControlInputGetGradient.h"
+
+void mexFunction( int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]){
+
+	/*input datasets: */
+	Elements   *elements   = NULL;
+	Nodes      *nodes      = NULL;
+	Vertices   *vertices   = NULL;
+	Loads      *loads      = NULL;
+	Materials  *materials  = NULL;
+	Parameters *parameters = NULL;
+	int         control_type;
+	Vec         gradient   = NULL;
+
+	/* output datasets: elements and loads*/
+
+	/*Boot module: */
+	MODULEBOOT();
+
+	/*checks on arguments on the matlab side: */
+	CheckNumMatlabArguments(nlhs,NLHS,nrhs,NRHS,__FUNCT__,&ControlInputGetGradientUsage);
+	
+	/*Input datasets: */
+	FetchData((DataSet**)&elements,ELEMENTSIN);
+	FetchData((DataSet**)&nodes,NODES);
+	FetchData((DataSet**)&vertices,VERTICES);
+	FetchData((DataSet**)&loads,LOADSIN);
+	FetchData((DataSet**)&materials,MATERIALS);
+	FetchData(&control_type,CONTROLTYPE);
+
+	/*configure: */
+	elements->  Configure(elements,loads, nodes,vertices, materials,parameters);
+	nodes->     Configure(elements,loads, nodes,vertices, materials,parameters);
+	loads->     Configure(elements, loads, nodes,vertices, materials,parameters);
+
+	/*!core code:*/
+	ControlInputGetGradientx(&gradient,elements, nodes,vertices,loads, materials,parameters,control_type);
+
+	/*write output datasets: */
+	WriteData(GRADIENT,gradient);
+
+	/*Free ressources: */
+	delete elements;
+	delete nodes;
+	delete vertices;
+	delete loads;
+	delete materials;
+	delete parameters;
+
+	/*end module: */
+	MODULEEND();
+}
+
+void ControlInputGetGradientUsage(void)
+{
+	_printf_("\n");
+	_printf_("   usage: [gradient] = %s(elements,nodes,vertices,loads, materials,parameters,control_type);\n",__FUNCT__);
+	_printf_("\n");
+}
Index: /issm/trunk/src/mex/ControlInputGetGradient/ControlInputGetGradient.h
===================================================================
--- /issm/trunk/src/mex/ControlInputGetGradient/ControlInputGetGradient.h	(revision 6200)
+++ /issm/trunk/src/mex/ControlInputGetGradient/ControlInputGetGradient.h	(revision 6200)
@@ -0,0 +1,36 @@
+/*
+	ControlInputGetGradient.h
+*/
+
+#ifndef _CONTROLINPUTGETGRADIENT_H
+#define _CONTROLINPUTGETGRADIENT_H
+
+/* local prototypes: */
+void ControlInputGetGradientUsage(void);
+
+#include "../../c/modules/modules.h"
+#include "../../c/Container/Container.h"
+#include "../../c/shared/shared.h"
+
+#undef __FUNCT__ 
+#define __FUNCT__  "ControlInputGetGradient"
+
+/* serial input macros: */
+#define ELEMENTSIN (mxArray*)prhs[0]
+#define NODES (mxArray*)prhs[1]
+#define VERTICES (mxArray*)prhs[2]
+#define LOADSIN (mxArray*)prhs[3]
+#define MATERIALS (mxArray*)prhs[4]
+#define PARAMETERS (mxArray*)prhs[5]
+#define CONTROLTYPE (mxArray*)prhs[6]
+
+/* serial output macros: */
+#define GRADIENT (mxArray**)&plhs[0]
+
+/* serial arg counts: */
+#undef NLHS
+#define NLHS  1
+#undef NRHS
+#define NRHS  7
+
+#endif
Index: /issm/trunk/src/mex/ControlInputSetGradient/ControlInputSetGradient.cpp
===================================================================
--- /issm/trunk/src/mex/ControlInputSetGradient/ControlInputSetGradient.cpp	(revision 6200)
+++ /issm/trunk/src/mex/ControlInputSetGradient/ControlInputSetGradient.cpp	(revision 6200)
@@ -0,0 +1,68 @@
+/*\file ControlInputSetGradient.c
+*\brief: update elements properties using an input  vector
+*/
+
+#include "./ControlInputSetGradient.h"
+
+void mexFunction( int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]){
+
+/*input datasets: */
+Elements   *elements   = NULL;
+Nodes      *nodes      = NULL;
+Vertices   *vertices   = NULL;
+Loads      *loads      = NULL;
+Materials  *materials  = NULL;
+Parameters *parameters = NULL;
+int         control_type;
+double     *gradient   = NULL;
+
+/*Boot module: */
+MODULEBOOT();
+
+/*checks on arguments on the matlab side: */
+CheckNumMatlabArguments(nlhs,NLHS,nrhs,NRHS,__FUNCT__,&ControlInputSetGradientUsage);
+
+/*Input datasets: */
+FetchData((DataSet**)&elements,ELEMENTSIN);
+FetchData((DataSet**)&nodes,NODESIN);
+FetchData((DataSet**)&vertices,VERTICESIN);
+FetchData((DataSet**)&loads,LOADSIN);
+FetchData((DataSet**)&materials,MATERIALSIN);
+FetchParams(&parameters,PARAMETERSIN);
+FetchData(&control_type,CONTROLTYPE);
+FetchData(&gradient,NULL,GRADIENT);
+
+/*configure: */
+elements->  Configure(elements,loads, nodes,vertices, materials,parameters);
+nodes->     Configure(elements,loads, nodes,vertices, materials,parameters);
+loads->     Configure(elements, loads, nodes,vertices, materials,parameters);
+
+/*call "x" code layer*/
+ControlInputSetGradientx(elements,nodes,vertices,loads, materials,parameters,control_type,gradient);
+
+/*write output datasets: */
+WriteData(ELEMENTS,elements);
+WriteData(NODES,nodes);
+WriteData(VERTICES,vertices);
+WriteData(LOADS,loads);
+WriteData(MATERIALS,materials);
+WriteParams(PARAMETERS,parameters);
+
+/*Free ressources: */
+delete elements;
+delete nodes;
+delete vertices;
+delete loads;
+delete materials;
+delete parameters;
+
+/*end module: */
+MODULEEND();
+}
+
+void ControlInputSetGradientUsage(void)
+{
+	_printf_("\n");
+	_printf_("   usage: [elements,nodes,vertices,loads,materials,parameters] = %s(elements,nodes,vertices,loads,materials,control_type,gradient);\n",__FUNCT__);
+	_printf_("\n");
+}
Index: /issm/trunk/src/mex/ControlInputSetGradient/ControlInputSetGradient.h
===================================================================
--- /issm/trunk/src/mex/ControlInputSetGradient/ControlInputSetGradient.h	(revision 6200)
+++ /issm/trunk/src/mex/ControlInputSetGradient/ControlInputSetGradient.h	(revision 6200)
@@ -0,0 +1,43 @@
+/*
+	ControlInputSetGradient.h
+*/
+
+#ifndef _CONTROLINPUTSETGRADIENT_H
+#define _CONTROLINPUTSETGRADIENT_H
+
+/* local prototypes: */
+void ControlInputSetGradientUsage(void);
+
+#include "../../c/modules/modules.h"
+#include "../../c/Container/Container.h"
+#include "../../c/shared/shared.h"
+#include "../../c/EnumDefinitions/EnumDefinitions.h"
+
+#undef __FUNCT__ 
+#define __FUNCT__  "ControlInputSetGradient"
+
+/* serial input macros: */
+#define ELEMENTSIN (mxArray*)prhs[0]
+#define NODESIN (mxArray*)prhs[1]
+#define VERTICESIN (mxArray*)prhs[2]
+#define LOADSIN (mxArray*)prhs[3]
+#define MATERIALSIN (mxArray*)prhs[4]
+#define PARAMETERSIN (mxArray*)prhs[5]
+#define CONTROLTYPE (mxArray*)prhs[6]
+#define GRADIENT (mxArray*)prhs[7]
+
+/* serial output macros: */
+#define ELEMENTS (mxArray**)&plhs[0]
+#define NODES (mxArray**)&plhs[1]
+#define VERTICES (mxArray**)&plhs[2]
+#define LOADS (mxArray**)&plhs[3]
+#define MATERIALS (mxArray**)&plhs[4]
+#define PARAMETERS (mxArray**)&plhs[5]
+
+/* serial arg counts: */
+#undef NLHS
+#define NLHS  6
+#undef NRHS
+#define NRHS  8
+
+#endif
Index: /issm/trunk/src/mex/Makefile.am
===================================================================
--- /issm/trunk/src/mex/Makefile.am	(revision 6199)
+++ /issm/trunk/src/mex/Makefile.am	(revision 6200)
@@ -14,4 +14,6 @@
 				ConfigureObjects \
 				ControlOptimization\
+				ControlInputGetGradient\
+				ControlInputSetGradient\
 				ContourToMesh \
 				ContourToNodes \
@@ -128,4 +130,10 @@
 			  ControlOptimization/ControlOptimization.h
 
+ControlInputGetGradient_SOURCES = ControlInputGetGradient/ControlInputGetGradient.cpp\
+										ControlInputGetGradient/ControlInputGetGradient.h
+
+ControlInputSetGradient_SOURCES = ControlInputSetGradient/ControlInputSetGradient.cpp\
+			  ControlInputSetGradient/ControlInputSetGradient.h
+
 InputControlUpdate_SOURCES = InputControlUpdate/InputControlUpdate.cpp\
 										  InputControlUpdate/InputControlUpdate.h
