Index: /issm/trunk-jpl/src/m/classes/SMBforcing.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/SMBforcing.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/SMBforcing.js	(revision 19791)
@@ -13,4 +13,10 @@
 		fielddisplay(this,'requested_outputs','additional outputs requested');
 	} // }}}
+	this.defaultoutputs = function(){ // {{{
+		return '';
+	}//}}}
+this.classname = function(){ // {{{
+	return "SMBforcing";
+} // }}}
 		this.initialize = function(md) {// {{{
 
@@ -32,4 +38,22 @@
 
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+
+			var yts=365.0*24.0*3600.0;
+
+			WriteData(fid,'enum',SmbEnum(),'data',SMBforcingEnum(),'format','Integer');
+			WriteData(fid,'object',this,'class','smb','fieldname','mass_balance','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+			
+			//process requested outputs
+			outputs = this.requested_outputs;
+			for (var i=0;i<outputs;i++){
+				if (outputs[i] == 'default') {
+					outputs.splice(i,1);
+					outputs.push(this.defaultoutputs());
+				}
+			}
+			WriteData(fid,'data',outputs,'enum',SmbRequestedOutputsEnum,'format','StringArray');
+
+		}//}}}
 	//properties 
 	this.mass_balance = NaN;
Index: /issm/trunk-jpl/src/m/classes/autodiff.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/autodiff.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/autodiff.js	(revision 19791)
@@ -31,4 +31,7 @@
 
 	}// }}}
+	this.classname= function(){// {{{
+		return "autodiff";
+	}// }}}
 		this.checkconsistency = function(md,solution,analyses){ //{{{
 
@@ -57,4 +60,153 @@
 			}
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+
+			WriteData(fid,'object',this,'fieldname','isautodiff','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','driver','format','String');
+
+			//early return
+			if (!this.isautodiff){
+				WriteData(fid,'data',false,'enum',AutodiffMassFluxSegmentsPresentEnum(),'format','Boolean');
+				WriteData(fid,'data',false,'enum',AutodiffKeepEnum(),'format','Boolean');
+				return;
+			}
+
+			//buffer sizes {{{
+			WriteData(fid,'object',this,'fieldname','obufsize','format','Double');
+			WriteData(fid,'object',this,'fieldname','lbufsize','format','Double');
+			WriteData(fid,'object',this,'fieldname','cbufsize','format','Double');
+			WriteData(fid,'object',this,'fieldname','tbufsize','format','Double');
+			WriteData(fid,'object',this,'fieldname','gcTriggerRatio','format','Double');
+			WriteData(fid,'object',this,'fieldname','gcTriggerMaxSize','format','Double');
+			//}}}
+			//process dependent variables {{{
+			num_dependent_objects=this.dependents.length;
+			WriteData(fid,'data',num_dependent_objects,'enum',AutodiffNumDependentObjectsEnum(),'format','Integer');
+
+			if(num_dependent_objects){
+				var names=[];
+				types=NewArrayFill(num_dependent_objects,0);
+				indices=NewArrayFill(num_dependent_objects,0);
+
+				for (var i=0;i<num_dependent_objects;i++){
+					dep=this.dependents[i];
+
+					names.push(dep.name);
+					types[i]=dep.typetoscalar();
+					indices[i]=dep.index;
+				}
+				WriteData(fid,'data',names,'enum',AutodiffDependentObjectNamesEnum(),'format','StringArray');
+				WriteData(fid,'data',types,'enum',AutodiffDependentObjectTypesEnum(),'format','IntMat','mattype',3);
+				WriteData(fid,'data',indices,'enum',AutodiffDependentObjectIndicesEnum(),'format','IntMat','mattype',3);
+			}
+			//}}}
+			//process independent variables {{{
+			num_independent_objects=this.independents.length;
+			WriteData(fid,'data',num_independent_objects,'enum',AutodiffNumIndependentObjectsEnum(),'format','Integer');
+
+			if(num_independent_objects){
+				names=NewArrayFill(num_independent_objects,0);
+				types=NewArrayFill(num_independent_objects,0);
+
+				for (var i=0;i<num_independent_objects;i++){
+					indep=this.independents[i];
+
+					names[i]=StringToEnum(indep.name);
+					types[i]=indep.typetoscalar();
+				}
+				WriteData(fid,'data',names,'enum',AutodiffIndependentObjectNamesEnum(),'format','IntMat','mattype',3);
+				WriteData(fid,'data',types,'enum',AutodiffIndependentObjectTypesEnum(),'format','IntMat','mattype',3);
+			}
+			//}}}
+			//if driver is fos_forward, build index:  {{{
+			if (this.driver == 'fos_forward'){
+				var index=0;
+
+				for (var i=0;i<num_independent_objects;i++){
+					indep=this.independents[i];
+					if (!(isNaN(indep.fos_forward_index))){
+						index=index+indep.fos_forward_index;
+						break;
+					}
+					else{
+						if (indep.type=='scalar') index=index+1;
+						else index=index+indep.nods;
+					}
+				}
+				index=index-1; //get c-index numbering going
+				WriteData(fid,'data',index,'enum',AutodiffFosForwardIndexEnum(),'format','Integer');
+			}
+			//}}}
+			//if driver is fos_reverse, build index:  {{{
+			if (this.driver  == 'fos_reverse'){
+				var index=0;
+
+				for (var i=0;i<num_dependent_objects;i++){
+					dep=this.dependents[i];
+					if (!(isNaN(dep.fos_reverse_index))){
+						index=index+dep.fos_reverse_index;
+						break;
+					}
+					else{
+						if (dep.type =='scalar') index=index+1;
+						else index=index+dep.nods;
+					}
+				}
+				index=index-1; //get c-index numbering going
+				WriteData(fid,'data',index,'enum',AutodiffFosReverseIndexEnum(),'format','Integer');
+			}
+			//}}}
+			//if driver is fov_forward, build indices:  {{{
+			if (this.driver == 'fov_forward'){
+				var indices=0;
+
+				for (var i=0;i<num_independent_objects;i++){
+					indep=this.independents[i];
+					if (!indep.fos_forward_index.length){
+						indices=indices+indep.fov_forward_indices;
+						break;
+					}
+					else{
+						if (indep.type =='scalar') indices=indices+1;
+						else indices=indices+indep.nods;
+					}
+				}
+				indices=indices-1; //get c-indices numbering going
+				WriteData(fid,'data',indices,'enum',AutodiffFovForwardIndicesEnum(),'format','IntMat','mattype',3);
+			}
+			//}}}
+			//deal with mass fluxes:  {{{
+			mass_flux_segments=[];
+			for (var i=0;i<num_dependent_objects;i++){
+				dep=this.dependents[i];
+				if (dep.name =='MassFlux'){
+					mass_flux_segments.push(dep.segments);
+				}
+			}
+			if (mass_flux_segments.length){
+				WriteData(fid,'data',mass_flux_segments,'enum',MassFluxSegmentsEnum(),'format','MatArray');
+				flag=true;
+			}
+			else flag=false;
+			WriteData(fid,'data',flag,'enum',AutodiffMassFluxSegmentsPresentEnum(),'format','Boolean');
+			//}}}
+			//deal with trace keep on: {{{
+			keep=false;
+
+			//From ADOLC userdoc: 
+			// The optional integer argument keep of trace on determines whether the numerical values of all active variables are 
+			// recorded in a buffered temporary array or file called the taylor stack. This option takes effect if keep = 1 and 
+			// prepares the scene for an immediately following gradient evaluation by a call to a routine implementing the reverse 
+			// mode as described in the Section 4 and Section 5. 
+			//
+
+			if (this.driver.length<=3) keep=false; //there is no "_reverse" string within the driver string: 
+			else{
+				if (this.driver.splice(4) == '_reverse') keep=true;
+				else keep=false;
+			}
+			WriteData(fid,'data',keep,'enum',AutodiffKeepEnum(),'format','Boolean');
+			//}}}
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/balancethickness.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/balancethickness.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/balancethickness.js	(revision 19791)
@@ -20,4 +20,8 @@
 
 	}// }}}
