Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 20635)
@@ -80,5 +80,4 @@
 	/*Save communicator in the parameters dataset: */
 	this->parameters->AddObject(new GenericParam<ISSM_MPI_Comm>(incomm,FemModelCommEnum));
-
 
 	/*Free resources */
Index: /issm/trunk-jpl/src/c/classes/IoModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 20635)
@@ -281,5 +281,6 @@
 
 	/*Find constant*/
-	Param* param=xDynamicCast<Param*>(this->constants->FindParamObject(constant_enum));
+	//FIXME _error_("Needs to be FIXED");
+	Param* param=this->constants->FindParamObject(constant_enum);
 	if(!param) _error_("Constant " << EnumToStringx(constant_enum) << " not found in iomodel");
 
@@ -485,5 +486,6 @@
 
 						/*create BoolParam: */
-						this->constants->AddObject(new BoolParam(record_enum,(bool)booleanint)); //cast to boolean
+						if(record_enum!=MaximumNumberOfDefinitionsEnum && record_enum!=MaximumNumberOfDefinitionsEnum+1)
+						 this->constants->AddObject(new BoolParam(record_enum,(bool)booleanint)); //cast to boolean
 
 						break;
@@ -594,5 +596,6 @@
 
 					/*create BoolParam: */
-					this->constants->AddObject(new BoolParam(record_enum,(bool)booleanint)); //cast to a boolean
+					if(record_enum!=MaximumNumberOfDefinitionsEnum && record_enum!=MaximumNumberOfDefinitionsEnum+1)
+					 this->constants->AddObject(new BoolParam(record_enum,(bool)booleanint)); //cast to a boolean
 					break;
 
Index: /issm/trunk-jpl/src/c/classes/Params/BoolParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/BoolParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/BoolParam.cpp	(revision 20635)
@@ -48,5 +48,5 @@
 }
 /*}}}*/
