Index: /issm/trunk-jpl/src/c/classes/Params/Param.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/Param.h	(revision 20635)
+++ /issm/trunk-jpl/src/c/classes/Params/Param.h	(revision 20636)
@@ -26,5 +26,7 @@
 		/*Virtual functions:*/
 		virtual void  Echo()=0;
+		virtual int   ObjectEnum()=0;
 		virtual Param* copy()=0;
+		virtual void Marshall(char** pmarshalled_data, int* pmarshalled_data_size, int marshall_direction)=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 20635)
+++ /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 20636)
@@ -32,4 +32,6 @@
 #include "./StringArrayParam.h"
 #include "./StringParam.h"
+#include "./DoubleMatArrayParam.h"
+#include "./TransientParam.h"
 
 #include "../../shared/shared.h"
@@ -79,5 +81,123 @@
 /*}}}*/
 void Parameters::Marshall(char** pmarshalled_data, int* pmarshalled_data_size, int marshall_direction){/*{{{*/
-	_error_("not implemented yet");
+
+	int obj_enum=-1;
+	int num_params=0;
+
+	MARSHALLING_ENUM(ParametersEnum);
+
+	if(marshall_direction==MARSHALLING_FORWARD || marshall_direction==MARSHALLING_SIZE){
+
+		/*Marshall num_params first*/
+		for(int i=0;i<NUMPARAMS;i++){
+			if(this->params[i]) num_params++;
+		}
+		MARSHALLING(num_params);
+
+		/*Marshall Parameters one by one now*/
+		for(int i=0;i<NUMPARAMS;i++){
+			if(this->params[i]){
+				obj_enum = this->params[i]->ObjectEnum();
+				MARSHALLING(obj_enum);
+				this->params[i]->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+			}
+		}
+	}
+	else{
+
+		/*Get number of params marshalled*/
+		MARSHALLING(num_params);
+
+		/*Recover parameters one by one*/
+		for(int i=0;i<num_params;i++){
+
+			/*Recover enum of object first: */
+			MARSHALLING(obj_enum); 
+
+			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*/
+			}
+		}
+	}
 }
 /*}}}*/