+	this.classname= function(){// {{{
+		return "balancethickness";
+
+	}// }}}
 		this.checkconsistency = function(md,solution,analyses){ // {{{
 			//Early return
@@ -29,4 +33,14 @@
 			//checkfield(md,'fieldname','balancethickness.omega','size',[md.mesh.numberofvertices ,1],'NaN',1,'>=',0);
 		} //}}}
+		this.marshall=function(md,fid) { //{{{
+
+			var yts=365.0*24.0*3600.0;
+
+			WriteData(fid,'object',this,'fieldname','spcthickness','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',this,'fieldname','thickening_rate','format','DoubleMat','mattype',1,'scale',1./yts);
+			WriteData(fid,'object',this,'fieldname','stabilization','format','Integer');
+			WriteData(fid,'object',this,'fieldname','omega','format','DoubleMat','mattype',1);
+
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/basalforcings.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/basalforcings.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/basalforcings.js	(revision 19791)
@@ -16,4 +16,7 @@
 		fielddisplay(this,'geothermalflux','geothermal heat flux [W/m^2]');
 
+	} // }}}
+	this.classname = function(){ // {{{
+		return "basalforcings";
 	} // }}}
 		this.initialize = function (md){ // {{{
@@ -51,4 +54,13 @@
 			}
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+
+			var yts=365.0*24.0*3600.0;
+
+			WriteData(fid,'enum',BasalforcingsEnum(),'data',FloatingMeltRateEnum(),'format','Integer');
+			WriteData(fid,'object',this,'fieldname','groundedice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
+			WriteData(fid,'object',this,'fieldname','floatingice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
+			WriteData(fid,'object',this,'fieldname','geothermalflux','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+		}//}}}
 	//properties
 	//{{{
Index: /issm/trunk-jpl/src/m/classes/calving.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/calving.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/calving.js	(revision 19791)
@@ -21,4 +21,7 @@
 
 	}// }}}
+	this.classname= function(){// {{{
+		return "calving";
+	}// }}}
 	this.checkconsistency = function(md,solution,analyses) { // {{{
 		//Early return
@@ -30,4 +33,12 @@
 		checkfield(md,'fieldname','calving.meltingrate(1:md.mesh.numberofvertices,:)','>=',0,'timeseries',1,'NaN',1);
 	} //}}}
+		this.marshall=function(md,fid) { //{{{
+			yts=365.0*24.0*3600.0;
+			WriteData(fid,'enum',CalvingLawEnum(),'data',DefaultCalvingEnum(),'format','Integer');
+			WriteData(fid,'enum',LevelsetStabilizationEnum(),'data',this.stabilization,'format','Integer');
+			WriteData(fid,'enum',SpcLevelsetEnum(),'data',this.spclevelset,'format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',this,'fieldname','calvingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
+			WriteData(fid,'object',this,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'scale',1./yts);
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/constants.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/constants.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/constants.js	(revision 19791)
@@ -29,4 +29,8 @@
 
 		} //}}}
+		this.classname = function () { //{{{
+			return "constants";
+
+		} //}}}
 		this.checkconsistency = function(md,solution,analyses) {//% {{{
 
@@ -37,4 +41,9 @@
 
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'object',this,'fieldname','g','format','Double');
+			WriteData(fid,'object',this,'fieldname','yts','format','Double');
+			WriteData(fid,'object',this,'fieldname','referencetemperature','format','Double');
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/damage.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/damage.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/damage.js	(revision 19791)
@@ -62,4 +62,7 @@
 		}
 	}// }}}
+	this.classname= function(){// {{{
+		return "damage";
+	}// }}}
 		this.checkconsistency = function(md,solution,analyses) { //{{{
 			
@@ -89,4 +92,45 @@
 			}
 		} //}}}
