Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 16786)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 16787)
@@ -540,4 +540,5 @@
 #Responses sources  {{{
 responses_sources= ./classes/Massfluxatgate.h \
+				   ./classes/Misfit.h \
 				   ./modules/ModelProcessorx/CreateOutputDefinitions.cpp\
 				   ./modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.h\
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 16786)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 16787)
@@ -133,4 +133,5 @@
 		virtual IssmDouble IceVolumeAboveFloatation(void)=0;
 		virtual IssmDouble TotalSmb(void)=0;
+		virtual IssmDouble Misfit(int modelenum,int observationenum,int weightsenum)=0;
 		#endif
 
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 16786)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 16787)
@@ -178,4 +178,5 @@
 		IssmDouble BalancethicknessMisfit(void){_error_("not supported");};
 		void   InputControlUpdate(IssmDouble scalar,bool save_parameter);
+		IssmDouble Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");};
 		#endif
 
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 16786)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 16787)
@@ -179,4 +179,5 @@
 		void       MaxVy(IssmDouble* pmaxvy){_error_("not implemented yet");};
 		void       MaxVz(IssmDouble* pmaxvz){_error_("not implemented yet");};
+		IssmDouble Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");};
 #endif
 
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 16786)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 16787)
@@ -3250,4 +3250,46 @@
 	/*Return: */
 	return Total_Smb;
+}
+/*}}}*/
+/*FUNCTION Tria::Misfit{{{*/
+IssmDouble Tria::Misfit(int modelenum,int observationenum,int weightsenum){
+
+	/*Intermediaries*/
+	IssmDouble model,observation,weight;
+	IssmDouble Jdet;
+	IssmDouble Jelem = 0;
+	IssmDouble xyz_list[NUMVERTICES][3];
+	GaussTria *gauss = NULL;
+
+	/*If on water, return 0: */
+	if(NoIceInElement())return 0;
+
+	/*Retrieve all inputs we will be needing: */
+	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+	Input* model_input=inputs->GetInput(modelenum);   _assert_(model_input);
+	Input* observation_input=inputs->GetInput(observationenum);_assert_(observation_input);
+	Input* weights_input     =inputs->GetInput(weightsenum);     _assert_(weights_input);
+
+	/* Start  looping on the number of gaussian points: */
+	gauss=new GaussTria(2);
+	for(int ig=gauss->begin();ig<gauss->end();ig++){
+
+		gauss->GaussPoint(ig);
+
+		/* Get Jacobian determinant: */
+		GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);
+
+		/*Get parameters at gauss point*/
+		model_input->GetInputValue(&model,gauss);
+		observation_input->GetInputValue(&observation,gauss);
+		weights_input->GetInputValue(&weight,gauss);
+
+		/*compute misfit between model and observation */
+		Jelem+=0.5*(model-observation)*(model-observation)*weight*Jdet*gauss->weight;
+	}
+
+	/* clean up and Return: */
+	delete gauss;
+	return Jelem;
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 16786)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 16787)
@@ -150,4 +150,5 @@
 		void       MaxVy(IssmDouble* pmaxvy);
 		void       MaxVz(IssmDouble* pmaxvz);
+		IssmDouble Misfit(int modelenum,int observationenum,int weightsenum);
 		#endif
 
