Index: /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp	(revision 11317)
+++ /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp	(revision 11318)
@@ -9,5 +9,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void GetVectorFromControlInputsx(Vec* pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters){
+void GetVectorFromControlInputsx(Vec* pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,const char* data){
 
 	int  num_controls;
@@ -25,5 +25,5 @@
 		for(int j=0;j<elements->Size();j++){
 			Element* element=(Element*)elements->GetObjectByOffset(j);
-			element->GetVectorFromControlInputs(vector,control_type[i],i);
+			element->GetVectorFromControlInputs(vector,control_type[i],i,data);
 		}
 	}
@@ -37,5 +37,5 @@
 }
 
-void GetVectorFromControlInputsx( double** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters){
+void GetVectorFromControlInputsx( double** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, const char* data){
 	
 	/*output: */
@@ -45,5 +45,5 @@
 	Vec vec_vector=NULL;
 
-	GetVectorFromControlInputsx( &vec_vector, elements,nodes, vertices, loads, materials, parameters);
+	GetVectorFromControlInputsx( &vec_vector, elements,nodes, vertices, loads, materials, parameters,data);
 	VecToMPISerial(&vector,vec_vector);
 
Index: /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.h	(revision 11317)
+++ /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.h	(revision 11318)
@@ -9,6 +9,6 @@
 
 /* local prototypes: */
-void	GetVectorFromControlInputsx( Vec* pvector, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters);
-void	GetVectorFromControlInputsx( double** pvector, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters);
+void	GetVectorFromControlInputsx( Vec* pvector, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,const char* data="value");
+void	GetVectorFromControlInputsx( double** pvector, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,const char* data="value");
 
 #endif  /* _GETVECTORFROMCONTROLINPUTSXX_H */
Index: /issm/trunk-jpl/src/c/objects/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/objects/Elements/Element.h	(revision 11317)
+++ /issm/trunk-jpl/src/c/objects/Elements/Element.h	(revision 11318)
@@ -103,5 +103,5 @@
 		virtual void   ControlInputSetGradient(double* gradient,int enum_type,int control_index)=0;
 		virtual void   ControlInputScaleGradient(int enum_type, double scale)=0;
-		virtual void   GetVectorFromControlInputs(Vec gradient,int control_enum,int control_index)=0;
+		virtual void   GetVectorFromControlInputs(Vec gradient,int control_enum,int control_index,const char* data)=0;
 		virtual void   SetControlInputsFromVector(double* vector,int control_enum,int control_index)=0;
 		virtual void   InputControlUpdate(double scalar,bool save_parameter)=0;
Index: /issm/trunk-jpl/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/Elements/Penta.cpp	(revision 11317)
+++ /issm/trunk-jpl/src/c/objects/Elements/Penta.cpp	(revision 11318)
@@ -5132,5 +5132,5 @@
 /*}}}*/
 /*FUNCTION Penta::GetVectorFromControlInputs{{{1*/
-void  Penta::GetVectorFromControlInputs(Vec vector,int control_enum,int control_index){
+void  Penta::GetVectorFromControlInputs(Vec vector,int control_enum,int control_index,const char* data){
 
 	int doflist1[NUMVERTICES];
@@ -5146,6 +5146,10 @@
 	if(!input) _error_("Input %s not found in element",EnumToStringx(control_enum));
 
-	/*We found the enum.  Use its values to fill into the vector, using the vertices ids: */
-	input->GetVectorFromInputs(vector,&doflist1[0]);
+	/*Check that it is a ControlInput*/
+	if (input->ObjectEnum()!=ControlInputEnum){
+		_error_("input %s is not a ControlInput",EnumToStringx(control_enum));
+	}
+
+	((ControlInput*)input)->GetVectorFromInputs(vector,&doflist1[0],data);
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/objects/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/objects/Elements/Penta.h	(revision 11317)
+++ /issm/trunk-jpl/src/c/objects/Elements/Penta.h	(revision 11318)
@@ -149,5 +149,5 @@
 		void   GradjBbarPattyn(Vec gradient,int control_index);
 		void   GradjBbarStokes(Vec gradient,int control_index);
-		void   GetVectorFromControlInputs(Vec gradient,int control_enum,int control_index);
+		void   GetVectorFromControlInputs(Vec gradient,int control_enum,int control_index,const char* data);
 		void   SetControlInputsFromVector(double* vector,int control_enum,int control_index);
 		void   ControlInputGetGradient(Vec gradient,int enum_type,int control_index);
Index: /issm/trunk-jpl/src/c/objects/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/Elements/Tria.cpp	(revision 11317)
+++ /issm/trunk-jpl/src/c/objects/Elements/Tria.cpp	(revision 11318)
@@ -4731,5 +4731,5 @@
 /*}}}*/
 /*FUNCTION Tria::GetVectorFromControlInputs{{{1*/
-void  Tria::GetVectorFromControlInputs(Vec vector,int control_enum,int control_index){
+void  Tria::GetVectorFromControlInputs(Vec vector,int control_enum,int control_index,const char* data){
 
 	int doflist1[NUMVERTICES];
@@ -4745,6 +4745,10 @@
 	if(!input) _error_("Input %s not found in element",EnumToStringx(control_enum));
 
-	/*We found the enum.  Use its values to fill into the vector, using the vertices ids: */
-	input->GetVectorFromInputs(vector,&doflist1[0]);
+	/*Check that it is a ControlInput*/
+	if (input->ObjectEnum()!=ControlInputEnum){
+		_error_("input %s is not a ControlInput",EnumToStringx(control_enum));
+	}
+
+	((ControlInput*)input)->GetVectorFromInputs(vector,&doflist1[0],data);
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/objects/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/objects/Elements/Tria.h	(revision 11317)
+++ /issm/trunk-jpl/src/c/objects/Elements/Tria.h	(revision 11318)
@@ -150,5 +150,5 @@
 		void   GradjVxBalancedthickness(Vec gradient,int control_index);
 		void   GradjVyBalancedthickness(Vec gradient,int control_index);
-		void   GetVectorFromControlInputs(Vec gradient,int control_enum,int control_index);
+		void   GetVectorFromControlInputs(Vec gradient,int control_enum,int control_index,const char* data);
 		void   SetControlInputsFromVector(double* vector,int control_enum,int control_index);
 		void   ControlInputGetGradient(Vec gradient,int enum_type,int control_index);
Index: /issm/trunk-jpl/src/c/objects/Inputs/ControlInput.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/Inputs/ControlInput.cpp	(revision 11317)
+++ /issm/trunk-jpl/src/c/objects/Inputs/ControlInput.cpp	(revision 11318)
@@ -406,7 +406,29 @@
 	return gradient->SpawnResult(step,time);
 }/*}}}*/
-/*FUNCTION ControlInput::GetInputValue(bool* pvalue){{{1*/
+/*FUNCTION ControlInput::GetVectorFromInputs(Vec vector,int* doflist){{{1*/
 void ControlInput::GetVectorFromInputs(Vec vector,int* doflist){
 	values->GetVectorFromInputs(vector,doflist);
+}/*}}}*/
+/*FUNCTION ControlInput::GetVectorFromInputs(Vec vector,int* doflist,const char* data){{{1*/
+void ControlInput::GetVectorFromInputs(Vec vector,int* doflist,const char* data){
+	 if(strcmp(data,"value")==0){
+		 _assert_(values);
+		 values->GetVectorFromInputs(vector,doflist);
+	 }
+	 else if (strcmp(data,"lowerbound")==0){
+		 _assert_(minvalues);
+		 minvalues->GetVectorFromInputs(vector,doflist);
+	 }
+	 else if (strcmp(data,"upperbound")==0){
+		 _assert_(maxvalues);
+		 maxvalues->GetVectorFromInputs(vector,doflist);
+	 }
+	 else if (strcmp(data,"gradient")==0){
+		 _assert_(gradient);
+		 gradient->GetVectorFromInputs(vector,doflist);
+	 }
+	 else{
+		 _error_("Data %s not supported yet",data);
+	 }
 }/*}}}*/
 /*FUNCTION ControlInput::GetInputAverage(double* pvalue){{{1*/
Index: /issm/trunk-jpl/src/c/objects/Inputs/ControlInput.h
===================================================================
--- /issm/trunk-jpl/src/c/objects/Inputs/ControlInput.h	(revision 11317)
+++ /issm/trunk-jpl/src/c/objects/Inputs/ControlInput.h	(revision 11318)
@@ -87,4 +87,5 @@
 		void Extrude(void);
 		void VerticallyIntegrate(Input* thickness_input);
+		void GetVectorFromInputs(Vec vector,int* doflist,const char* data);
 		void GetVectorFromInputs(Vec vector,int* doflist);
 		void GetValuesPtr(double** pvalues,int* pnum_values){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/solutions/controltao_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutions/controltao_core.cpp	(revision 11317)
+++ /issm/trunk-jpl/src/c/solutions/controltao_core.cpp	(revision 11318)
@@ -58,8 +58,12 @@
 	XL=NewVec(numberofvertices); VecSet(XL,1.);
 	XU=NewVec(numberofvertices); VecSet(XU,200.);
-	//TaoSetVariableBounds(tao,XL,XU); VecFree(&XL); VecFree(&XU);
 
-	GetVectorFromControlInputsx(&X,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
+	GetVectorFromControlInputsx(&X, femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value");
+	GetVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
+	GetVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
 	TaoSetInitialVector(tao,X);
+	TaoSetVariableBounds(tao,XL,XU);
+	VecFree(&XL);
+	VecFree(&XU);
 
 	user.femmodel=femmodel;