+		this.marshall=function(md,fid) { //{{{
+		
+			WriteData(fid,'object',this,'fieldname','isdamage','format','Boolean');
+			if (this.isdamage){
+				WriteData(fid,'object',this,'fieldname','law','format','Integer');
+				WriteData(fid,'object',this,'fieldname','D','format','DoubleMat','mattype',1);
+				WriteData(fid,'object',this,'fieldname','spcdamage','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+				WriteData(fid,'object',this,'fieldname','max_damage','format','Double');
+
+				WriteData(fid,'object',this,'fieldname','stabilization','format','Integer');
+				WriteData(fid,'object',this,'fieldname','maxiter','format','Integer');
+				WriteData(fid,'enum',DamageElementinterpEnum(),'data',StringToEnum(this.elementinterp),'format','Integer');
+				WriteData(fid,'object',this,'fieldname','stress_threshold','format','Double');
+				WriteData(fid,'object',this,'fieldname','kappa','format','Double');
+				WriteData(fid,'object',this,'fieldname','c1','format','Double');
+				WriteData(fid,'object',this,'fieldname','c2','format','Double');
+				WriteData(fid,'object',this,'fieldname','c3','format','Double');
+				WriteData(fid,'object',this,'fieldname','c4','format','Double');
+				WriteData(fid,'object',this,'fieldname','healing','format','Double');
+				WriteData(fid,'object',this,'fieldname','equiv_stress','format','Integer');
+			}
+
+			//process requested outputs
+			outputs = this.requested_outputs;
+			for (var i=0;i<outputs;i++){
+				if (outputs[i] == 'default') {
+					outputs.splice(i,1);
+					outputs.push(this.defaultoutputs(md));
+				}
+			}
+			if (this.isdamage){
+				WriteData(fid,'data',outputs,'enum',DamageEvolutionRequestedOutputsEnum,'format','StringArray');
+			}
+
+		}//}}}
+		this.defaultoutputs = function(md){ //{{{
+
+			if (md.domaintype() == '2Dhorizontal') return 'DamageDbar';
+			else return 'DamageD';
+
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/debug.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/debug.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/debug.js	(revision 19791)
@@ -7,4 +7,7 @@
 	//methods
 	this.setdefaultparameters = function(){// {{{
+	}// }}}
+	this.classname= function(){// {{{
+		return "debug";
 	}// }}}
 	this.disp= function(){// {{{
@@ -17,4 +20,7 @@
 
 	}// }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'object',this,'fieldname','profiling','format','Boolean');
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/flowequation.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/flowequation.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/flowequation.js	(revision 19791)
@@ -32,4 +32,8 @@
 		fielddisplay(this,'borderHO',"vertices on HO's border (for tiling)");
 		fielddisplay(this,'borderFS',"vertices on FS' border (for tiling)");
+
+	}// }}}
+	this.classname= function(){// {{{
+		return "flowequation";
 
 	}// }}}
@@ -86,4 +90,64 @@
 			}
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'object',this,'fieldname','isSIA','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','isSSA','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','isL1L2','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','isHO','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','isFS','format','Boolean');
+			WriteData(fid,'enum',FlowequationFeSSAEnum(),'data',StringToEnum(this.fe_SSA),'format','Integer');
+			WriteData(fid,'enum',FlowequationFeHOEnum() ,'data',StringToEnum(this.fe_HO) ,'format','Integer');
+			WriteData(fid,'enum',FlowequationFeFSEnum() ,'data',StringToEnum(this.fe_FS) ,'format','Integer');
+			WriteData(fid,'enum',AugmentedLagrangianREnum(),'data',this.augmented_lagrangian_r ,'format','Double');
+			WriteData(fid,'enum',AugmentedLagrangianRhopEnum(),'data',this.augmented_lagrangian_rhop ,'format','Double');
+			WriteData(fid,'enum',AugmentedLagrangianRlambdaEnum(),'data',this.augmented_lagrangian_rlambda ,'format','Double');
+			WriteData(fid,'enum',AugmentedLagrangianRholambdaEnum(),'data',this.augmented_lagrangian_rholambda ,'format','Double');
+			WriteData(fid,'enum',AugmentedLagrangianThetaEnum() ,'data',this.XTH_theta ,'format','Double');
+			WriteData(fid,'object',this,'fieldname','borderSSA','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',this,'fieldname','borderHO','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',this,'fieldname','borderFS','format','DoubleMat','mattype',1);
+
+			//convert approximations to enums
+			data=this.vertex_equation;
+			
+			//some optimization: 
+			noneap=NoneApproximationEnum();
+			siaap=SIAApproximationEnum();
+			ssaap=SSAApproximationEnum();
+			l1l2ap=L1L2ApproximationEnum();
+			hoap=HOApproximationEnum();
+			fsap=FSApproximationEnum();
+			ssahoap=SSAHOApproximationEnum();
+			hofsaap=HOFSApproximationEnum();
+			ssafsap=SSAFSApproximationEnum();
+
+			for(var i=0;i<data.length;i++){
+				if(data[i]==0)data[i]=nonap;
+				if(data[i]==1) data[i]=siaap;
+				if(data[i]==2) data[i]=ssaap;
+				if(data[i]==3) data[i]=l1l2ap;
+				if(data[i]==4) data[i]=hoap;
+				if(data[i]==5) data[i]=fsap;
+				if(data[i]==6) data[i]=ssahoap;
+				if(data[i]==7) data[i]=hofsaap;
+				if(data[i]==8) data[i]=ssafsap;
+			}
+			WriteData(fid,'data',data,'enum',FlowequationVertexEquationEnum(),'format','DoubleMat','mattype',1);
+
+			data=this.element_equation;
+			for(var i=0;i<data.length;i++){
+				if(data[i]==0) data[i]=nonap;
+				if(data[i]==1) data[i]=siaap;
+				if(data[i]==2) data[i]=ssaap;
+				if(data[i]==3) data[i]=l1l2ap;
+				if(data[i]==4) data[i]=hoap;
+				if(data[i]==5) data[i]=fsap;
+				if(data[i]==6) data[i]=ssahoap;
+				if(data[i]==7) data[i]=ssafsap;
+				if(data[i]==8) data[i]=hofsaap;
+			}
+			WriteData(fid,'data',data,'enum',FlowequationElementEquationEnum(),'format','DoubleMat','mattype',2);
+
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/friction.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/friction.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/friction.js	(revision 19791)
@@ -15,4 +15,7 @@
 		fielddisplay(this,'q','q exponent');
 	} // }}}
+	this.classname= function (){// {{{
+		return "friction";
+	} // }}}
 		this.checkconsistency = function(md,solution,analyses){ //{{{
 
@@ -26,4 +29,15 @@
 
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+			var yts=365.0*24.0*3600.0;
+
+			WriteData(fid,'enum',FrictionLawEnum,'data',1,'format','Integer');
+			WriteData(fid,'object',this,'fieldname','coefficient','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+			//WriteData(fid,'object',this,'fieldname','coefficient','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',this,'fieldname','p','format','DoubleMat','mattype',2);
+			WriteData(fid,'object',this,'fieldname','q','format','DoubleMat','mattype',2);
+			
+
+		}//}}}
 	//properties 
 	//{{{
Index: /issm/trunk-jpl/src/m/classes/geometry.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/geometry.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/geometry.js	(revision 19791)
@@ -15,4 +15,7 @@
 			fielddisplay(this,'base','ice base elevation [m]');
 			fielddisplay(this,'bed','bed elevation [m]');
+		} //}}}
+		this.classname = function () { //{{{
+			return 'geometry';
 		} //}}}
 		this.checkconsistency = function(md,solution,analyses) { //{{{
@@ -36,4 +39,11 @@
 			}
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'data',this.surface,'format','DoubleMat','mattype',1,'enum',SurfaceEnum());
+			WriteData(fid,'data',this.thickness,'format','DoubleMat','mattype',1,'enum',ThicknessEnum(),'timeserieslength',md.mesh.numberofvertices+1);
+			WriteData(fid,'data',this.base,'format','DoubleMat','mattype',1,'enum',BaseEnum());
+			WriteData(fid,'data',this.bed,'format','DoubleMat','mattype',1,'enum',BedEnum());
+			WriteData(fid,'object',this,'fieldname','hydrostatic_ratio','format','DoubleMat','mattype',1);
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/gia.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/gia.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/gia.js	(revision 19791)
@@ -19,4 +19,7 @@
 		fielddisplay(this,'cross_section_shape','1: square-edged (default). 2: elliptical.  See iedge in GiaDeflectionCore');
 
+	}// }}}
+	this.classname= function(){// {{{
+		return "gia";
 	}// }}}
 	this.checkconsistency = function(md,solution,analyses) { // {{{
@@ -41,4 +44,9 @@
 		}
 	} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'object',this,'fieldname','mantle_viscosity','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',this,'fieldname','lithosphere_thickness','format','DoubleMat','mattype',1,'scale',Math.pow(10,3)); //from km to m
+			WriteData(fid,'object',this,'fieldname','cross_section_shape','format','Integer');
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/groundingline.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/groundingline.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/groundingline.js	(revision 19791)
@@ -16,4 +16,7 @@
 
 
+	}// }}}
+	this.classname= function(){// {{{
+		return "groundingline";
 	}// }}}
 		this.checkconsistency = function(md,solution,analyses) {// {{{
@@ -37,4 +40,7 @@
 			}
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'data',StringToEnum(this.migration),'enum',GroundinglineMigrationEnum(),'format','Integer');
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/hydrologyshreve.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/hydrologyshreve.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/hydrologyshreve.js	(revision 19791)
@@ -12,5 +12,5 @@
 
 	}// }}}
-	this.disp= function(){// {{{
+		this.disp= function(){// {{{
 
 		console.log(sprintf('   hydrologyshreve solution parameters:'));
@@ -19,4 +19,8 @@
 
 	}// }}}
+		this.classname= function(){// {{{
+			return "hydrologyshreve";
+
+		}// }}}
 	this.type= function(){// {{{
 
@@ -32,4 +36,9 @@
 
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'enum',HydrologyModelEnum(),'data',HydrologyshreveEnum(),'format','Integer');
+			WriteData(fid,'object',this,'fieldname','spcwatercolumn','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',this,'fieldname','stabilization','format','Double');
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/initialization.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/initialization.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/initialization.js	(revision 19791)
@@ -81,4 +81,31 @@
 			}
 		} //}}}