Index: /issm/trunk-jpl/src/c/classes/Misfit.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Misfit.h	(revision 16787)
+++ /issm/trunk-jpl/src/c/classes/Misfit.h	(revision 16787)
@@ -0,0 +1,117 @@
+/*!\file Misfit.h
+ * \brief: header file for Misfit object
+ */
+
+#ifndef _MISFIT_H_
+#define _MISFIT_H_
+
+/*Headers:*/
+/*{{{*/
+#include "./Definition.h"
+#include "../datastructures/datastructures.h"
+#include "./Elements/Element.h"
+#include "./Elements/Elements.h"
+#include "./FemModel.h"
+/*}}}*/
+
+class Misfit: public Object, public Definition{
+
+	public: 
+
+		char*       name;
+		int         model_enum;
+		int         observation_enum;
+		int         weights_enum;
+		char*       timeinterpolation;
+		
+		/*Misfit constructors, destructors :*/
+		/*FUNCTION Misfit() {{{*/
+		Misfit(){
+
+			this->name = NULL;
+			this->model_enum = UNDEF;
+			this->observation_enum = UNDEF;
+			this->weights_enum = UNDEF;
+			this->timeinterpolation=NULL;
+
+		}
+		/*}}}*/
+		/*FUNCTION Misfit(char* in_name, int in_model_enum, int in_observation_enum char* in_timeinterpolation, int in_weights_enum) {{{*/
+		Misfit(char* in_name, int in_model_enum, int in_observation_enum, char* in_timeinterpolation, int in_weights_enum){
+
+			this->name   = xNew<char>(strlen(in_name)+1);
+			xMemCpy<char>(this->name,in_name,strlen(in_name)+1);
+
+			this->timeinterpolation   = xNew<char>(strlen(in_timeinterpolation)+1);
+			xMemCpy<char>(this->timeinterpolation,in_timeinterpolation,strlen(in_timeinterpolation)+1);
+
+			this->model_enum=in_model_enum;
+			this->observation_enum=in_observation_enum;
+			this->weights_enum=in_weights_enum;
+		}
+		/*}}}*/
+		/*FUNCTION ~Misfit() {{{*/
+		~Misfit(){
+			if(this->name)xDelete(this->name);
+			if(this->timeinterpolation)xDelete(this->timeinterpolation);
+		}
+		/*}}}*/
+		/*Object virtual function resolutoin: */
+		/*FUNCTION Echo(){{{*/
+		void Echo(void){
+			_printf_(" Misfit: " << name << "\n");
+			_printf_("    model_enum: " << model_enum << " " << EnumToStringx(model_enum) << "\n");
+			_printf_("    observation_enum: " << observation_enum << " " << EnumToStringx(observation_enum) << "\n");
+			_printf_("    weights_enum: " << weights_enum << " " << EnumToStringx(weights_enum) << "\n");
+			_printf_("    timeinterpolation: " << timeinterpolation << "\n");
+		}
+		/*}}}*/
+		/*FUNCTION DeepEcho(){{{*/
+		void DeepEcho(void){
+			this->Echo();
+		}
+		/*}}}*/
+		/*FUNCTION Id(){{{*/
+		int Id(void){
+			return -1;
+		}
+		/*}}}*/
+		/*FUNCTION ObjectEnum{{{*/
+		int ObjectEnum(void){
+			return MisfitEnum;
+		}
+		/*}}}*/
+		/*FUNCTION copy {{{*/
+		Object* copy() {
+			return new Misfit(this->name,this->model_enum,this->observation_enum,this->timeinterpolation,this->weights_enum);
+		}
+		/*}}}*/
+		/*Definition virtual function resolutoin: */
+		/*FUNCTION char* Name() {{{*/
+		char* Name(){
+
+			char* name2=xNew<char>(strlen(this->name)+1);
+			xMemCpy(name2,this->name,strlen(this->name)+1);
+
+			return name2;
+		}
+		/*}}}*/
+		/*FUNCTION IssmDouble Response(FemModel* femmodel) {{{*/
+		 IssmDouble Response(FemModel* femmodel){
+
+			 int i;
+			 IssmDouble response=0;
+			 IssmDouble all_response=0;
+
+			 for(i=0;i<femmodel->elements->Size();i++){
+				 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
+				 response+=element->Misfit(model_enum,observation_enum,weights_enum);
+			 }
+			 
+			 ISSM_MPI_Allreduce ( (void*)&response,(void*)&all_response,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
+			 return all_response;
+		 }
+			/*}}}*/
+};
+
+#endif  /* _MISFIT_H_ */
Index: /issm/trunk-jpl/src/c/classes/classes.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/classes.h	(revision 16786)
+++ /issm/trunk-jpl/src/c/classes/classes.h	(revision 16787)
@@ -18,4 +18,5 @@
 #include "./Segment.h"
 #include "./Massfluxatgate.h"
+#include "./Misfit.h"
 
 /*Constraints: */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 16786)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 16787)
