Index: /issm/trunk-jpl/src/c/classes/Params/ControlParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/ControlParam.cpp	(revision 27718)
+++ /issm/trunk-jpl/src/c/classes/Params/ControlParam.cpp	(revision 27719)
@@ -166,4 +166,11 @@
 }
 /*}}}*/
+void  ControlParam::GetParameterValue(IssmDouble* poutput, IssmDouble time){/*{{{*/
+
+	_assert_(M==1);
+	*poutput = value[0];
+
+}
+/*}}}*/
 void  ControlParam::GetParameterValue(IssmDouble** poutput, int* pM){/*{{{*/
 
@@ -203,2 +210,21 @@
 }
 /*}}}*/
+void  ControlParam::GetVectorFromControl(Vector<IssmDouble>* vector,int control_index,int N,const char* data,int offset){/*{{{*/
+
+	/*Get list of ids for this element and this control*/
+	_assert_(N==this->M); //FIXME
+	int*        idlist = xNew<int>(this->M);
+	IssmDouble* values = xNew<IssmDouble>(this->M);
+
+	for(int i=0;i<this->M;i++){
+		idlist[i] = offset+i;
+		values[i] = this->value[i];
+	}
+
+	vector->SetValues(this->M,idlist,values,INS_VAL);
+
+	/*Clean up*/
+	xDelete<int>(idlist);
+	xDelete<IssmDouble>(values);
+
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/ControlParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/ControlParam.h	(revision 27718)
+++ /issm/trunk-jpl/src/c/classes/Params/ControlParam.h	(revision 27719)
@@ -1,4 +1,4 @@
 /*! \file ControlParam.h 
- *  \brief: header file for triavertexinput object
+ *  \brief: header file for ControlParam object
  */
 
@@ -21,5 +21,4 @@
 
 	private: 
-		/*just hold 3 values for 3 vertices: */
 		IssmDouble* value;
 		IssmDouble* minvalue;
@@ -27,6 +26,6 @@
 		IssmDouble* savedvalue;
 		IssmDouble* gradient; 
-		int        enum_type;
-		int        M;
+		int         enum_type;
+		int         M;
 
 	public:
@@ -51,5 +50,5 @@
 		void  GetParameterValue(int** pintarray,int* pM,int* pN){_error_("Param "<< EnumToStringx(enum_type) << " cannot return a matrix");}
 		void  GetParameterValue(IssmDouble* pIssmDouble);
-		void  GetParameterValue(IssmDouble* pdouble,IssmDouble time){_error_("Param "<< EnumToStringx(enum_type) << " cannot return a IssmDouble for a given time");}
+		void  GetParameterValue(IssmDouble* pdouble,IssmDouble time);
 		void  GetParameterValue(char** pstring){_error_("Param "<< EnumToStringx(enum_type) << " cannot return a string");}
 		void  GetParameterValue(char*** pstringarray,int* pM){_error_("Param "<< EnumToStringx(enum_type) << " cannot return a string array");}
@@ -80,4 +79,5 @@
 		void  SetValue(IssmDouble** array, int M, int* mdim_array, int* ndim_array){_error_("Param "<< EnumToStringx(enum_type) << " cannot hold an array of matrices");}
 		void  SetGradient(IssmDouble* poutput, int M);
+		void  GetVectorFromControl(Vector<IssmDouble>* vector,int control_index,int N,const char* data,int offset);
 		/*}}}*/
 };
Index: /issm/trunk-jpl/src/c/classes/Params/Param.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/Param.h	(revision 27718)
+++ /issm/trunk-jpl/src/c/classes/Params/Param.h	(revision 27719)
@@ -66,4 +66,5 @@
 		virtual void  SetValue(IssmDouble** array, int M, int* mdim_array, int* ndim_array)=0;
 		virtual void  SetGradient(IssmDouble* poutput, int M)=0;
+		virtual void  GetVectorFromControl(Vector<IssmDouble>* vector,int control_index,int N,const char* data,int offset){_error_("not implemented yet");};
 };
 #endif
Index: /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 27718)
+++ /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 27719)
@@ -673,4 +673,13 @@
 /*}}}*/
 
+void  Parameters::GetVectorFromControl(Vector<IssmDouble>* vector,int control_enum,int control_index,int N,const char* data,int offset){/*{{{*/
+
+	/*first, figure out if the param has already been created: */
+	Param* param=xDynamicCast<Param*>(this->FindParamObject(control_enum));
+	if(!param) _error_("Parameter not found");
+
+	param->GetVectorFromControl(vector, control_index, N, data, offset);
+}/*}}}*/
+
 Param* Parameters::FindParamObject(int param_enum){/*{{{*/
 
Index: /issm/trunk-jpl/src/c/classes/Params/Parameters.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/Parameters.h	(revision 27718)
+++ /issm/trunk-jpl/src/c/classes/Params/Parameters.h	(revision 27719)
@@ -76,4 +76,5 @@
 		void  SetControlParam(IssmDouble* IssmDoublearray,int M, int enum_type);
 		void  ControlParamSetGradient(IssmDouble* IssmDoublearray, int M, int enum_type);
+		void  GetVectorFromControl(Vector<IssmDouble>* vector,int control_enum,int control_index,int N,const char* data,int offset);
 		Param* FindParamObject(int enum_type);
 
Index: /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp	(revision 27718)
+++ /issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp	(revision 27719)
@@ -598,11 +598,5 @@
 
 	/*Get initial guess*/
-	if(IsParamEnum(control_enum[0])){
-		femmodel->parameters->FindControlParamAndMakePassive(&X,NULL,control_enum[0],"value");
-		intn=M[0];
-	}
-	else{
-		GetPassiveVectorFromControlInputsx(&X,&intn,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value");
-	}
+	GetPassiveVectorFromControlInputsx(&X,&intn,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value");
 
 	/*Get problem dimension and initialize gradient and initial guess*/
Index: /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp	(revision 27718)
+++ /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp	(revision 27719)
@@ -30,7 +30,17 @@
 	int offset = 0;
 	for(int i=0;i<num_controls;i++){
-		for(Object* & object : elements->objects){
-			Element* element=xDynamicCast<Element*>(object);
-			element->GetVectorFromControlInputs(vector,control_type[i],i,N[i],data,offset);
+
+		/*Is the control a Param?*/
+		if(IsParamEnum(control_type[i])){
+			parameters->GetVectorFromControl(vector,control_type[i],i,N[i],data,offset);
+		}
+		else if(IsInputEnum(control_type[i])){
+			for(Object* & object : elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
+				element->GetVectorFromControlInputs(vector,control_type[i],i,N[i],data,offset);
+			}
+		}
+		else{
+			_error_("not supported yet");
 		}
 		offset += M[i]*N[i];