+		this.marshall=function(md,fid) { //{{{
+
+			var yts=365.0*24.0*3600.0;
+
+			WriteData(fid,'data',this.vx,'format','DoubleMat','mattype',1,'enum',VxEnum,'scale',1./yts);
+			WriteData(fid,'data',this.vy,'format','DoubleMat','mattype',1,'enum',VyEnum,'scale',1./yts);
+			WriteData(fid,'data',this.vz,'format','DoubleMat','mattype',1,'enum',VzEnum,'scale',1./yts);
+			WriteData(fid,'data',this.pressure,'format','DoubleMat','mattype',1,'enum',PressureEnum);
+			WriteData(fid,'data',this.temperature,'format','DoubleMat','mattype',1,'enum',TemperatureEnum);
+			WriteData(fid,'data',this.waterfraction,'format','DoubleMat','mattype',1,'enum',WaterfractionEnum);
+			WriteData(fid,'data',this.sediment_head,'format','DoubleMat','mattype',1,'enum',SedimentHeadEnum);
+			WriteData(fid,'data',this.epl_head,'format','DoubleMat','mattype',1,'enum',EplHeadEnum);
+			WriteData(fid,'data',this.epl_thickness,'format','DoubleMat','mattype',1,'enum',HydrologydcEplThicknessEnum);
+			WriteData(fid,'data',this.watercolumn,'format','DoubleMat','mattype',1,'enum',WatercolumnEnum);
+
+			if (md.thermal.isenthalpy){
+				tpmp=NewArrayFill(md.mesh.numberofvertices,0);
+				for (var i=0;i<md.mesh.numberofvertices;i++) tpmp[i]= md.materials.meltingpoint - md.materials.beta*md.initialization.pressure[i];
+				enthalpy=NewArrayFill(md.mesh.numberofvertices,0); 
+				for (var i=0;i<md.mesh.numberofvertices;i++)enthalpy[i] = md.materials.heatcapacity*(md.initialization.temperature[i]-md.constants.referencetemperature);
+				
+				for (var i=0;i<md.mesh.numberofvertices;i++)if(md.initialization.temperature[i]>=tpmp[i]){
+					enthalpy[i] = md.materials.heatcapacity*(tpmp[i] - md.constants.referencetemperature) + md.materials.latentheat*md.initialization.waterfraction[i];
+				}
+				WriteData(fid,'data',enthalpy,'format','DoubleMat','mattype',1,'enum',EnthalpyEnum());
+			}
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/inversion.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/inversion.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/inversion.js	(revision 19791)
@@ -75,4 +75,7 @@
 
 	}// }}}
+	this.classname= function(){// {{{
+		return "inversion";
+	}// }}}
 		this.checkconsistency = function(md,solution,analyses) { //{{{
 
@@ -113,4 +116,44 @@
 			}
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+
+			var yts=365.0*24.0*3600.0;
+
+			WriteData(fid,'enum',InversionTypeEnum(),'data',0,'format','Integer');
+			WriteData(fid,'object',this,'fieldname','iscontrol','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','incomplete_adjoint','format','Boolean');
+			if (!this.iscontrol) return;
+			WriteData(fid,'object',this,'fieldname','nsteps','format','Integer');
+			WriteData(fid,'object',this,'fieldname','maxiter_per_step','format','IntMat','mattype',3);
+			WriteData(fid,'object',this,'fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',this,'fieldname','gradient_scaling','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',this,'fieldname','cost_function_threshold','format','Double');
+			WriteData(fid,'object',this,'fieldname','min_parameters','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',this,'fieldname','max_parameters','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',this,'fieldname','step_threshold','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',this,'fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+			WriteData(fid,'object',this,'fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+			WriteData(fid,'object',this,'fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);
+			if(this.thickness_obs.length==md.mesh.numberofelements) mattype=2;
+			else mattype=1;
+			WriteData(fid,'object',this,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);
+			WriteData(fid,'object',this,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);
+
+
+			//process control parameters
+			num_control_parameters=this.control_parameters.length;
+			data=NewArrayFill(num_control_parameters,0);
+			for (var i=0;i<num_control_parameters;i++){
+				data[i]=StringToEnum(this.control_parameters[i]);
+			}
+			WriteData(fid,'data',data,'enum',InversionControlParametersEnum(),'format','DoubleMat','mattype',3);
+			WriteData(fid,'data',num_control_parameters,'enum',InversionNumControlParametersEnum(),'format','Integer');
+
+			//process cost functions
+			num_cost_functions=this.cost_functions[0].length;
+			data=marshallcostfunctions(this.cost_functions);
+			WriteData(fid,'data',data,'enum',InversionCostFunctionsEnum(),'format','DoubleMat','mattype',3);
+			WriteData(fid,'data',num_cost_functions,'enum',InversionNumCostFunctionsEnum(),'format','Integer');
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/mask.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/mask.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/mask.js	(revision 19791)
@@ -18,4 +18,7 @@
 			fielddisplay(this,"groundedice_levelset","is ice grounded ? grounded ice if > 0, grounding line position if = 0, floating ice if < 0");
 			fielddisplay(this,"ice_levelset","presence of ice if < 0, icefront position if = 0, no ice if > 0");
+		} //}}}
+		this.classname = function () { //{{{
+			return "mask";
 		} //}}}
 		this.checkconsistency = function(md,solution,analyses){ //{{{
@@ -48,3 +51,27 @@
 			}
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'object',this,'fieldname','groundedice_levelset','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',this,'fieldname','ice_levelset','format','DoubleMat','mattype',1);
+
+			// get mask of vertices of elements with ice
+			isice= NewArrayFill(md.mesh.numberofvertices,0);
+			for(var i=0;i<md.mesh.numberofvertices;i++)if(md.mask.ice_levelset[i]<=0)isice[i]=1;
+			
+			vlist = NewArrayFill(md.mesh.numberofvertices,0);
+			var pos=[];
+			for(var i=0;i<md.mesh.numberofelements;i++){
+				var sum=0;
+				for(var j=0;j<md.mesh.elements[0].length;j++){
+					sum+=isice[md.mesh.elements[i][j]-1];
+				}
+				if(sum>0)pos.push(i);
+			}
+			for(var i=0;i<pos.length;i++){
+				for(var j=0;j<md.mesh.elements[0].length;j++){
+					vlist[md.mesh.elements[pos[i]][j]-1]=1;
+				}
+			}
+			WriteData(fid,'data',vlist,'enum',IceMaskNodeActivationEnum(),'format','DoubleMat','mattype',1);
+		}//}}}
 }
Index: /issm/trunk-jpl/src/m/classes/masstransport.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/masstransport.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/masstransport.js	(revision 19791)
@@ -38,4 +38,7 @@
 
 	}// }}}
+	this.classname= function(){// {{{
+		return "masstransport";
+	}// }}}
 		this.checkconsistency = function (md,solution,analyses){  // {{{
 
@@ -51,5 +54,30 @@
 
 		} // }}}