@@ -8,15 +8,11 @@
 #include "./ModelProcessorx.h"
 
-void CreateOutputDefinitions(Parameters* parameters,IoModel* iomodel){
+void CreateOutputDefinitions(Elements* elements, Parameters* parameters,IoModel* iomodel){
 
 	int i,j;
 	
-	DataSet     *output_definitions      = NULL;
-	int         *output_definition_enums = NULL;
+	DataSet*     output_definitions      = NULL;
+	int*         output_definition_enums = NULL;
 	int          num_output_definitions;
-	int          numgates;
-	char       **gatenames               = NULL;
-	IssmDouble **gatesegments            = NULL;
-	int         *gatesegments_M          = NULL;
 
 	/*Create output_definitions dataset: */
@@ -28,5 +24,13 @@
 
 			if (output_definition_enums[i]==MassfluxatgateEnum){
+
 				/*Deal with mass flux gates:{{{ */
+				
+				/*massfluxatgate variables: */
+				int          numgates;
+				char       **gatenames               = NULL;
+				IssmDouble **gatesegments            = NULL;
+				int         *gatesegments_M          = NULL;
+
 
 				/*Fetch segments and names: */
@@ -47,4 +51,68 @@
 				/*}}}*/
 			}
+			else if (output_definition_enums[i]==MisfitEnum){
+				/*Deal with misfits: {{{*/
+				
+				/*misfit variables: */
+				int          nummisfits;
+				char**       misfit_name_s             = NULL;    
+				int*         misfit_model_enum_s        = NULL;
+				IssmDouble** misfit_observation_s      = NULL;
+				int*         misfit_observation_enum_s  = NULL;
+				int*         misfit_observation_M_s    = NULL;
+				int*         misfit_observation_N_s    = NULL;
+				char**       misfit_timeinterpolation_s = NULL;
+				IssmDouble** misfit_weights_s           = NULL;
+				int*         misfit_weights_M_s    = NULL;
+				int*         misfit_weights_N_s    = NULL;
+				int*         misfit_weights_enum_s= NULL;
+
+				/*Fetch name, model_enum, observation, observation_enum, etc ... (see src/m/classes/misfit.m): */
+				iomodel->FetchMultipleData(&misfit_name_s,&nummisfits,MisfitNameEnum);
+				iomodel->FetchMultipleData(&misfit_model_enum_s,&nummisfits,MisfitModelEnumEnum);
+				iomodel->FetchMultipleData(&misfit_observation_s,&misfit_observation_M_s,&misfit_observation_N_s,&nummisfits,MisfitObservationEnum);
+				iomodel->FetchMultipleData(&misfit_observation_enum_s,&nummisfits,MisfitObservationEnumEnum);
+				iomodel->FetchMultipleData(&misfit_timeinterpolation_s,&nummisfits,MisfitTimeinterpolationEnum);
+				iomodel->FetchMultipleData(&misfit_weights_s,&misfit_weights_M_s,&misfit_weights_N_s,&nummisfits,MisfitWeightsEnum);
+				iomodel->FetchMultipleData(&misfit_weights_enum_s,&nummisfits,MisfitWeightsEnumEnum);
+
+				for(j=0;j<nummisfits;j++){
+
+					/*First create a misfit object for that specific enum (misfit_model_enum_s[j]):*/
+					output_definitions->AddObject(new Misfit(misfit_name_s[j],misfit_model_enum_s[j],misfit_observation_enum_s[j],misfit_timeinterpolation_s[j],misfit_weights_enum_s[j]));
+
+					/*Now, for this particular misfit object, make sure we plug into the elements: the observation, and the weights.*/
+					for(i=0;i<elements->Size();i++){
+						Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
+						element->InputCreate(misfit_observation_s[j], iomodel,misfit_observation_M_s[j],misfit_observation_N_s[j],1,misfit_observation_enum_s[j],7);
+						element->InputCreate(misfit_weights_s[j], iomodel,misfit_weights_M_s[j],misfit_weights_N_s[j],1,misfit_weights_enum_s[j],7);
+					}
+
+				}
+
+				/*Free ressources:*/
+				for(j=0;j<nummisfits;j++){
+					char* string=NULL;
+					IssmDouble* matrix = NULL;
+
+					string = misfit_name_s[j];    xDelete<char>(string);
+					string = misfit_timeinterpolation_s[j];    xDelete<char>(string);
+					matrix = misfit_observation_s[j]; xDelete<IssmDouble>(matrix);
+					matrix = misfit_weights_s[j]; xDelete<IssmDouble>(matrix);
+				}
+				xDelete<char*>(misfit_name_s);
+				xDelete<int>(misfit_model_enum_s);
+				xDelete<IssmDouble*>(misfit_observation_s);
+				xDelete<int>(misfit_observation_enum_s);
+				xDelete<int>(misfit_observation_M_s);
+				xDelete<int>(misfit_observation_N_s);
+				xDelete<char*>(misfit_timeinterpolation_s);
+				xDelete<IssmDouble*>(misfit_weights_s);
+				xDelete<int>(misfit_weights_M_s);
+				xDelete<int>(misfit_weights_N_s);
+				xDelete<int>(misfit_weights_enum_s);
+				/*}}}*/
+			}
+
 			else _error_("output definition enum " << output_definition_enums[i] << "not supported yet!");
 		}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 16786)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 16787)