-Object* BoolParam::copy() {/*{{{*/
+Param* BoolParam::copy() {/*{{{*/
 
 	return new BoolParam(this->enum_type,this->value);
Index: /issm/trunk-jpl/src/c/classes/Params/BoolParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/BoolParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/BoolParam.h	(revision 20635)
@@ -35,5 +35,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/DataSetParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/DataSetParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/DataSetParam.cpp	(revision 20635)
@@ -52,5 +52,5 @@
 }
 /*}}}*/
-Object* DataSetParam::copy() {/*{{{*/
+Param* DataSetParam::copy() {/*{{{*/
 
 	return new DataSetParam(this->enum_type,this->value);
Index: /issm/trunk-jpl/src/c/classes/Params/DataSetParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/DataSetParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/DataSetParam.h	(revision 20635)
@@ -36,5 +36,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/DoubleMatArrayParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/DoubleMatArrayParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/DoubleMatArrayParam.cpp	(revision 20635)
@@ -116,5 +116,5 @@
 }
 /*}}}*/
-Object* DoubleMatArrayParam::copy() {/*{{{*/
+Param* DoubleMatArrayParam::copy() {/*{{{*/
 
 	return new DoubleMatArrayParam(this->enum_type,this->array, this->M, this->mdim_array,this->ndim_array);
Index: /issm/trunk-jpl/src/c/classes/Params/DoubleMatArrayParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/DoubleMatArrayParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/DoubleMatArrayParam.h	(revision 20635)
@@ -38,5 +38,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/DoubleMatParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/DoubleMatParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/DoubleMatParam.cpp	(revision 20635)
@@ -67,5 +67,5 @@
 }
 /*}}}*/
-Object* DoubleMatParam::copy() {/*{{{*/
+Param* DoubleMatParam::copy() {/*{{{*/
 
 	return new DoubleMatParam(this->enum_type,this->value,this->M,this->N);
Index: /issm/trunk-jpl/src/c/classes/Params/DoubleMatParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/DoubleMatParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/DoubleMatParam.h	(revision 20635)
@@ -37,5 +37,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/DoubleParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/DoubleParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/DoubleParam.cpp	(revision 20635)
@@ -46,5 +46,5 @@
 }
 /*}}}*/
-Object* DoubleParam::copy() {/*{{{*/
+Param* DoubleParam::copy() {/*{{{*/
 
 	return new DoubleParam(this->enum_type,this->value);
Index: /issm/trunk-jpl/src/c/classes/Params/DoubleParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/DoubleParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/DoubleParam.h	(revision 20635)
@@ -36,5 +36,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/DoubleVecParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/DoubleVecParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/DoubleVecParam.cpp	(revision 20635)
@@ -59,5 +59,5 @@
 }
 /*}}}*/
-Object* DoubleVecParam::copy() {/*{{{*/
+Param* DoubleVecParam::copy() {/*{{{*/
 
 	return new DoubleVecParam(this->enum_type,this->values,this->M);
Index: /issm/trunk-jpl/src/c/classes/Params/DoubleVecParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/DoubleVecParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/DoubleVecParam.h	(revision 20635)
@@ -36,5 +36,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/FileParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/FileParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/FileParam.cpp	(revision 20635)
@@ -49,5 +49,5 @@
 }
 /*}}}*/
-Object* FileParam::copy() {/*{{{*/
+Param* FileParam::copy() {/*{{{*/
 
 	return new FileParam(this->enum_type,this->value);
Index: /issm/trunk-jpl/src/c/classes/Params/FileParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/FileParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/FileParam.h	(revision 20635)
@@ -35,5 +35,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/GenericParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/GenericParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/GenericParam.h	(revision 20635)
@@ -52,5 +52,5 @@
                 // it does not clarify  ownership of the newed up instance...
                 // use the default copy constructor instead
-                Object* copy() { return new GenericParam<P>(*this); };
+                Param* copy() { return new GenericParam<P>(*this); };
 					 void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction){
 						 _printf_("   WARNING: parameter "<<EnumToStringx(this->myEnumVal)<<" is a GenericParam and cannot be marshalled\n");
Index: /issm/trunk-jpl/src/c/classes/Params/IntMatParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/IntMatParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/IntMatParam.cpp	(revision 20635)
@@ -67,5 +67,5 @@
 }
 /*}}}*/
-Object* IntMatParam::copy() {/*{{{*/
+Param* IntMatParam::copy() {/*{{{*/
 
 	return new IntMatParam(this->enum_type,this->value,this->M,this->N);
Index: /issm/trunk-jpl/src/c/classes/Params/IntMatParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/IntMatParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/IntMatParam.h	(revision 20635)
@@ -37,5 +37,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/IntParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/IntParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/IntParam.cpp	(revision 20635)
@@ -49,5 +49,5 @@
 }
 /*}}}*/
-Object* IntParam::copy() {/*{{{*/
+Param* IntParam::copy() {/*{{{*/
 
 	return new IntParam(this->enum_type,this->value);
Index: /issm/trunk-jpl/src/c/classes/Params/IntParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/IntParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/IntParam.h	(revision 20635)
@@ -36,5 +36,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/IntVecParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/IntVecParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/IntVecParam.cpp	(revision 20635)
@@ -79,5 +79,5 @@
 }
 /*}}}*/
-Object* IntVecParam::copy() {/*{{{*/
+Param* IntVecParam::copy() {/*{{{*/
 
 	return new IntVecParam(this->enum_type,this->values,this->M);
Index: /issm/trunk-jpl/src/c/classes/Params/IntVecParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/IntVecParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/IntVecParam.h	(revision 20635)
@@ -37,5 +37,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/MatrixParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/MatrixParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/MatrixParam.cpp	(revision 20635)
@@ -58,5 +58,5 @@
 }
 /*}}}*/
-Object* MatrixParam::copy() {/*{{{*/
+Param* MatrixParam::copy() {/*{{{*/
 
 	return new MatrixParam(this->enum_type,this->value);
Index: /issm/trunk-jpl/src/c/classes/Params/MatrixParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/MatrixParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/MatrixParam.h	(revision 20635)
@@ -36,5 +36,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction){ _error_("not implemented yet!"); };
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/Param.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/Param.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/Param.h	(revision 20635)
@@ -19,5 +19,5 @@
 /*}}}*/
 
-class Param: public Object{
+class Param{
 
 	public: 
@@ -25,4 +25,6 @@
 
 		/*Virtual functions:*/
+		virtual void  Echo()=0;
+		virtual Param* copy()=0;
 		virtual int   InstanceEnum()=0;
 		virtual void  GetParameterValue(bool* pbool)=0;
Index: /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 20635)
@@ -41,273 +41,218 @@
 /*Object constructors and destructor*/
 Parameters::Parameters(){/*{{{*/
-	enum_type=ParametersEnum;
+	for(int i=0;i<NUMPARAMS;i++) this->params[i] = NULL;
 	return;
 }
 /*}}}*/
 Parameters::~Parameters(){/*{{{*/
+	for(int i=0;i<NUMPARAMS;i++){
+		if(this->params[i]) delete this->params[i];
+	}
 	return;
 }
 /*}}}*/
 
+void Parameters::AddObject(Param* newparam){/*{{{*/
+
+	/*Get Enum from Param*/
+	_assert_(newparam);
+	int param_enum = newparam->InstanceEnum();
+
+	/*Get index in array*/
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+	int index = param_enum - ParametersSTARTEnum -1;
+
+	/*Delete param if it already exists*/
+	if(this->params[index]){
+		delete this->params[index];
+		this->params[index] = NULL;
+	}
+
+	/*Add param to array*/
+	this->params[index] = newparam;
+}
+/*}}}*/
+Parameters* Parameters::Copy(void){/*{{{*/
+	_error_("not implemented yet");
+}
+/*}}}*/
+void Parameters::Marshall(char** pmarshalled_data, int* pmarshalled_data_size, int marshall_direction){/*{{{*/
+	_error_("not implemented yet");
+}
+/*}}}*/
+void Parameters::Echo(void){/*{{{*/
+	_error_("not implemented yet");
+}
+/*}}}*/
+void Parameters::DeepEcho(void){/*{{{*/
+	_error_("not implemented yet");
+}
+/*}}}*/
+
 /*Object management*/
-bool Parameters::Exist(int enum_type){/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type) return true;
-	}
+bool Parameters::Exist(int param_enum){/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(this->params[index]) return true;
+
 	return false;
 }
 /*}}}*/
-void Parameters::FindParam(bool* pbool,int enum_type){ _assert_(this);/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(pbool);
-			return;
-		}
-	}
-	_error_("could not find parameter " << EnumToStringx(enum_type));
-}
-/*}}}*/
-void Parameters::FindParam(int* pinteger,int enum_type){ _assert_(this);/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(pinteger);
-			return;
-		}
-	}
-	_error_("could not find parameter " << EnumToStringx(enum_type));
-}
-/*}}}*/
-void Parameters::FindParam(IssmDouble* pscalar, int enum_type){ _assert_(this);/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(pscalar);
-			return;
-		}
-	}
-	_error_("could not find parameter " <<  EnumToStringx(enum_type));
-}
-/*}}}*/
-void Parameters::FindParam(IssmDouble* pscalar, int enum_type,IssmDouble time){ _assert_(this);/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(pscalar,time);
-			return;
-		}
-	}
-	_error_("could not find parameter " << EnumToStringx(enum_type));
-}
-/*}}}*/
-void Parameters::FindParam(char** pstring,int enum_type){ _assert_(this);/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(pstring);
-			return;
-		}
-	}
-	_error_("could not find parameter " << EnumToStringx(enum_type));
-
-}
-/*}}}*/
-void Parameters::FindParam(char*** pstringarray,int* pM,int enum_type){ _assert_(this);/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(pstringarray,pM);
-			return;
-		}
-	}
-	_error_("could not find parameter " << EnumToStringx(enum_type));
-
-}
-/*}}}*/
-void Parameters::FindParam(int** pintarray,int* pM, int enum_type){ _assert_(this);/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(pintarray,pM);
-			return;
-		}
-	}
-	_error_("could not find parameter " << EnumToStringx(enum_type));
-
-}
-/*}}}*/
-void Parameters::FindParam(int** pintarray,int* pM,int *pN,int enum_type){ _assert_(this);/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(pintarray,pM,pN);
-			return;
-		}
-	}
-	_error_("could not find parameter " << EnumToStringx(enum_type));
-
-}
-/*}}}*/
-void Parameters::FindParam(IssmDouble** pIssmDoublearray,int* pM, int enum_type){ _assert_(this);/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(pIssmDoublearray,pM);
-			return;
-		}
-	}
-	_error_("could not find parameter " << EnumToStringx(enum_type));
-
-}
-/*}}}*/
-void Parameters::FindParam(IssmDouble** pIssmDoublearray,int* pM, int* pN,int enum_type){ _assert_(this);/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(pIssmDoublearray,pM,pN);
-			return;
-		}
-	}
-	_error_("could not find parameter " << EnumToStringx(enum_type));
-
-}
-/*}}}*/
-void Parameters::FindParam(IssmDouble*** parray,int* pM,int** pmdims_array,int** pndims_array,int enum_type){ _assert_(this);/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(parray,pM,pmdims_array,pndims_array);
-			return;
-		}
-	}
-	_error_("could not find parameter " << EnumToStringx(enum_type));
-}
-/*}}}*/
-void Parameters::FindParam(Vector<IssmDouble>** pvec,int enum_type){ _assert_(this);/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(pvec);
-			return;
-		}
-	}
-	_error_("could not find parameter " << EnumToStringx(enum_type));
-
-}
-/*}}}*/
-void Parameters::FindParam(Matrix<IssmDouble>** pmat,int enum_type){ _assert_(this);/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(pmat);
-			return;
-		}
-	}
-	_error_("could not find parameter " << EnumToStringx(enum_type));
-
-}
-/*}}}*/
-void Parameters::FindParam(FILE** pfid,int enum_type){ _assert_(this);/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(pfid);
-			return;
-		}
-	}
-	_error_("could not find parameter " << EnumToStringx(enum_type));
-}
-/*}}}*/
-void Parameters::FindParam(DataSet** pdataset,int enum_type){ /*{{{*/
+void Parameters::FindParam(bool* pbool,int param_enum){ _assert_(this);/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(pbool);
+}
+/*}}}*/
+void Parameters::FindParam(int* pinteger,int param_enum){ _assert_(this);/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(pinteger);
+}
+/*}}}*/
+void Parameters::FindParam(IssmDouble* pscalar,int param_enum){ _assert_(this);/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(pscalar);
+}
+/*}}}*/
+void Parameters::FindParam(IssmDouble* pscalar, int param_enum,IssmDouble time){ _assert_(this);/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(pscalar,time);
+}
+/*}}}*/
+void Parameters::FindParam(char** pstring,int param_enum){ _assert_(this);/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(pstring);
+
+}
+/*}}}*/
+void Parameters::FindParam(char*** pstringarray,int* pM,int param_enum){ _assert_(this);/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(pstringarray,pM);
+}
+/*}}}*/
+void Parameters::FindParam(int** pintarray,int* pM, int param_enum){ _assert_(this);/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(pintarray,pM);
+
+}
+/*}}}*/
+void Parameters::FindParam(int** pintarray,int* pM,int *pN,int param_enum){ _assert_(this);/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(pintarray,pM,pN);
+
+}
+/*}}}*/
+void Parameters::FindParam(IssmDouble** pIssmDoublearray,int* pM, int param_enum){ _assert_(this);/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(pIssmDoublearray,pM);
+}
+/*}}}*/
+void Parameters::FindParam(IssmDouble** pIssmDoublearray,int* pM, int* pN,int param_enum){ _assert_(this);/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(pIssmDoublearray,pM,pN);
+}
+/*}}}*/
+void Parameters::FindParam(IssmDouble*** parray,int* pM,int** pmdims_array,int** pndims_array,int param_enum){ _assert_(this);/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(parray,pM,pmdims_array,pndims_array);
+}
+/*}}}*/
+void Parameters::FindParam(Vector<IssmDouble>** pvec,int param_enum){ _assert_(this);/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(pvec);
+}
+/*}}}*/
+void Parameters::FindParam(Matrix<IssmDouble>** pmat,int param_enum){ _assert_(this);/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(pmat);
+}
+/*}}}*/
+void Parameters::FindParam(FILE** pfid,int param_enum){ _assert_(this);/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(pfid);
+}
+/*}}}*/
+void Parameters::FindParam(DataSet** pdataset,int param_enum){ /*{{{*/
 	_assert_(this);
 
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param->InstanceEnum()==enum_type){
-			param->GetParameterValue(pdataset);
-			return;
-		}
-	}
-	_error_("could not find parameter " << EnumToStringx(enum_type));
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	if(!this->params[index]) _error_("Parameter " << EnumToStringx(param_enum) <<" not set");
+	this->params[index]->GetParameterValue(pdataset);
 }
 /*}}}*/