-	//properties 
+		this.marshall=function(md,fid) { //{{{
+
+			yts=365.*24.*3600.;
+
+			WriteData(fid,'object',this,'fieldname','spcthickness','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',this,'fieldname','isfreesurface','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','min_thickness','format','Double');
+			WriteData(fid,'data',StringToEnum(this.hydrostatic_adjustment),'format','Integer','enum',MasstransportHydrostaticAdjustmentEnum());
+			WriteData(fid,'object',this,'fieldname','stabilization','format','Integer');
+			WriteData(fid,'object',this,'fieldname','vertex_pairing','format','DoubleMat','mattype',3);
+			WriteData(fid,'object',this,'fieldname','penalty_factor','format','Double');
+
+			//process requested outputs
+			outputs = this.requested_outputs;
+			for (var i=0;i<outputs;i++){
+				if (outputs[i] == 'default') {
+					outputs.splice(i,1);
+					outputs.push(this.defaultoutputs());
+				}
+			}
+			WriteData(fid,'data',outputs,'enum',MasstransportRequestedOutputsEnum,'format','StringArray');
+		}//}}}
+		this.defaultoutputs = function(md) { //{{{
+			return ['Thickness','Surface','Base'];
+		}//}}}
+//properties 
 	// {{{
 
Index: /issm/trunk-jpl/src/m/classes/matice.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/matice.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/matice.js	(revision 19791)
@@ -78,4 +78,7 @@
 			fielddisplay(this,'mantle_density','Mantle density [g/cm^-3]');
 		} // }}}
+		this.classname = function() {// {{{
+			return "matice";
+		} // }}}
 		this.checkconsistency = function(md,solution,analyses) { // {{{
 			checkfield(md,'fieldname','materials.rho_ice','>',0);
@@ -95,4 +98,26 @@
 
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'enum',MaterialsEnum(),'data',MaticeEnum(),'format','Integer');
+			WriteData(fid,'object',this,'class','materials','fieldname','rho_ice','format','Double');
+			WriteData(fid,'object',this,'class','materials','fieldname','rho_water','enum',MaterialsRhoSeawaterEnum(),'format','Double');
+			WriteData(fid,'object',this,'class','materials','fieldname','rho_freshwater','format','Double');
+			WriteData(fid,'object',this,'class','materials','fieldname','mu_water','format','Double');
+			WriteData(fid,'object',this,'class','materials','fieldname','heatcapacity','format','Double');
+			WriteData(fid,'object',this,'class','materials','fieldname','latentheat','format','Double');
+			WriteData(fid,'object',this,'class','materials','fieldname','thermalconductivity','format','Double');
+			WriteData(fid,'object',this,'class','materials','fieldname','temperateiceconductivity','format','Double');
+			WriteData(fid,'object',this,'class','materials','fieldname','meltingpoint','format','Double');
+			WriteData(fid,'object',this,'class','materials','fieldname','beta','format','Double');
+			WriteData(fid,'object',this,'class','materials','fieldname','mixed_layer_capacity','format','Double');
+			WriteData(fid,'object',this,'class','materials','fieldname','thermal_exchange_velocity','format','Double');
+			WriteData(fid,'object',this,'class','materials','fieldname','rheology_B','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',this,'class','materials','fieldname','rheology_n','format','DoubleMat','mattype',2);
+			WriteData(fid,'data',StringToEnum(this.rheology_law),'enum',MaterialsRheologyLawEnum(),'format','Integer');
+			WriteData(fid,'object',this,'class','materials','fieldname','lithosphere_shear_modulus','format','Double');
+			WriteData(fid,'object',this,'class','materials','fieldname','lithosphere_density','format','Double','scale',10^3);
+			WriteData(fid,'object',this,'class','materials','fieldname','mantle_shear_modulus','format','Double');
+			WriteData(fid,'object',this,'class','materials','fieldname','mantle_density','format','Double','scale',10^3);
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/mesh2d.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/mesh2d.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/mesh2d.js	(revision 19791)
@@ -44,4 +44,7 @@
 			fielddisplay(this,"epsg","EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)");
 		} //}}}
+		this.classname = function () { //{{{
+			return "mesh2d";
+		} //}}}
 		this.domaintype=function (){ // {{{
 			return '2Dhorizontal';
@@ -75,4 +78,19 @@
 			}
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'enum',DomainTypeEnum(),'data',StringToEnum('Domain' + this.domaintype()),'format','Integer');
+			WriteData(fid,'enum',DomainDimensionEnum(),'data',this.dimension(),'format','Integer');
+			WriteData(fid,'enum',MeshElementtypeEnum(),'data',StringToEnum(this.elementtype()),'format','Integer');
+			WriteData(fid,'object',this,'class','mesh','fieldname','x','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',this,'class','mesh','fieldname','y','format','DoubleMat','mattype',1);
+			WriteData(fid,'enum',MeshZEnum(),'data',NewArrayFill(this.numberofvertices,0),'format','DoubleMat','mattype',1);
+			WriteData(fid,'object',this,'class','mesh','fieldname','elements','format','DoubleMat','mattype',2);
+			WriteData(fid,'object',this,'class','mesh','fieldname','numberofelements','format','Integer');
+			WriteData(fid,'object',this,'class','mesh','fieldname','numberofvertices','format','Integer');
+			WriteData(fid,'object',this,'class','mesh','fieldname','average_vertex_connectivity','format','Integer');
+			WriteData(fid,'object',this,'class','mesh','fieldname','vertexonboundary','format','DoubleMat','mattype',1);
+			WriteData(fid,'object',this,'class','mesh','fieldname','segments','format','DoubleMat','mattype',3);
+		}//}}}
+
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/miscellaneous.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/miscellaneous.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/miscellaneous.js	(revision 19791)
@@ -17,8 +17,14 @@
 
 	}// }}}
+	this.classname= function(){// {{{
+		return "miscellaneous";
+	}// }}}
 		this.checkconsistency= function(md,solution,analyses) {// {{{
 
 			checkfield(md,'fieldname','miscellaneous.name','empty',1);
 		}// }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'object',this,'fieldname','name','format','String');
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/outputdefinition.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/outputdefinition.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/outputdefinition.js	(revision 19791)
@@ -15,4 +15,7 @@
 
 	}// }}}
+	this.classname= function(){// {{{
+		return "outputdefinition";
+	}// }}}
 		this.checkconsistency = function(md,solution,analyses) { //{{{
 
@@ -24,4 +27,16 @@
 
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+
+		enums=NewArrayFill(this.definitions.length,0);
+		for (var i=0;i<this.definitions.length;i++){
+			this.definitions[i].marshall(md,fid);
+			classdefinition=this.definitions[i].classname();
+			classdefinition=classdefinition.charAt(0).tuUpperCase() + classdefinition.slice(1); //so it matches our enums definitions.
+			enums[i]=StringToEnum(classdefinition);
+		}
+		enums=ArrayUnique(enums);
+		WriteData(fid,'data',enums,'enum',OutputdefinitionListEnum(),'format','DoubleMat','mattype',1);
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/qmu.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/qmu.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/qmu.js	(revision 19791)
@@ -90,4 +90,7 @@
 
 	}// }}}