@@ -196,7 +196,5 @@
 	/*}}}*/
 
-	/*Output definitions dataset: */
-	CreateOutputDefinitions(parameters,iomodel);
-
+	
 	/*Before returning, create parameters in case we are running Qmu or control types runs: */
 	#ifdef _HAVE_CONTROL_
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp	(revision 16786)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp	(revision 16787)
@@ -105,4 +105,7 @@
 	#endif
 
+	/*Output definitions dataset: */
+	CreateOutputDefinitions(elements,parameters,iomodel);
+
 	/* Sort datasets:
 	 * All our datasets are already ordered by ids. Set presort flag so that
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 16786)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 16787)
@@ -17,5 +17,5 @@
 void CreateParametersControl(Parameters* parameters,IoModel* iomodel,int solution_type);
 void CreateParametersDakota(Parameters* parameters,IoModel* iomodel,char* rootpath);
-void CreateOutputDefinitions(Parameters* parameters,IoModel* iomodel);
+void CreateOutputDefinitions(Elements* elements, Parameters* parameters,IoModel* iomodel);
 void UpdateElementsAndMaterialsControl(Elements* elements,Materials* materials, IoModel* iomodel);
 void UpdateElementsAndMaterialsDakota(Elements* elements,Materials* materials, IoModel* iomodel);
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 16786)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 16787)
@@ -552,8 +552,12 @@
 	MassfluxatgateSegmentsEnum,
 	MisfitNameEnum,
-	MisfitModelEnum,
-	MisfitObservationsEnum,
+	MisfitModelEnumEnum,
+	MisfitObservationEnum,
+	MisfitObservationEnumEnum,
 	MisfitTimeinterpolationEnum,
 	MisfitWeightsEnum,
+	MisfitWeightsEnumEnum,
+	SurfaceObservationEnum,
+	WeightsSurfaceObservationEnum,
 	/*}}}*/
 	/*Responses{{{*/
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 16786)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 16787)
@@ -540,8 +540,12 @@
 		case MassfluxatgateSegmentsEnum : return "MassfluxatgateSegments";
 		case MisfitNameEnum : return "MisfitName";
-		case MisfitModelEnum : return "MisfitModel";
-		case MisfitObservationsEnum : return "MisfitObservations";
+		case MisfitModelEnumEnum : return "MisfitModelEnum";
+		case MisfitObservationEnum : return "MisfitObservation";
+		case MisfitObservationEnumEnum : return "MisfitObservationEnum";
 		case MisfitTimeinterpolationEnum : return "MisfitTimeinterpolation";
 		case MisfitWeightsEnum : return "MisfitWeights";