@@ -457,17 +402,11 @@
 /*}}}*/
 
-Object* Parameters::FindParamObject(int enum_type){/*{{{*/
-
-	vector<Object*>::iterator object;
-	Param* param=NULL;
-
-	for ( object=objects.begin() ; object < objects.end(); object++ ){
-
-		param=xDynamicCast<Param*>(*object);
-		if(param && param->InstanceEnum()==enum_type){
-			return (*object);
-		}
-	}
-	return NULL;
+Param* Parameters::FindParamObject(int param_enum){/*{{{*/
+
+	_assert_(param_enum>ParametersSTARTEnum);
+	_assert_(param_enum<ParametersENDEnum);
+
+	int index = param_enum - ParametersSTARTEnum -1;
+	return this->params[index];
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/Parameters.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/Parameters.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/Parameters.h	(revision 20635)
@@ -4,14 +4,20 @@
 
 /*forward declarations */
+class Param;
+class DataSet;
 template <class doublematrix> class Matrix;
 template <class doubletype> class Vector;
-#include "../../datastructures/datastructures.h"
 #include "../../shared/shared.h"
+
+#define NUMPARAMS ParametersENDEnum - ParametersSTARTEnum -1
 
 /*!\brief Declaration of Parameters class.  
  *
- * Declaration of Parameters class.  Parameters are vector lists (Containers) of Parameter objects.
+ * Declaration of Parameters class.  Parameters are a static array of Parameter objects.
  */ 
-class Parameters: public DataSet{
+class Parameters{
+
+	private:
+		Param* params[NUMPARAMS];
 
 	public:
@@ -23,4 +29,9 @@
 		/*numerics*/
 		bool  Exist(int enum_type);
+		void  AddObject(Param* newparam);
+		Parameters* Copy(void);
+		void  Marshall(char** pmarshalled_data, int* pmarshalled_data_size, int marshall_direction);
+		void  Echo();
+		void  DeepEcho();
 
 		void  FindParam(bool* pinteger,int enum_type);
@@ -54,11 +65,11 @@
 		void  SetParam(DataSet* dataset,int enum_type);
 
-		Object* FindParamObject(int enum_type);
+		Param* FindParamObject(int enum_type);
 
 };
 
 /*Methods relating to parameters: */
-char       *OptionsFromAnalysis(Parameters *parameters,int analysis_type);
-void        ToolkitsOptionsFromAnalysis(Parameters* parameters,int analysis_type);
+char *OptionsFromAnalysis(Parameters *parameters,int analysis_type);
+void  ToolkitsOptionsFromAnalysis(Parameters* parameters,int analysis_type);
 
 #endif //ifndef _PARAMETERS_H_
Index: /issm/trunk-jpl/src/c/classes/Params/StringArrayParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/StringArrayParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/StringArrayParam.cpp	(revision 20635)
@@ -75,5 +75,5 @@
 }
 /*}}}*/
-Object* StringArrayParam::copy() {/*{{{*/
+Param* StringArrayParam::copy() {/*{{{*/
 
 	return new StringArrayParam(this->enum_type,this->value,this->numstrings);
Index: /issm/trunk-jpl/src/c/classes/Params/StringArrayParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/StringArrayParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/StringArrayParam.h	(revision 20635)
@@ -36,5 +36,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/StringParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/StringParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/StringParam.cpp	(revision 20635)
@@ -50,5 +50,5 @@
 }
 /*}}}*/
-Object* StringParam::copy() {/*{{{*/
+Param* StringParam::copy() {/*{{{*/
 
 	return new StringParam(this->enum_type,this->value);
Index: /issm/trunk-jpl/src/c/classes/Params/StringParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/StringParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/StringParam.h	(revision 20635)
@@ -36,5 +36,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/TransientParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/TransientParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/TransientParam.cpp	(revision 20635)
@@ -68,5 +68,5 @@
 }
 /*}}}*/
-Object* TransientParam::copy() {/*{{{*/
+Param* TransientParam::copy() {/*{{{*/
 
 	return new TransientParam(this->enum_type,this->values,this->timesteps,this->interpolation,this->N);
Index: /issm/trunk-jpl/src/c/classes/Params/TransientParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/TransientParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/TransientParam.h	(revision 20635)
@@ -38,5 +38,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/VectorParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/VectorParam.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/VectorParam.cpp	(revision 20635)
@@ -60,5 +60,5 @@
 }
 /*}}}*/
-Object* VectorParam::copy() {/*{{{*/
+Param* VectorParam::copy() {/*{{{*/
 
 	return new VectorParam(this->enum_type,this->value);
Index: /issm/trunk-jpl/src/c/classes/Params/VectorParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/VectorParam.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Params/VectorParam.h	(revision 20635)
@@ -36,5 +36,5 @@
 		int   Id(); 
 		int   ObjectEnum();
-		Object* copy();
+		Param* copy();
 		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction){ _error_("not implemented yet!"); };
 		/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Profiler.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Profiler.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/classes/Profiler.h	(revision 20635)
@@ -16,5 +16,5 @@
 
 enum ProfilerEnums {
-	Start,
+	Start=ParametersSTARTEnum+1,//FIXME
 	StartInit,
 	FinishInit,
Index: /issm/trunk-jpl/src/c/datastructures/DataSet.cpp
===================================================================
--- /issm/trunk-jpl/src/c/datastructures/DataSet.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/datastructures/DataSet.cpp	(revision 20635)
@@ -161,87 +161,87 @@
 				this->AddObject(vertex);
 			}
-			else if(obj_enum==DoubleParamEnum){
-				DoubleParam* doubleparam=NULL;
-				doubleparam=new DoubleParam();
-				doubleparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
-				this->AddObject(doubleparam);
-			}
-			else if(obj_enum==IntParamEnum){
-				IntParam* intparam=NULL;
-				intparam=new IntParam();
-				intparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
-				this->AddObject(intparam);
-			}
-			else if(obj_enum==IntMatParamEnum){
-				IntMatParam* intmparam=NULL;
-				intmparam=new IntMatParam();
-				intmparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
-				this->AddObject(intmparam);
-			}
-			else if(obj_enum==IntVecParamEnum){
-				IntVecParam* intvparam=NULL;
-				intvparam=new IntVecParam();
-				intvparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
-				this->AddObject(intvparam);
-			}
-			else if(obj_enum==BoolParamEnum){
-				BoolParam* boolparam=NULL;
-				boolparam=new BoolParam();
-				boolparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
-				this->AddObject(boolparam);
-			}
-			else if(obj_enum==DataSetParamEnum){
-				DataSetParam* dsparam=NULL;
-				dsparam=new DataSetParam();
-				dsparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
-				this->AddObject(dsparam);
-			}
-			else if(obj_enum==DoubleMatArrayParamEnum){
-				DoubleMatArrayParam* dmaparam=NULL;
-				dmaparam=new DoubleMatArrayParam();
-				dmaparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
-				this->AddObject(dmaparam);
-			}
-			else if(obj_enum==DoubleMatParamEnum){
-				DoubleMatParam* dmparam=NULL;
-				dmparam=new DoubleMatParam();
-				dmparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
-				this->AddObject(dmparam);
-			}
-			else if(obj_enum==DoubleVecParamEnum){
-				DoubleVecParam* dvparam=NULL;
-				dvparam=new DoubleVecParam();
-				dvparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
-				this->AddObject(dvparam);
-			}
-			else if(obj_enum==FileParamEnum){
-				FileParam* fileparam=NULL;
-				fileparam=new FileParam();
-				fileparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
-				delete fileparam;
-				/* No need to add this object, the pointer is not valid             
-				   The FemModel should reset all FileParams in the restart function */
-			}
-			else if(obj_enum==StringParamEnum){
-				StringParam* sparam=NULL;
-				sparam=new StringParam();
-				sparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
-				this->AddObject(sparam);
-			}
-			else if(obj_enum==StringArrayParamEnum){
-				StringArrayParam* saparam=NULL;
-				saparam=new StringArrayParam();
-				saparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
-				this->AddObject(saparam);
-			}
-			else if(obj_enum==TransientParamEnum){
-				TransientParam* transparam=NULL;
-				transparam=new TransientParam();
-				transparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
-				this->AddObject(transparam);
-			}
-			else if(obj_enum==GenericParamEnum){
-				/*Skip for now (we don't want to Marhsall Comms*/
-			}
+			//else if(obj_enum==DoubleParamEnum){
+			//	DoubleParam* doubleparam=NULL;
+			//	doubleparam=new DoubleParam();
+			//	doubleparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			//	this->AddObject(doubleparam);
+			//}
+			//else if(obj_enum==IntParamEnum){
+			//	IntParam* intparam=NULL;
+			//	intparam=new IntParam();
+			//	intparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			//	this->AddObject(intparam);
+			//}
+			//else if(obj_enum==IntMatParamEnum){
+			//	IntMatParam* intmparam=NULL;
+			//	intmparam=new IntMatParam();
+			//	intmparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			//	this->AddObject(intmparam);
+			//}
+			//else if(obj_enum==IntVecParamEnum){
+			//	IntVecParam* intvparam=NULL;
+			//	intvparam=new IntVecParam();
+			//	intvparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			//	this->AddObject(intvparam);
+			//}
+			//else if(obj_enum==BoolParamEnum){
+			//	BoolParam* boolparam=NULL;
+			//	boolparam=new BoolParam();
+			//	boolparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			//	this->AddObject(boolparam);
+			//}
+			//else if(obj_enum==DataSetParamEnum){
+			//	DataSetParam* dsparam=NULL;
+			//	dsparam=new DataSetParam();
+			//	dsparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			//	this->AddObject(dsparam);
+			//}
+			//else if(obj_enum==DoubleMatArrayParamEnum){
+			//	DoubleMatArrayParam* dmaparam=NULL;
+			//	dmaparam=new DoubleMatArrayParam();
+			//	dmaparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			//	this->AddObject(dmaparam);
+			//}
+			//else if(obj_enum==DoubleMatParamEnum){
+			//	DoubleMatParam* dmparam=NULL;
+			//	dmparam=new DoubleMatParam();
+			//	dmparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			//	this->AddObject(dmparam);
+			//}
+			//else if(obj_enum==DoubleVecParamEnum){
+			//	DoubleVecParam* dvparam=NULL;
+			//	dvparam=new DoubleVecParam();
+			//	dvparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			//	this->AddObject(dvparam);
+			//}
+			//else if(obj_enum==FileParamEnum){
+			//	FileParam* fileparam=NULL;
+			//	fileparam=new FileParam();
+			//	fileparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			//	delete fileparam;
+			//	/* No need to add this object, the pointer is not valid             
+			//	   The FemModel should reset all FileParams in the restart function */
+			//}
+			//else if(obj_enum==StringParamEnum){
+			//	StringParam* sparam=NULL;
+			//	sparam=new StringParam();
+			//	sparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			//	this->AddObject(sparam);
+			//}
+			//else if(obj_enum==StringArrayParamEnum){
+			//	StringArrayParam* saparam=NULL;
+			//	saparam=new StringArrayParam();
+			//	saparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			//	this->AddObject(saparam);
+			//}
+			//else if(obj_enum==TransientParamEnum){
+			//	TransientParam* transparam=NULL;
+			//	transparam=new TransientParam();
+			//	transparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			//	this->AddObject(transparam);
+			//}
+			//else if(obj_enum==GenericParamEnum){
+			//	/*Skip for now (we don't want to Marhsall Comms*/
+			//}
 			else if(obj_enum==MaticeEnum){
 				Matice* matice=NULL;
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 20635)
@@ -39,7 +39,4 @@
 	IssmDouble  yts;
 	int         N,M;
-
-	/*Make sure current dataset is empty*/
-	_assert_(parameters->Size()==0); 
 
 	/*Copy some constants from iomodel */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp	(revision 20635)
@@ -90,5 +90,4 @@
 
 	constraints->Presort();
-	parameters->Presort();
 	if(VerboseMProcessor()) _printf0_("   done with model processor \n");
 
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 20634)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 20635)
@@ -8,4 +8,5 @@
 
 enum definitions{
+	ParametersSTARTEnum,
 	/*General: {{{*/
 	FemModelEnum,
@@ -1073,4 +1074,5 @@
 	SealevelriseNumRequestedOutputsEnum,
 	/*}}}*/
+	ParametersENDEnum,
 	MaximumNumberOfDefinitionsEnum
 };
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 20635)
@@ -17,4 +17,5 @@
 	switch(en){
 
+		case ParametersSTARTEnum : return "ParametersSTART";
 		case FemModelEnum : return "FemModel";
 		case FemModelCommEnum : return "FemModelComm";
@@ -1024,4 +1025,5 @@
 		case SealevelriseRequestedOutputsEnum : return "SealevelriseRequestedOutputs";
 		case SealevelriseNumRequestedOutputsEnum : return "SealevelriseNumRequestedOutputs";
+		case ParametersENDEnum : return "ParametersEND";
 		case MaximumNumberOfDefinitionsEnum : return "MaximumNumberOfDefinitions";
 		default : return "unknown";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 20634)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 20635)
@@ -17,5 +17,6 @@
 
    if(stage==1){
-	      if (strcmp(name,"FemModel")==0) return FemModelEnum;
+	      if (strcmp(name,"ParametersSTART")==0) return ParametersSTARTEnum;
+	      else if (strcmp(name,"FemModel")==0) return FemModelEnum;
 	      else if (strcmp(name,"FemModelComm")==0) return FemModelCommEnum;
 	      else if (strcmp(name,"WorldComm")==0) return WorldCommEnum;
@@ -136,9 +137,9 @@
 	      else if (strcmp(name,"HydrologyModel")==0) return HydrologyModelEnum;
 	      else if (strcmp(name,"Hydrologyshreve")==0) return HydrologyshreveEnum;
-	      else if (strcmp(name,"HydrologyshreveSpcwatercolumn")==0) return HydrologyshreveSpcwatercolumnEnum;
          else stage=2;
    }
    if(stage==2){
-	      if (strcmp(name,"HydrologyshreveStabilization")==0) return HydrologyshreveStabilizationEnum;
+	      if (strcmp(name,"HydrologyshreveSpcwatercolumn")==0) return HydrologyshreveSpcwatercolumnEnum;
+	      else if (strcmp(name,"HydrologyshreveStabilization")==0) return HydrologyshreveStabilizationEnum;
 	      else if (strcmp(name,"Hydrologydc")==0) return HydrologydcEnum;
 	      else if (strcmp(name,"SedimentHead")==0) return SedimentHeadEnum;
@@ -259,9 +260,9 @@
 	      else if (strcmp(name,"DamageEvolutionRequestedOutputs")==0) return DamageEvolutionRequestedOutputsEnum;
 	      else if (strcmp(name,"Damage")==0) return DamageEnum;
-	      else if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum;
+	      if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
+	      else if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum;
 	      else if (strcmp(name,"CalvingLaw")==0) return CalvingLawEnum;
 	      else if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
@@ -382,9 +383,9 @@
 	      else if (strcmp(name,"TransientIsmasstransport")==0) return TransientIsmasstransportEnum;
 	      else if (strcmp(name,"TransientIsthermal")==0) return TransientIsthermalEnum;
-	      else if (strcmp(name,"TransientIsgia")==0) return TransientIsgiaEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"TransientIsdamageevolution")==0) return TransientIsdamageevolutionEnum;
+	      if (strcmp(name,"TransientIsgia")==0) return TransientIsgiaEnum;
+	      else if (strcmp(name,"TransientIsdamageevolution")==0) return TransientIsdamageevolutionEnum;
 	      else if (strcmp(name,"TransientIshydrology")==0) return TransientIshydrologyEnum;
 	      else if (strcmp(name,"TransientIsmovingfront")==0) return TransientIsmovingfrontEnum;
@@ -505,9 +506,9 @@
 	      else if (strcmp(name,"BalancethicknessAnalysis")==0) return BalancethicknessAnalysisEnum;
 	      else if (strcmp(name,"BalancethicknessSolution")==0) return BalancethicknessSolutionEnum;
-	      else if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
+	      if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
+	      else if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
 	      else if (strcmp(name,"BalancethicknessSoftAnalysis")==0) return BalancethicknessSoftAnalysisEnum;
 	      else if (strcmp(name,"BalancethicknessSoftSolution")==0) return BalancethicknessSoftSolutionEnum;
@@ -628,9 +629,9 @@
 	      else if (strcmp(name,"MassconaxpbyNamey")==0) return MassconaxpbyNameyEnum;
 	      else if (strcmp(name,"MassconaxpbyAlpha")==0) return MassconaxpbyAlphaEnum;
-	      else if (strcmp(name,"MassconaxpbyBeta")==0) return MassconaxpbyBetaEnum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
+	      if (strcmp(name,"MassconaxpbyBeta")==0) return MassconaxpbyBetaEnum;
+	      else if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
 	      else if (strcmp(name,"VectorParam")==0) return VectorParamEnum;
 	      else if (strcmp(name,"Riftfront")==0) return RiftfrontEnum;
@@ -751,9 +752,9 @@
 	      else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;
 	      else if (strcmp(name,"StrainRatexz")==0) return StrainRatexzEnum;
-	      else if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum;
          else stage=7;
    }
    if(stage==7){
-	      if (strcmp(name,"StrainRateyz")==0) return StrainRateyzEnum;
+	      if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum;
+	      else if (strcmp(name,"StrainRateyz")==0) return StrainRateyzEnum;
 	      else if (strcmp(name,"StrainRatezz")==0) return StrainRatezzEnum;
 	      else if (strcmp(name,"Divergence")==0) return DivergenceEnum;
@@ -874,9 +875,9 @@
 	      else if (strcmp(name,"Outputdefinition77")==0) return Outputdefinition77Enum;
 	      else if (strcmp(name,"Outputdefinition78")==0) return Outputdefinition78Enum;
-	      else if (strcmp(name,"Outputdefinition79")==0) return Outputdefinition79Enum;
          else stage=8;
    }
    if(stage==8){
-	      if (strcmp(name,"Outputdefinition80")==0) return Outputdefinition80Enum;
+	      if (strcmp(name,"Outputdefinition79")==0) return Outputdefinition79Enum;
+	      else if (strcmp(name,"Outputdefinition80")==0) return Outputdefinition80Enum;
 	      else if (strcmp(name,"Outputdefinition81")==0) return Outputdefinition81Enum;
 	      else if (strcmp(name,"Outputdefinition82")==0) return Outputdefinition82Enum;
@@ -997,9 +998,9 @@
 	      else if (strcmp(name,"Sset")==0) return SsetEnum;
 	      else if (strcmp(name,"Verbose")==0) return VerboseEnum;
-	      else if (strcmp(name,"TriangleInterp")==0) return TriangleInterpEnum;
          else stage=9;
    }
    if(stage==9){
-	      if (strcmp(name,"BilinearInterp")==0) return BilinearInterpEnum;
+	      if (strcmp(name,"TriangleInterp")==0) return TriangleInterpEnum;
+	      else if (strcmp(name,"BilinearInterp")==0) return BilinearInterpEnum;
 	      else if (strcmp(name,"NearestInterp")==0) return NearestInterpEnum;
 	      else if (strcmp(name,"XY")==0) return XYEnum;
@@ -1048,4 +1049,5 @@
 	      else if (strcmp(name,"SealevelriseRequestedOutputs")==0) return SealevelriseRequestedOutputsEnum;
 	      else if (strcmp(name,"SealevelriseNumRequestedOutputs")==0) return SealevelriseNumRequestedOutputsEnum;
+	      else if (strcmp(name,"ParametersEND")==0) return ParametersENDEnum;
 	      else if (strcmp(name,"MaximumNumberOfDefinitions")==0) return MaximumNumberOfDefinitionsEnum;
          else stage=10;