+	this.classname= function(){// {{{
+		return "qmu";
+	}// }}}
 		this.checkconsistency = function(md,solution,analyses) { //{{{
 
@@ -97,4 +100,22 @@
 
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'object',this,'fieldname','isdakota','format','Boolean');
+			if (!this.isdakota){
+				WriteData(fid,'data',false,'enum',QmuMassFluxSegmentsPresentEnum,'format','Boolean');
+				return; 
+			}
+			WriteData(fid,'object',this,'fieldname','partition','format','DoubleMat','mattype',2);
+			WriteData(fid,'object',this,'fieldname','numberofpartitions','format','Integer');
+			WriteData(fid,'object',this,'fieldname','numberofresponses','format','Integer');
+			WriteData(fid,'object',this,'fieldname','variabledescriptors','format','StringArray');
+			WriteData(fid,'object',this,'fieldname','responsedescriptors','format','StringArray');
+			if (this.mass_flux_segments.length){
+				WriteData(fid,'data',this.mass_flux_segments,'enum',MassFluxSegmentsEnum,'format','MatArray');
+				flag=true; 
+			}
+			else flag=false; 
+			WriteData(fid,'data',flag,'enum',QmuMassFluxSegmentsPresentEnum,'format','Boolean');
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/rifts.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/rifts.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/rifts.js	(revision 19791)
@@ -7,4 +7,7 @@
 	//methods
 	this.setdefaultparameters = function(){// {{{
+	}// }}}
+	this.classname= function(){// {{{
+		return "rifts";
 	}// }}}
 	this.disp= function(){// {{{
@@ -42,4 +45,36 @@
 			}
 		} //}}}
+		this.marshall=function(md,fid) { //{{{
+
+			//Process rift info
+			if ((this.riftstruct.length==0) | isNaN(this.riftstruct)){
+				numrifts=0;
+			}
+			else{
+				numrifts=this.riftstruct.length;
+			}
+			var numpairs=0;
+			for (var i=0;i<numrifts;i++){
+				numpairs=numpairs+this.riftstruct[i].penaltypairs.length;
+			}
+
+			// 2 for nodes + 2 for elements+ 2 for  normals + 1 for length + 1 for fill + 1 for friction + 1 for fraction + 1 for fractionincrement + 1 for state.
+			data=Create2DArray(numpairs,12);
+			count=0;
+			for (var i=0;i<numrifts;i++){
+				numpairsforthisrift=this.riftstruct[i].penaltypairs.length;
+				for(var j=0;j<numpairsforthisrift;j++){
+					for(var k=0;k<7;k++)data[count+j][k]=this.riftstruct[i].penaltypairs;
+					data[count+j][7]=this.riftstruct[i].fill;
+					data[count+j][8]=this.riftstruct[i].friction;
+					data[count+j][9]=this.riftstruct[i].fraction;
+					data[count+j][10]=this.riftstruct[i].fractionincrement;
+					data[count+j][11]=this.riftstruct[i].state;
+					count+=numpairsforthisrift;
+				}
+			}
+			WriteData(fid,'data',numrifts,'enum',RiftsNumriftsEnum(),'format','Integer');
+			WriteData(fid,'data',data,'enum',RiftsRiftstructEnum(),'format','DoubleMat','mattype',3);
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/settings.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/settings.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/settings.js	(revision 19791)
@@ -33,4 +33,8 @@
 
 	}// }}}
+	this.classname= function(){// {{{
+		return "settings";
+
+	}// }}}
 		this.checkconsistency = function(md,solution,analyses) { // {{{
 
@@ -42,4 +46,13 @@
 			checkfield(md,'fieldname','settings.waitonlock','numel',[1]);
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'object',this,'fieldname','results_on_nodes','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','io_gather','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','lowmem','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','output_frequency','format','Integer');
+			WriteData(fid,'object',this,'fieldname','recording_frequency','format','Integer');
+			if (this.waitonlock>0) WriteData(fid,'enum',SettingsWaitonlockEnum(),'data',true,'format','Boolean');
+			else WriteData(fid,'enum',SettingsWaitonlockEnum(),'data',false,'format','Boolean');
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/steadystate.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/steadystate.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/steadystate.js	(revision 19791)
@@ -28,4 +28,8 @@
 
 	}// }}}
+	this.classname= function(){// {{{
+		return "steadystate";
+
+	}// }}}
 	this.checkconsistency = function(md,solution,analyses) {// {{{
 
@@ -42,4 +46,28 @@
 		}
 	} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'object',this,'fieldname','reltol','format','Double');
+			WriteData(fid,'object',this,'fieldname','maxiter','format','Integer');
+
+			//process requested outputs
+			outputs = this.requested_outputs;
+			for (var i=0;i<outputs;i++){
+				if (outputs[i] == 'default') {
+					outputs.splice(i,1);
+					outputs.push(this.defaultoutputs());
+				}
+			}
+			WriteData(fid,'data',outputs,'enum',SteadystateRequestedOutputsEnum,'format','StringArray');
+		}//}}}
+		this.defaultoutputs = function(md) { //{{{
+
+			var list=[];
+
+			for (var i=0;i<md.stressbalance.defaultoutputs().length;i++)list.push(md.stressbalance.defaultoutputs()[i]);
+			for (var i=0;i<md.thermal.defaultoutputs().length;i++)list.push(md.thermal.defaultoutputs()[i]);
+
+			return list;
+
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/stressbalance.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/stressbalance.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/stressbalance.js	(revision 19791)
@@ -72,4 +72,7 @@
 
 
+	}// }}}
+	this.classname= function(){// {{{
+		return "stressbalance";
 	}// }}}
 		this.checkconsistency = function(md,solution,analyses) { //{{{
@@ -133,4 +136,53 @@
 			}
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','vertex_pairing','format','DoubleMat','mattype',3);
+
+			yts=365.0*24.0*3600.0;
+
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','spcvy','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','restol','format','Double');
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','reltol','format','Double');
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','abstol','format','Double','scale',1./yts);
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','isnewton','format','Integer');
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','FSreconditioning','format','Double');
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','viscosity_overshoot','format','Double');
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','maxiter','format','Integer');
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','shelf_dampening','format','Integer');
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','penalty_factor','format','Double');
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','rift_penalty_lock','format','Integer');
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','rift_penalty_threshold','format','Integer');
+			WriteData(fid,'object',this,'class','stressbalance','fieldname','referential','format','DoubleMat','mattype',1);
+
+			lx=NewArrayFill(this.loadingforce.length,0); for(var i=0;i<lx.length;i++)lx[i]=this.loadingforce[i][0];
+			ly=NewArrayFill(this.loadingforce.length,0); for(var i=0;i<lx.length;i++)ly[i]=this.loadingforce[i][1];
+			lz=NewArrayFill(this.loadingforce.length,0); for(var i=0;i<lx.length;i++)lz[i]=this.loadingforce[i][2];
+
+			WriteData(fid,'data',lx,'format','DoubleMat','mattype',1,'enum',LoadingforceXEnum);
+			WriteData(fid,'data',ly,'format','DoubleMat','mattype',1,'enum',LoadingforceYEnum);
+			WriteData(fid,'data',lz,'format','DoubleMat','mattype',1,'enum',LoadingforceZEnum);
+
+			//process requested outputs
+			outputs = this.requested_outputs;
+			for (var i=0;i<outputs;i++){
+				if (outputs[i] == 'default') {
+					outputs.splice(i,1);
+					outputs.push(this.defaultoutputs());
+				}
+			}			
+			WriteData(fid,'data',outputs,'enum',StressbalanceRequestedOutputsEnum,'format','StringArray');
+		}//}}}
+		this.defaultoutputs = function(md){ // {{{
+
+			var list;
+			if (md.mesh.dimension() == 3) list = ['Vx','Vy','Vz','Vel','Pressure'];
+			else if (md.mesh.dimension()==2) list = ['Vx','Vy','Vel','Pressure'];
+			else throw Error('mesh type not supported yet');
+			return list;
+
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/thermal.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/thermal.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/thermal.js	(revision 19791)
@@ -49,4 +49,7 @@
 
 	}// }}}