+		case MisfitWeightsEnumEnum : return "MisfitWeightsEnum";
+		case SurfaceObservationEnum : return "SurfaceObservation";
+		case WeightsSurfaceObservationEnum : return "WeightsSurfaceObservation";
 		case MinVelEnum : return "MinVel";
 		case MaxVelEnum : return "MaxVel";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 16786)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 16787)
@@ -552,8 +552,12 @@
 	      else if (strcmp(name,"MassfluxatgateSegments")==0) return MassfluxatgateSegmentsEnum;
 	      else if (strcmp(name,"MisfitName")==0) return MisfitNameEnum;
-	      else if (strcmp(name,"MisfitModel")==0) return MisfitModelEnum;
-	      else if (strcmp(name,"MisfitObservations")==0) return MisfitObservationsEnum;
+	      else if (strcmp(name,"MisfitModelEnum")==0) return MisfitModelEnumEnum;
+	      else if (strcmp(name,"MisfitObservation")==0) return MisfitObservationEnum;
+	      else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
 	      else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
 	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
+	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
+	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
 	      else if (strcmp(name,"MinVel")==0) return MinVelEnum;
 	      else if (strcmp(name,"MaxVel")==0) return MaxVelEnum;
@@ -625,12 +629,12 @@
 	      else if (strcmp(name,"Option")==0) return OptionEnum;
 	      else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
-	      else if (strcmp(name,"OptionCell")==0) return OptionCellEnum;
+         else stage=6;
+   }
+   if(stage==6){
+	      if (strcmp(name,"OptionCell")==0) return OptionCellEnum;
 	      else if (strcmp(name,"OptionStruct")==0) return OptionStructEnum;
 	      else if (strcmp(name,"Paterson")==0) return PatersonEnum;
 	      else if (strcmp(name,"Arrhenius")==0) return ArrheniusEnum;
-         else stage=6;
-   }
-   if(stage==6){
-	      if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
+	      else if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
 	      else if (strcmp(name,"MaximumNumberOfDefinitions")==0) return MaximumNumberOfDefinitionsEnum;
          else stage=7;
Index: /issm/trunk-jpl/src/m/classes/misfit.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/misfit.m	(revision 16787)
+++ /issm/trunk-jpl/src/m/classes/misfit.m	(revision 16787)
@@ -0,0 +1,88 @@
+%MISFIT class definition
+%
+%   Usage:
+%      misfit=misfit();
+%      misfit=misfit('name','SurfaceAltimetry',...
+%                    'model_enum',SurfaceEnum,...
+%                    'observation_enum',SurfaceObservationsEnum,...
+%                    'observation',md.geometry.surface,...
+%                    'timeinterpolation','nearestneighbor',...
+%                    'weights',ones(md.mesh.numberofvertices,1),...
+%                    'weights_enum',WeightsSurfaceObservationsEnum);
+%
+%
+
+classdef misfit
+	properties (SetAccess=public)
+		%misfit
+		name              = '';
+		model_enum        = NaN; %enum for field that is modeled
+		observation      = NaN; %observed field that we compare the model against
+		observation_enum = NaN; %enum for observed field.
+		timeinterpolation = '';
+		weights           = NaN; %weight coefficients for every vertex
+		weights_enum      = NaN; %enum to identify this particular set of weights
+	end
+	
+	methods
+		function obj = misfit(varargin) % {{{
+			if nargin==0,
+				obj=setdefaultparameters(obj);
+			else
+				%use provided options to change fields
+				options=pairoptions(varargin{:});
+
+				%get name
+				obj.name=getfieldvalue(options,'name','');
+				obj.model_enum=getfieldvalue(options,'model_enum');
+				obj.observation=getfieldvalue(options,'observation',NaN);
+				obj.observation_enum=getfieldvalue(options,'observation_enum');
+				obj.timeinterpolation=getfieldvalue(options,'timeinterpolation','nearestneighbor');
+				obj.weights=getfieldvalue(options,'weights',NaN);
+				obj.weights_enum=getfieldvalue(options,'weights_enum',NaN);
+
+			end
+		end % }}}
+		function obj = setdefaultparameters(obj) % {{{
+			obj.timeinterpolation='nearestneighbor';
+		end % }}}
+		function md = checkconsistency(obj,md,solution,analyses) % {{{
+
+			if ~ischar(obj.name),
+				error('misfit error message: ''name'' field should be a string!');
+			end
+
+			if ~ischar(obj.timeinterpolation),
+				error('misfit error message: ''timeinterpolation'' field should be a string!');
+			end
+			md = checkfield(md,'fieldname','obj.observation','field',obj.observation,'forcing',1,'NaN',1);
+			md = checkfield(md,'fieldname','obj.timeinterpolation','field',obj.timeinterpolation,'values',{'nearestneighbor'});
+			md = checkfield(md,'fieldname','obj.weights','field',obj.weights,'size',[md.mesh.numberofvertices 1],'>=',0,'<=',1);
+
+		end % }}}
+		function md = disp(obj) % {{{
+		
+			disp(sprintf('   Misfit:\n'));
+
+			fielddisplay(obj,'name','identifier for this misfit response');
+			fielddisplay(obj,'model_enum','enum for field that is modeled');
+			fielddisplay(obj,'observation','observed field that we compare the model against');
+			fielddisplay(obj,'observation_enum','observation enum');
+			fielddisplay(obj,'timeinterpolation','interpolation routine used to interpolate misfit between two time steps (default is ''nearestneighbor''');
+			fielddisplay(obj,'weights','weights (at vertices) to apply to the misfit');
+			fielddisplay(obj,'weights_enum','enum for weights for identification purposes');
+
+		end % }}}
+		function md = marshall(obj,md,fid) % {{{
+
+		WriteData(fid,'object',obj,'fieldname','name','format','String');
+		WriteData(fid,'object',obj,'fieldname','model_enum','format','Integer');
+		WriteData(fid,'object',obj,'fieldname','observation','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+		WriteData(fid,'object',obj,'fieldname','observation_enum','format','Integer');
+		WriteData(fid,'object',obj,'fieldname','timeinterpolation','format','String');
+		WriteData(fid,'object',obj,'fieldname','weights','format','DoubleMat','mattype',1);
+		WriteData(fid,'object',obj,'fieldname','weights_enum','format','Integer');
+
+		end % }}}
+	end
+end
Index: /issm/trunk-jpl/src/m/enum/EnumDefinitions.py
===================================================================
--- /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 16786)
+++ /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 16787)
@@ -532,8 +532,12 @@
 def MassfluxatgateSegmentsEnum(): return StringToEnum("MassfluxatgateSegments")[0]
 def MisfitNameEnum(): return StringToEnum("MisfitName")[0]