+	this.classname= function(){// {{{
+		return "thermal";
+	}// }}}
 	this.checkconsistency = function(md,solution,analyses){ // {{{
 
@@ -81,4 +84,30 @@
 		checkfield(md,'fieldname','thermal.requested_outputs','stringrow',1);
 	} // }}} 
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'object',this,'fieldname','spctemperature','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',this,'fieldname','penalty_threshold','format','Integer');
+			WriteData(fid,'object',this,'fieldname','stabilization','format','Integer');
+			WriteData(fid,'object',this,'fieldname','reltol','format','Double');
+			WriteData(fid,'object',this,'fieldname','maxiter','format','Integer');
+			WriteData(fid,'object',this,'fieldname','penalty_lock','format','Integer');
+			WriteData(fid,'object',this,'fieldname','penalty_factor','format','Double');
+			WriteData(fid,'object',this,'fieldname','isenthalpy','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','isdynamicbasalspc','format','Boolean');
+
+			//process requested outputs
+			outputs = this.requested_outputs;
+			for (var i=0;i<outputs;i++){
+				if (outputs[i] == 'default') {
+					outputs.splice(i,1);
+					outputs.push(this.defaultoutputs());
+				}
+			}
+			WriteData(fid,'data',outputs,'enum',ThermalRequestedOutputsEnum(),'format','StringArray');
+        	}//}}}
+		this.defaultoutputs = function(md) { //{{{
+
+			if (this.isenthalpy) return ['Enthalpy','Temperature','Waterfraction','Watercolumn','BasalforcingsGroundediceMeltingRate'];
+			else return ['Temperature','BasalforcingsGroundediceMeltingRate'];
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/timestepping.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/timestepping.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/timestepping.js	(revision 19791)
@@ -39,4 +39,8 @@
 
 	}// }}}
+	this.classname= function(){// {{{
+		return "timestepping";
+
+	}// }}}
 		this.checkconsistency = function(md,solution,analyses) { //{{{
 			
@@ -51,4 +55,18 @@
 			}
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+
+			var scale;
+			if (this.in_years) scale = 365.0*24.0*3600.0;
+			else scale = 1.;
+			
+			WriteData(fid,'object',this,'fieldname','start_time','format','Double','scale',scale);
+			WriteData(fid,'object',this,'fieldname','final_time','format','Double','scale',scale);
+			WriteData(fid,'object',this,'fieldname','time_step','format','Double','scale',scale);
+			WriteData(fid,'object',this,'fieldname','time_adapt','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','cfl_coefficient','format','Double');
+			WriteData(fid,'object',this,'fieldname','interp_forcings','format','Boolean');
+
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/transient.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/transient.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/transient.js	(revision 19791)
@@ -42,4 +42,7 @@
 
 	}// }}}
+	this.classname= function(){// {{{
+		return "transient";
+	}// }}}
 		this.checkconsistency = function(md,solution,analyses) { // {{{
 
@@ -59,4 +62,30 @@
 			checkfield(md,'fieldname','transient.requested_outputs','stringrow',1);
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'object',this,'fieldname','issmb','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','ismasstransport','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','isstressbalance','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','isthermal','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','isgroundingline','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','isgia','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','isdamageevolution','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','ishydrology','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','islevelset','format','Boolean');
+			WriteData(fid,'object',this,'fieldname','iscalving','format','Boolean');
+
+			//process requested outputs
+			outputs = this.requested_outputs;
+			for (var i=0;i<outputs;i++){
+				if (outputs[i] == 'default') {
+					outputs.splice(i,1);
+					outputs.push(this.defaultoutputs());
+				}
+			}			
+			WriteData(fid,'data',outputs,'enum',TransientRequestedOutputsEnum,'format','StringArray');
+		}//}}}
+		this.defaultoutputs = function(md) { //{{{
+			if(this.issmb)return ['SmbMassBalance'];
+			else return [];
+		}//}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/classes/verbose.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/verbose.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/classes/verbose.js	(revision 19791)
@@ -43,4 +43,24 @@
 
 		} // }}}
+		this.marshall=function(md,fid) { //{{{
+			WriteData(fid,'data',this.VerboseToBinary(),'enum',VerboseEnum(),'format','Integer');
+		}//}}}
+		this.VerboseToBinary = function () { //{{{
+
+			//BEGINVERB2BIN
+			var binary=0;
+			if (verbose.mprocessor) binary=Math.bitOr(binary1); 
+			if (verbose.module) binary=Math.bitOr(binary2); 
+			if (verbose.solution) binary=Math.bitOr(binary4); 
+			if (verbose.solver) binary=Math.bitOr(binary8); 
+			if (verbose.convergence) binary=Math.bitOr(binary16); 
+			if (verbose.control) binary=Math.bitOr(binary32); 
+			if (verbose.qmu) binary=Math.bitOr(binary64); 
+			if (verbose.autodiff) binary=Math.bitOr(binary128); 
+			if (verbose.smb) binary=Math.bitOr(binary256); 
+			//ENDVERB2BIN
+			return binary;
+
+		} //}}}
 	//properties 
 	// {{{