-def MisfitModelEnum(): return StringToEnum("MisfitModel")[0]
-def MisfitObservationsEnum(): return StringToEnum("MisfitObservations")[0]
+def MisfitModelEnumEnum(): return StringToEnum("MisfitModelEnum")[0]
+def MisfitObservationEnum(): return StringToEnum("MisfitObservation")[0]
+def MisfitObservationEnumEnum(): return StringToEnum("MisfitObservationEnum")[0]
 def MisfitTimeinterpolationEnum(): return StringToEnum("MisfitTimeinterpolation")[0]
 def MisfitWeightsEnum(): return StringToEnum("MisfitWeights")[0]
+def MisfitWeightsEnumEnum(): return StringToEnum("MisfitWeightsEnum")[0]
+def SurfaceObservationEnum(): return StringToEnum("SurfaceObservation")[0]
+def WeightsSurfaceObservationEnum(): return StringToEnum("WeightsSurfaceObservation")[0]
 def MinVelEnum(): return StringToEnum("MinVel")[0]
 def MaxVelEnum(): return StringToEnum("MaxVel")[0]
Index: sm/trunk-jpl/src/m/enum/MisfitModelEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/MisfitModelEnum.m	(revision 16786)
+++ 	(revision )
@@ -1,11 +1,0 @@
-function macro=MisfitModelEnum()
-%MISFITMODELENUM - Enum of MisfitModel
-%
-%   WARNING: DO NOT MODIFY THIS FILE
-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
-%            Please read src/c/shared/Enum/README for more information
-%
-%   Usage:
-%      macro=MisfitModelEnum()
-
-macro=StringToEnum('MisfitModel');
Index: /issm/trunk-jpl/src/m/enum/MisfitModelEnumEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/MisfitModelEnumEnum.m	(revision 16787)
+++ /issm/trunk-jpl/src/m/enum/MisfitModelEnumEnum.m	(revision 16787)
@@ -0,0 +1,11 @@
+function macro=MisfitModelEnumEnum()
+%MISFITMODELENUMENUM - Enum of MisfitModel
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=MisfitModelEnumEnum()
+
+macro=StringToEnum('MisfitModel');
Index: /issm/trunk-jpl/src/m/enum/MisfitObservationEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/MisfitObservationEnum.m	(revision 16787)
+++ /issm/trunk-jpl/src/m/enum/MisfitObservationEnum.m	(revision 16787)
@@ -0,0 +1,11 @@
+function macro=MisfitObservationEnum()
+%MISFITOBSERVATIONENUM - Enum of MisfitObservation
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=MisfitObservationEnum()
+
+macro=StringToEnum('MisfitObservation');
Index: /issm/trunk-jpl/src/m/enum/MisfitObservationEnumEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/MisfitObservationEnumEnum.m	(revision 16787)
+++ /issm/trunk-jpl/src/m/enum/MisfitObservationEnumEnum.m	(revision 16787)
@@ -0,0 +1,11 @@
+function macro=MisfitObservationEnumEnum()
+%MISFITOBSERVATIONENUMENUM - Enum of MisfitObservation
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=MisfitObservationEnumEnum()
+
+macro=StringToEnum('MisfitObservation');
Index: sm/trunk-jpl/src/m/enum/MisfitObservationsEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/MisfitObservationsEnum.m	(revision 16786)
+++ 	(revision )
@@ -1,11 +1,0 @@
-function macro=MisfitObservationsEnum()
-%MISFITOBSERVATIONSENUM - Enum of MisfitObservations
-%
-%   WARNING: DO NOT MODIFY THIS FILE
-%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
-%            Please read src/c/shared/Enum/README for more information
-%
-%   Usage:
-%      macro=MisfitObservationsEnum()
-
-macro=StringToEnum('MisfitObservations');
Index: /issm/trunk-jpl/src/m/enum/MisfitWeightsEnumEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/MisfitWeightsEnumEnum.m	(revision 16787)
+++ /issm/trunk-jpl/src/m/enum/MisfitWeightsEnumEnum.m	(revision 16787)
@@ -0,0 +1,11 @@
+function macro=MisfitWeightsEnumEnum()
+%MISFITWEIGHTSENUMENUM - Enum of MisfitWeights
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=MisfitWeightsEnumEnum()
+
+macro=StringToEnum('MisfitWeights');
Index: /issm/trunk-jpl/src/m/enum/SurfaceObservationEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/SurfaceObservationEnum.m	(revision 16787)
+++ /issm/trunk-jpl/src/m/enum/SurfaceObservationEnum.m	(revision 16787)
@@ -0,0 +1,11 @@
+function macro=SurfaceObservationEnum()
+%SURFACEOBSERVATIONENUM - Enum of SurfaceObservation
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=SurfaceObservationEnum()
+
+macro=StringToEnum('SurfaceObservation');
Index: /issm/trunk-jpl/src/m/enum/WeightsSurfaceObservationEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/WeightsSurfaceObservationEnum.m	(revision 16787)
+++ /issm/trunk-jpl/src/m/enum/WeightsSurfaceObservationEnum.m	(revision 16787)
@@ -0,0 +1,11 @@
+function macro=WeightsSurfaceObservationEnum()
+%WEIGHTSSURFACEOBSERVATIONENUM - Enum of WeightsSurfaceObservation
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=WeightsSurfaceObservationEnum()
+
+macro=StringToEnum('WeightsSurfaceObservation');