Index: /issm/trunk-jpl/src/m/inversions/marshallcostfunctions.js
===================================================================
--- /issm/trunk-jpl/src/m/inversions/marshallcostfunctions.js	(revision 19791)
+++ /issm/trunk-jpl/src/m/inversions/marshallcostfunctions.js	(revision 19791)
@@ -0,0 +1,19 @@
+function  marshallcostfunctions(cost_functions){
+	for(i=0;i<cost_functions.length;i++){
+		if(cost_functions[i]==101) data[i]=SurfaceAbsVelMisfitEnum();
+		if(cost_functions[i]==102) data[i]=SurfaceRelVelMisfitEnum();
+		if(cost_functions[i]==103) data[i]=SurfaceLogVelMisfitEnum();
+		if(cost_functions[i]==104) data[i]=SurfaceLogVxVyMisfitEnum();
+		if(cost_functions[i]==105) data[i]=SurfaceAverageVelMisfitEnum();
+		if(cost_functions[i]==201) data[i]=ThicknessAbsMisfitEnum();
+		if(cost_functions[i]==501) data[i]=DragCoefficientAbsGradientEnum();
+		if(cost_functions[i]==502) data[i]=RheologyBbarAbsGradientEnum();
+		if(cost_functions[i]==503) data[i]=ThicknessAbsGradientEnum();
+		if(cost_functions[i]==504) data[i]=ThicknessAlongGradientEnum();
+		if(cost_functions[i]==505) data[i]=ThicknessAcrossGradientEnum();
+		if(cost_functions[i]==506) data[i]=BalancethicknessMisfitEnum();
+		if(cost_functions[i]==507) data[i]=RheologyBAbsGradientEnum();
+		if(cost_functions[i]==601) data[i]=SurfaceAbsMisfitEnum();
+	}
+	return data;
+}
Index: /issm/trunk-jpl/src/m/io/fileptr.js
===================================================================
--- /issm/trunk-jpl/src/m/io/fileptr.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/io/fileptr.js	(revision 19791)
@@ -25,5 +25,5 @@
 		this.setdefaultparameters = function (options) { //{{{
 
-			this.increment=options.getfieldvalue('increment',8000); //8000 bytes,  1000 doubles.
+			this.increment=options.getfieldvalue('increment',80000); //80000 bytes,  10000 doubles.
 			this.buffer=new ArrayBuffer(this.increment);
 			this.ptr=0;
@@ -33,15 +33,11 @@
 		this.fwrite = function (value,format) { //{{{
 
-			if(this.ptr==this.buffer.byteLength){
-				//need to resize the buffer: 
-				var  newbuffer = new ArrayBuffer(this.buffer.byteLength+this.increment);
-				newbuffer.set(this.buffer);
-				this.buffer=newbuffer;
-			}
 			
 			if(format == 'int'){
+				if(this.ptr+4>=this.buffer.byteLength)this.resize();
 				this.view.setUint32(this.ptr,value,true); this.ptr+=4;
 			}
 			else if(format == 'char'){
+				if(this.ptr+value.length>=this.buffer.byteLength)this.resize();
 				for(var i=0;i<value.length;i++){
 					this.view.setUint8(this.ptr,value.charCodeAt(i),true); 
@@ -50,4 +46,5 @@
 			}
 			else if(format == 'double'){
+				if(this.ptr+8>=this.buffer.byteLength)this.resize();
 				if (!IsArray(value)){
 					this.view.setFloat64(this.ptr,value,true);
@@ -56,4 +53,5 @@
 				else{
 					if (!IsArray(value[0])){
+						if(this.ptr+value.length*8>=this.buffer.byteLength)this.resize();
 						for(var i=0;i<value.length;i++){
 							this.view.setFloat64(this.ptr,value[i],true);
@@ -62,4 +60,5 @@
 					}
 					else{
+						if(this.ptr+value.length*value[0].length*8>=this.buffer.byteLength)this.resize();
 						for(var i=0;i<value.length;i++){
 							for(var j=0;j<value[0].length;j++){
@@ -76,4 +75,10 @@
 			return this.buffer;
 		} //}}}
+		this.resize = function () { //{{{
+			var  newbuffer = new ArrayBuffer(this.buffer.byteLength+this.increment);
+			new Uint8Array(newbuffer).set(new Uint8Array(this.buffer));
+			this.buffer=newbuffer;
+			this.view=new DataView(this.buffer);
+		} //}}}
 	//set defaults
 	this.setdefaultparameters(this.options);
Index: /issm/trunk-jpl/src/m/solve/WriteData.js
===================================================================
--- /issm/trunk-jpl/src/m/solve/WriteData.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/solve/WriteData.js	(revision 19791)
@@ -14,9 +14,9 @@
 		obj       = options.getfieldvalue('object');
 		fieldname = options.getfieldvalue('fieldname');
-		classname = options.getfieldvalue('class',obj.classname());
 		if (options.exist('enum')){
 			enumm = options.getfieldvalue('enum');
 		}
 		else{
+			classname = options.getfieldvalue('class',obj.classname());
 			enumm = BuildEnum(classname  + '_' + fieldname);
 		}
@@ -121,8 +121,8 @@
 
 		//if matrix = NaN, then do not write anything
-		if (s[0]==1 & s[1]==1 & isNan(data)){
-			s[0]=0; s[1]=0;
-		}
-		if (s[0]==1 & s[1]==1 & isNan(data[0])){
+		if (s[0]==1 & s[1]==1 & isNaN(data)){
+			s[0]=0; s[1]=0;
+		}
+		if (s[0]==1 & s[1]==1 & isNaN(data[0])){
 			s[0]=0; s[1]=0;
 		}
@@ -147,8 +147,8 @@
 
 		//if matrix = NaN, then do not write anything
-		if (s[0]==1 & s[1]==1 & isNan(data)){
-			s[0]=0; s[1]=0;
-		}
-		if (s[0]==1 & s[1]==1 & isNan(data[0])){
+		if (s[0]==1 & s[1]==1 & isNaN(data)){
+			s[0]=0; s[1]=0;
+		}
+		if (s[0]==1 & s[1]==1 & isNaN(data[0])){
 			s[0]=0; s[1]=0;
 		}
@@ -174,8 +174,8 @@
 
 		//if matrix = NaN, then do not write anything
-		if (s[0]==1 & s[1]==1 & isNan(data)){
-			s[0]=0; s[1]=0;
-		}
-		if (s[0]==1 & s[1]==1 & isNan(data[0])){
+		if (s[0]==1 & s[1]==1 & isNaN(data)){
+			s[0]=0; s[1]=0;
+		}
+		if (s[0]==1 & s[1]==1 & isNaN(data[0])){
 			s[0]=0; s[1]=0;
 		}
@@ -279,5 +279,5 @@
 
 	//take first letter of string and make it uppercase: 
-	string = string.charAt(0).toUpperCase() + this.slice(1);
+	string = string.charAt(0).toUpperCase() + string.slice(1);
 
 	//Get Enum
Index: /issm/trunk-jpl/src/m/solve/marshall.js
===================================================================
--- /issm/trunk-jpl/src/m/solve/marshall.js	(revision 19790)
+++ /issm/trunk-jpl/src/m/solve/marshall.js	(revision 19791)
@@ -28,5 +28,4 @@
 			continue;
 		}
-		console.log(field);
 
 		//Marshall current object
@@ -36,5 +35,4 @@
 	//Last, write MaximumNumberOfEnum+1 to make sure that the binary file is not corrupt
 	WriteData(fid,'enum',MaximumNumberOfDefinitionsEnum()+1,'data',true,'format','Boolean');
-
 	return fid;
 }
Index: /issm/trunk-jpl/test/NightlyRun/test101.html
===================================================================
--- /issm/trunk-jpl/test/NightlyRun/test101.html	(revision 19790)
+++ /issm/trunk-jpl/test/NightlyRun/test101.html	(revision 19791)
@@ -71,4 +71,5 @@
 <script type="text/javascript" src="../../src/m/io/fileptr.js"></script>
 <script type="text/javascript" src="../../src/m/solve/solve.js"></script>
+<script type="text/javascript" src="../../src/m/inversions/marshallcostfunctions.js"></script>
 <script type="text/javascript" src="../../src/m/solve/marshall.js"></script>
 <script type="text/javascript" src="../../src/m/solve/WriteData.js"></script>
@@ -83,6 +84,6 @@
 <script type="text/javascript" src="../../src/c/main/issm.js"></script>
 <script type="text/javascript" src="../../externalpackages/javascript/src/sprintf.js"></script>
-<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
-<script src="https://raw.githubusercontent.com/toji/gl-matrix/master/dist/gl-matrix-min.js"></script>
+<script type="text/javascript" src="../../externalpackages/javascript/src/jquery.min.js"></script>
+<script type="text/javascript" src="../../externalpackages/javascript/src/gl-matrix-min.js"></script>
 <!-- Includes }}}-->
 </head>
@@ -96,5 +97,5 @@
 	parameterize(md);
 	setflowequation(md,'SSA','all');
-	md=solve(md,StressbalanceSolutionEnum());
+	md=solve(md,StressbalanceSolutionEnum(),'checkconsistency','no');
 
 	/*plotmodel(md,'data',md.initialization.vel,'colorbar','on','data',md.initialization.vx,
