Index: /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp	(revision 25539)
@@ -66,6 +66,6 @@
 
    /*First, reset all F to 0 */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element*       element = xDynamicCast<Element*>(object);
 		element->SetElementInput(inputs,DamageFEnum,0.);
 	}
@@ -150,5 +150,5 @@
 	IssmDouble principalDevStress1, principalDevStress2;
 	IssmDouble tensileStress, compressiveStress;
-	
+
 	int equivstress, domaintype, dim;
 
@@ -197,5 +197,5 @@
 	for (int i=0;i<numnodes;i++){
 		f[i] = 0;
-		
+
 		gauss->GaussNode(element->GetElementType(),i);
 
@@ -566,5 +566,5 @@
 						Ke->values[i*numnodes+j] += (
 									dbasis[0*numnodes+i] *(D[0*dim+0]*dbasis[0*numnodes+j] + D[0*dim+1]*dbasis[1*numnodes+j]) +
-									dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j]) 
+									dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j])
 									);
 					}
@@ -586,5 +586,5 @@
 									dbasis[0*numnodes+i] *(D[0*dim+0]*dbasis[0*numnodes+j] + D[0*dim+1]*dbasis[1*numnodes+j] + D[0*dim+2]*dbasis[2*numnodes+j]) +
 									dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j] + D[1*dim+2]*dbasis[2*numnodes+j]) +
-									dbasis[2*numnodes+i] *(D[2*dim+0]*dbasis[0*numnodes+j] + D[2*dim+1]*dbasis[1*numnodes+j] + D[2*dim+2]*dbasis[2*numnodes+j]) 
+									dbasis[2*numnodes+i] *(D[2*dim+0]*dbasis[0*numnodes+j] + D[2*dim+1]*dbasis[1*numnodes+j] + D[2*dim+2]*dbasis[2*numnodes+j])
 									);
 					}
@@ -816,6 +816,6 @@
 
 	/*Create and assemble matrix*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element*       element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element*       element = xDynamicCast<Element*>(object);
 		ElementMatrix* Ke     = this->CreateFctKMatrix(element);
 		if(Ke) Ke->AddToGlobal(Kff,Kfs);
@@ -841,6 +841,6 @@
 
 	/*Create and assemble matrix*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element*       element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element*       element = xDynamicCast<Element*>(object);
 		ElementMatrix* MLe     = this->CreateMassMatrix(element);
 		if(MLe){
Index: /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 25539)
@@ -301,5 +301,5 @@
 	if(frictionlaw==9){
 		parameters->AddObject(iomodel->CopyConstantObject("md.friction.gamma",FrictionGammaEnum));
-		parameters->AddObject(iomodel->CopyConstantObject("md.friction.effective_pressure_limit",FrictionEffectivePressureLimitEnum));		
+		parameters->AddObject(iomodel->CopyConstantObject("md.friction.effective_pressure_limit",FrictionEffectivePressureLimitEnum));
 		parameters->AddObject(new IntParam(FrictionCouplingEnum,0));
 	}
@@ -355,6 +355,6 @@
 void           EnthalpyAnalysis::ComputeBasalMeltingrate(FemModel* femmodel){/*{{{*/
 	/*Compute basal melting rates: */
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		ComputeBasalMeltingrate(element);
 	}
@@ -434,5 +434,5 @@
 
 	IssmDouble watercolumnupperlimit = element->FindParam(ThermalWatercolumnUpperlimitEnum);
-	
+
 	Gauss* gauss=element->NewGauss();
 	for(is=0;is<numsegments;is++){
@@ -580,5 +580,5 @@
 	IssmDouble  h,hx,hy,hz,vx,vy,vz;
 	IssmDouble  tau_parameter,diameter;
-	IssmDouble  tau_parameter_anisotropic[2],tau_parameter_hor,tau_parameter_ver;	
+	IssmDouble  tau_parameter_anisotropic[2],tau_parameter_hor,tau_parameter_ver;
 	IssmDouble  D_scalar;
 	IssmDouble* xyz_list = NULL;
@@ -670,5 +670,5 @@
 								dbasis[0*numnodes+i] *(K[0][0]*dbasis[0*numnodes+j] + K[0][1]*dbasis[1*numnodes+j]+ K[0][2]*dbasis[2*numnodes+j]) +
 								dbasis[1*numnodes+i] *(K[1][0]*dbasis[0*numnodes+j] + K[1][1]*dbasis[1*numnodes+j]+ K[1][2]*dbasis[2*numnodes+j]) +
-								dbasis[2*numnodes+i] *(K[2][0]*dbasis[0*numnodes+j] + K[2][1]*dbasis[1*numnodes+j]+ K[2][2]*dbasis[2*numnodes+j]) 
+								dbasis[2*numnodes+i] *(K[2][0]*dbasis[0*numnodes+j] + K[2][1]*dbasis[1*numnodes+j]+ K[2][2]*dbasis[2*numnodes+j])
 								);
 				}
@@ -678,5 +678,5 @@
 		else if(stabilization==2){
 			element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
-			diameter=element->MinEdgeLength(xyz_list);			
+			diameter=element->MinEdgeLength(xyz_list);
 			tau_parameter=element->StabilizationParameter(u-um,v-vm,w-wm,diameter,kappa/rho_ice);
 			for(int i=0;i<numnodes;i++){
@@ -699,5 +699,5 @@
 		else if(stabilization==3){
 			element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
-			element->ElementSizes(&hx,&hy,&hz);                      
+			element->ElementSizes(&hx,&hy,&hz);
 			element->StabilizationParameterAnisotropic(&tau_parameter_anisotropic[0],u-um,v-vm,w-wm,hx,hy,hz,kappa/rho_ice);
 			tau_parameter_hor=tau_parameter_anisotropic[0];
@@ -873,5 +873,5 @@
 			for(i=0;i<numnodes;i++) pe->values[i]+=scalar_transient*basis[i];
 		}
-		
+
 		/* SUPG */
 		if(stabilization==2){
@@ -1074,5 +1074,5 @@
 void				EnthalpyAnalysis::ComputeWaterfractionDrainage(FemModel* femmodel){/*{{{*/
 
-	int i,k,numnodes;
+	int k,numnodes;
 	IssmDouble dt;
 	Element* element= NULL;
@@ -1080,6 +1080,6 @@
 	femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
 
-	for(i=0;i<femmodel->elements->Size();i++){
-		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		element=xDynamicCast<Element*>(object);
 		numnodes=element->GetNumberOfNodes();
 		IssmDouble* waterfractions= xNew<IssmDouble>(numnodes);
@@ -1099,5 +1099,5 @@
 void				EnthalpyAnalysis::DrainageUpdateWatercolumn(FemModel* femmodel){/*{{{*/
 
-	int i,k,numnodes, numbasalnodes;
+	int k,numnodes, numbasalnodes;
 	IssmDouble dt;
 	int* basalnodeindices=NULL;
@@ -1113,6 +1113,6 @@
 	extrudefrombase_core(femmodel);
 	/*multiply depth-average by ice thickness*/
-	for(i=0;i<femmodel->elements->Size();i++){
-		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		element=xDynamicCast<Element*>(object);
 		numnodes=element->GetNumberOfNodes();
 		IssmDouble* drainage_int= xNew<IssmDouble>(numnodes);
@@ -1132,6 +1132,6 @@
 
 	/*update water column*/
-	for(i=0;i<femmodel->elements->Size();i++){
-		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		element=xDynamicCast<Element*>(object);
 		/* Check if ice in element */
 		if(!element->IsIceInElement()) continue;
@@ -1158,11 +1158,11 @@
 void				EnthalpyAnalysis::DrainageUpdateEnthalpy(FemModel* femmodel){/*{{{*/
 
-	int i,k,numnodes;
+	int k,numnodes;
 	IssmDouble dt;
 	Element* element= NULL;
 	femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
 
-	for(i=0;i<femmodel->elements->Size();i++){
-		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		element=xDynamicCast<Element*>(object);
 		numnodes=element->GetNumberOfNodes();
 		IssmDouble* enthalpies= xNew<IssmDouble>(numnodes);
@@ -1182,5 +1182,5 @@
 			else
 				waterfractions[k]-=dt*drainage[k];
-			
+
 			element->ThermalToEnthalpy(&enthalpies[k], temperatures[k], waterfractions[k], pressures[k]);
 		}
@@ -1608,7 +1608,7 @@
 				}
 			case LliboutryDuvalEnum:{
-				for(i=0;i<numnodes;i++) B[i]=LliboutryDuval(values[i],pressure[i],n[i],element->FindParam(MaterialsBetaEnum),element->FindParam(ConstantsReferencetemperatureEnum),element->FindParam(MaterialsHeatcapacityEnum),element->FindParam(MaterialsLatentheatEnum)); 
-				element->AddInput(MaterialsRheologyBEnum,&B[0],finite_element); 
-				break; 
+				for(i=0;i<numnodes;i++) B[i]=LliboutryDuval(values[i],pressure[i],n[i],element->FindParam(MaterialsBetaEnum),element->FindParam(ConstantsReferencetemperatureEnum),element->FindParam(MaterialsHeatcapacityEnum),element->FindParam(MaterialsLatentheatEnum));
+				element->AddInput(MaterialsRheologyBEnum,&B[0],finite_element);
+				break;
 				}
 			default: _error_("Rheology law " << EnumToStringx(rheology_law) << " not supported yet");
@@ -1670,6 +1670,6 @@
 	spc=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes());
 	/*First create a vector to figure out what elements should be constrained*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		GetBasalConstraints(spc,element);
 	}
@@ -1681,6 +1681,6 @@
 
 	/*Then update basal constraints nodes accordingly*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		ApplyBasalConstraints(serial_spc,element);
 	}
Index: /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp	(revision 25539)
@@ -291,6 +291,6 @@
 void           ExtrapolationAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		this->SetConstraintsOnIce(element);
 	}
Index: /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp	(revision 25539)
@@ -357,7 +357,7 @@
 	IssmDouble phi,isonbase,base;
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+
+		Element* element=xDynamicCast<Element*>(object);
 		if(!element->IsOnBase()) continue;
 
Index: /issm/trunk-jpl/src/c/analyses/GLheightadvectionAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/GLheightadvectionAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/GLheightadvectionAnalysis.cpp	(revision 25539)
@@ -208,6 +208,6 @@
 
 	/*Constrain all nodes that are grounded and unconstrain the ones that float*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element    *element  = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element    *element  = xDynamicCast<Element*>(object);
 		int         numnodes  = element->GetNumberOfNodes();
 		IssmDouble *mask      = xNew<IssmDouble>(numnodes);
Index: /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp	(revision 25539)
@@ -536,15 +536,33 @@
 void HydrologyDCEfficientAnalysis::ComputeEPLThickness(FemModel* femmodel){/*{{{*/
 
-	bool        active_element;
-	int         iseplthickcomp;
-	int         domaintype;
-
-	femmodel->parameters->FindParam(&domaintype,DomainTypeEnum);
+	int iseplthickcomp;
+
+
+	/*Skip if we don't want to compute thicknesses*/
 	femmodel->parameters->FindParam(&iseplthickcomp,HydrologydcEplThickCompEnum);
 	if(iseplthickcomp==0) return;
 
-	for(int j=0;j<femmodel->elements->Size();j++){
-
-		Element* element=(Element*)femmodel->elements->GetObjectByOffset(j);
+	/*Get Parameters*/
+	int        domaintype;
+	IssmDouble max_thick;
+	IssmDouble epl_conductivity;
+	IssmDouble latentheat;
+	IssmDouble rho_ice;
+	IssmDouble rho_water;
+	IssmDouble gravity;
+	IssmDouble dt;
+
+	femmodel->parameters->FindParam(&domaintype,DomainTypeEnum);
+	femmodel->parameters->FindParam(&max_thick,HydrologydcEplMaxThicknessEnum);
+	femmodel->parameters->FindParam(&epl_conductivity,HydrologydcEplConductivityEnum);
+	femmodel->parameters->FindParam(&latentheat,MaterialsLatentheatEnum);
+	femmodel->parameters->FindParam(&rho_ice,MaterialsRhoIceEnum);
+	femmodel->parameters->FindParam(&rho_water,MaterialsRhoFreshwaterEnum);
+	femmodel->parameters->FindParam(&gravity,ConstantsGEnum);
+	femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
+
+
+	for(Object* & object : femmodel->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 
 		/*skip element if 3d and not on base*/
@@ -562,15 +580,7 @@
 		IssmDouble* bed           = xNew<IssmDouble>(numnodes);
 
+		bool       active_element;
+		IssmDouble init_thick;
 		element->GetInputValue(&active_element,HydrologydcMaskEplactiveEltEnum);
-
-		/*parameters*/
-		IssmDouble gravity;
-		IssmDouble rho_water;
-		IssmDouble rho_ice;
-		IssmDouble latentheat;
-		IssmDouble epl_conductivity;
-		IssmDouble init_thick;
-		IssmDouble max_thick;
-		IssmDouble dt;
 
 		/* Intermiedaries */
@@ -593,13 +603,4 @@
 				default: _error_("not Implemented Yet");
 			}
-
-			element->FindParam(&max_thick,HydrologydcEplMaxThicknessEnum);
-			element->FindParam(&epl_conductivity,HydrologydcEplConductivityEnum);
-			element->FindParam(&latentheat,MaterialsLatentheatEnum);
-			element->FindParam(&rho_ice,MaterialsRhoIceEnum);
-			element->FindParam(&rho_water,MaterialsRhoFreshwaterEnum);
-			element->FindParam(&gravity,ConstantsGEnum);
-			element->FindParam(&dt,TimesteppingTimeStepEnum);
-
 			element->GetInputListOnVertices(&eplhead[0],EplHeadSubstepEnum);
 			element->GetInputListOnVertices(&epl_slopeX[0],EplHeadSlopeXEnum);
Index: /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp	(revision 25539)
@@ -451,9 +451,9 @@
 void HydrologyDCInefficientAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
 
-	/*Intermediaries*/
+ 	/*Intermediaries*/
+	bool	 converged;
+	int*     doflist = NULL;
 	int	 domaintype;
 	Element* basalelement=NULL;
-	bool	 converged;
-	int*     doflist = NULL;
 
 	/*Get basal element*/
@@ -482,5 +482,4 @@
 		if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector");
 		if(xIsInf<IssmDouble>(values[i])) _error_("Inf found in solution vector");
-
 	}
 
@@ -689,7 +688,6 @@
 	Element* element=NULL;
 	int      elementssize=femmodel->elements->Size();
-	for(int i=0;i<elementssize;i++){
-		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
-
+	for(Object* & object : femmodel->elements->objects){
+		element = xDynamicCast<Element*>(object);
 		Input* input=element->GetInput(HydrologydcMaskEplactiveNodeEnum); _assert_(input);
 		if(input->GetInputMax()>0.){
@@ -749,6 +747,6 @@
 	Element* element=NULL;
 	int elementssize = femmodel->elements->Size();
-	for(int i=0;i<elementssize;i++){
-		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		element = xDynamicCast<Element*>(object);
 
 		Input* input=element->GetInput(HydrologydcMaskThawedNodeEnum); _assert_(input);
Index: /issm/trunk-jpl/src/c/analyses/HydrologyGlaDSAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyGlaDSAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyGlaDSAnalysis.cpp	(revision 25539)
@@ -456,6 +456,6 @@
 void HydrologyGlaDSAnalysis::UpdateSheetThickness(FemModel* femmodel){/*{{{*/
 
-	for(int j=0;j<femmodel->elements->Size();j++){
-		Element* element=(Element*)femmodel->elements->GetObjectByOffset(j);
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		UpdateSheetThickness(element);
 	}
@@ -545,6 +545,6 @@
 void HydrologyGlaDSAnalysis::UpdateEffectivePressure(FemModel* femmodel){/*{{{*/
 
-	for(int j=0;j<femmodel->elements->Size();j++){
-		Element* element=(Element*)femmodel->elements->GetObjectByOffset(j);
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		UpdateEffectivePressure(element);
 	}
Index: /issm/trunk-jpl/src/c/analyses/HydrologyPismAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyPismAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyPismAnalysis.cpp	(revision 25539)
@@ -92,6 +92,6 @@
 void HydrologyPismAnalysis::UpdateWaterColumn(FemModel* femmodel){/*{{{*/
 
-	for(int j=0;j<femmodel->elements->Size();j++){
-		Element* element=(Element*)femmodel->elements->GetObjectByOffset(j);
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		this->UpdateWaterColumn(element);
 	}
Index: /issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.cpp	(revision 25539)
@@ -455,6 +455,6 @@
 void HydrologyShaktiAnalysis::UpdateGapHeight(FemModel* femmodel){/*{{{*/
 
-	for(int j=0;j<femmodel->elements->Size();j++){
-		Element* element=(Element*)femmodel->elements->GetObjectByOffset(j);
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		UpdateGapHeight(element);
 	}
Index: /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 25539)
@@ -653,6 +653,6 @@
 
 		/*Loop over all elements of this partition*/
-		for(int i=0;i<femmodel->elements->Size();i++){
-			Element* element  = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		for(Object* & object : femmodel->elements->objects){
+			Element* element  = xDynamicCast<Element*>(object);
 
 			int      numnodes = element->GetNumberOfNodes();
@@ -690,6 +690,6 @@
 
 		/*Loop over all elements of this partition*/
-		for(int i=0;i<femmodel->elements->Size();i++){
-			Element* element  = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		for(Object* & object : femmodel->elements->objects){
+			Element* element  = xDynamicCast<Element*>(object);
 
 			rho_ice = element->FindParam(MaterialsRhoIceEnum);
@@ -739,6 +739,6 @@
 		vec_constraint_nodes=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes());
 
-		for(int i=0;i<femmodel->elements->Size();i++){
-			Element* element               = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		for(Object* & object : femmodel->elements->objects){
+			Element* element               = xDynamicCast<Element*>(object);
 			int      numnodes              = element->GetNumberOfNodes();
 			Gauss*   gauss                 = element->NewGauss();
@@ -777,6 +777,6 @@
 		while(nflipped){
 			local_nflipped=0;
-			for(int i=0;i<femmodel->elements->Size();i++){
-				Element* element                = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+			for(Object* & object : femmodel->elements->objects){
+				Element* element                = xDynamicCast<Element*>(object);
 				int      numnodes               = element->GetNumberOfNodes();
 				Gauss*   gauss                  = element->NewGauss();
@@ -831,6 +831,6 @@
 
 		/*Contrain the nodes that will be calved*/
-		for(int i=0;i<femmodel->elements->Size();i++){
-			Element* element  = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		for(Object* & object : femmodel->elements->objects){
+			Element* element  = xDynamicCast<Element*>(object);
 			int      numnodes = element->GetNumberOfNodes();
 			Gauss*   gauss    = element->NewGauss();
Index: /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 25539)
@@ -189,6 +189,6 @@
 			iomodel->FetchData(&array3d,&Ms,&Ns,&K,"md.basalforcings.tf");
 			if(!array3d) _error_("md.basalforcings.tf not found in binary file");
-			for(int i=0;i<elements->Size();i++){
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+			for(Object* & object : elements->objects){
+				Element*       element = xDynamicCast<Element*>(object);
 				if(iomodel->domaintype!=Domain2DhorizontalEnum && !element->IsOnBase()) continue;
 				for(int kk=0;kk<K;kk++){
@@ -418,5 +418,5 @@
 						Ke->values[i*numnodes+j] += (
 									dbasis[0*numnodes+i] *(D[0*dim+0]*dbasis[0*numnodes+j] + D[0*dim+1]*dbasis[1*numnodes+j]) +
-									dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j]) 
+									dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j])
 									);
 					}
@@ -444,5 +444,5 @@
 			for(int i=0;i<numnodes;i++){
 				for(int j=0;j<numnodes;j++){
-					Ke->values[i*numnodes+j]+=gauss->weight*Jdet*tau*basis[j]*(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i]);	
+					Ke->values[i*numnodes+j]+=gauss->weight*Jdet*tau*basis[j]*(vx*dbasis[0*numnodes+i]+vy*dbasis[1*numnodes+i]);
 				}
 			}
@@ -450,8 +450,8 @@
 			for(int i=0;i<numnodes;i++){
 				for(int j=0;j<numnodes;j++){
-					Ke->values[i*numnodes+j]+=gauss->weight*Jdet*tau*basis[j]*(basis[i]*dvxdx+basis[i]*dvydy);	
-				}
-			}
-			
+					Ke->values[i*numnodes+j]+=gauss->weight*Jdet*tau*basis[j]*(basis[i]*dvxdx+basis[i]*dvydy);
+				}
+			}
+
 			/*Advection matrix - part 2, A*/
 			for(int i=0;i<numnodes;i++){
@@ -476,5 +476,5 @@
 			for(int i=0;i<numnodes;i++){
             for(int j=0;j<numnodes;j++){
-					Ke->values[i*numnodes+j]+=dt*gauss->weight*Jdet*tau*(basis[j]*dvxdx+basis[j]*dvydy)*(basis[i]*dvxdx+basis[i]*dvydy);	
+					Ke->values[i*numnodes+j]+=dt*gauss->weight*Jdet*tau*(basis[j]*dvxdx+basis[j]*dvydy)*(basis[i]*dvxdx+basis[i]*dvydy);
 				}
 			}
@@ -600,5 +600,5 @@
 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
 	}
-	  
+
 	/*Fetch number of nodes and dof for this finite element*/
 	int numnodes = element->GetNumberOfNodes();
@@ -626,7 +626,7 @@
 //		_error_("S");
 //	}
-	
+
 	h=element->CharacteristicLength();
-	
+
 	/*Recover portion of element that is grounded*/
 	phi=element->GetGroundedPortion(xyz_list);
@@ -670,5 +670,5 @@
 
 		for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(thickness+dt*(ms-mb))*basis[i];
-	
+
 		if(stabilization==5){ //SUPG
 			element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
@@ -683,5 +683,5 @@
 			xi=1;
 			tau=xi*h/(2*vel);
-			
+
 			/*Force vector - part 2*/
 			for(int i=0;i<numnodes;i++){
@@ -693,5 +693,5 @@
 			}
 		}
-	
+
 	}
 
@@ -806,5 +806,5 @@
 	for(int i=0;i<numnodes;i++){
 		newthickness[i]=solution[doflist[i]];
-		thicknessresidual[i]=0.;	
+		thicknessresidual[i]=0.;
 		/*Check solution*/
 		if(xIsNan<IssmDouble>(newthickness[i])) _error_("NaN found in solution vector");
@@ -817,5 +817,5 @@
 	element->AddBasalInput(ThicknessEnum,newthickness,element->GetElementType());
 	element->AddBasalInput(ThicknessResidualEnum,thicknessresidual,element->GetElementType());
-	
+
 	xDelete<int>(doflist);
 	xDelete<IssmDouble>(newthickness);
@@ -1042,5 +1042,5 @@
 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
 	}
-	  
+
 	/*Fetch number of nodes and dof for this finite element*/
 	int numnodes = element->GetNumberOfNodes();
@@ -1061,5 +1061,5 @@
 	Input* vxaverage_input  = element->GetInput(VxAverageEnum);										_assert_(vxaverage_input);
 	Input* vyaverage_input  = element->GetInput(VyAverageEnum);										_assert_(vyaverage_input);
-	
+
 	/*Recover portion of element that is grounded*/
 	phi=element->GetGroundedPortion(xyz_list);
@@ -1102,5 +1102,5 @@
 
 		for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(ms-mb)*basis[i];
-	
+
 	}
 
@@ -1122,6 +1122,6 @@
 
 	/*Create and assemble matrix*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element*       element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element*       element = xDynamicCast<Element*>(object);
 		ElementMatrix* Ke     = this->CreateFctKMatrix(element);
 		if(Ke) Ke->AddToGlobal(Kff,Kfs);
@@ -1149,6 +1149,6 @@
 
 	/*Create and assemble matrix*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element*       element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element*       element = xDynamicCast<Element*>(object);
 		ElementVector* pe      = this->CreateFctPVector(element);
 		if(pe) pe->AddToGlobal(pf);
@@ -1167,6 +1167,6 @@
 
 	/*Create and assemble matrix*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element*       element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element*       element = xDynamicCast<Element*>(object);
 		ElementMatrix* MLe     = this->CreateMassMatrix(element);
 		if(MLe){
Index: /issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.cpp	(revision 25539)
@@ -65,6 +65,6 @@
 		
 			
-		for(int i=0;i<elements->Size();i++){
-			Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+		for(Object* & object : elements->objects){
+			Element* element=xDynamicCast<Element*>(object);
 
 			for(int t=0;t<N;t++){
@@ -113,6 +113,6 @@
 			TransientInput* transientinput=inputs->SetDatasetTransientInput(DslGlobalAverageThermostericSeaLevelChangeEnum,i, times,N);
 			
-			for(int j=0;j<elements->Size();j++){
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
+			for(Object* & object : elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
 
 				for(int t=0;t<N;t++){
Index: /issm/trunk-jpl/src/c/analyses/SmbAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SmbAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/SmbAnalysis.cpp	(revision 25539)
@@ -129,6 +129,6 @@
 					int* ids = xNew<int>(N); for(int i=0;i<N;i++) ids[i] = i;
 
-					for(int i=0;i<elements->Size();i++){
-						Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+					for(Object* & object : elements->objects){
+						Element* element=xDynamicCast<Element*>(object);
 						element->DatasetInputCreate(doublearray,M-1,N,ids,N,inputs,iomodel,SmbTemperaturesReconstructedEnum);
 					}
@@ -147,6 +147,6 @@
 					int* ids = xNew<int>(N); for(int i=0;i<N;i++) ids[i] = i;
 
-					for(int i=0;i<elements->Size();i++){
-						Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+					for(Object* & object : elements->objects){
+						Element* element=xDynamicCast<Element*>(object);
 						element->DatasetInputCreate(doublearray,M-1,N,ids,N,inputs,iomodel,SmbPrecipitationsReconstructedEnum);
 					}
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 25539)
@@ -5892,6 +5892,6 @@
 	parameters->FindParam(&dim,DomainDimensionEnum);
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 
 		/*Get inputs and parameters*/
@@ -6064,6 +6064,6 @@
 	else       tausize = 6;
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 
 		/*Get inputs and parameters*/
@@ -6276,6 +6276,6 @@
 	else       tausize = 6;
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 
 		/*Get inputs and parameters*/
Index: /issm/trunk-jpl/src/c/classes/Cfdragcoeffabsgrad.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Cfdragcoeffabsgrad.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/classes/Cfdragcoeffabsgrad.cpp	(revision 25539)
@@ -99,6 +99,6 @@
 	IssmDouble J_sum=0.;
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		J+=this->Cfdragcoeffabsgrad_Calculation(element,weights_enum);
 	}
Index: /issm/trunk-jpl/src/c/classes/Cfsurfacelogvel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Cfsurfacelogvel.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/classes/Cfsurfacelogvel.cpp	(revision 25539)
@@ -104,6 +104,6 @@
 	IssmDouble J_sum=0.;
 	if(this->datatime<=time && !timepassedflag){
-		for(int i=0;i<femmodel->elements->Size();i++){
-			Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
+		for(Object* & object : femmodel->elements->objects){
+			Element* element=xDynamicCast<Element*>(object);
 			J+=this->Cfsurfacelogvel_Calculation(element,definitionenum);
 		}
Index: /issm/trunk-jpl/src/c/classes/Cfsurfacesquare.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Cfsurfacesquare.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/classes/Cfsurfacesquare.cpp	(revision 25539)
@@ -113,6 +113,6 @@
 
 	 if(datatime<=time && !timepassedflag){
-		 for(int i=0;i<femmodel->elements->Size();i++){
-			 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
+		 for(Object* & object : femmodel->elements->objects){
+			 Element* element=xDynamicCast<Element*>(object);
 			 J+=this->Cfsurfacesquare_Calculation(element,model_enum,observation_enum,weights_enum);
 		 }
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 25539)
@@ -3400,5 +3400,4 @@
 	/*Intermediaries*/
 	const int numnodes = this->GetNumberOfNodes();
-
 	/*Output */
 	int d_nz = 0;
Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 25539)
@@ -110,6 +110,6 @@
 		for(int i=0;i<this->nummodels;i++) if(this->analysis_type_list[i]==StressbalanceAnalysisEnum){analysis_counter=i;break;}
 		if(analysis_counter==-1) _error_("Could not find alias for analysis_type StressbalanceAnalysisEnum in list of FemModel analyses\n");
-		for(int i=0;i<this->elements->Size();i++){
-			Element* element	= xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+		for(Object* & object : this->elements->objects){
+			Element* element = xDynamicCast<Element*>(object);
 			element_type		= element->element_type_list[analysis_counter];
 			if(element_type!=P1Enum) _error_("Element type "<<EnumToStringx(element_type)<<" not supported with AMR yet!\n");
@@ -980,4 +980,12 @@
 		if(profiler->Used(MPISERIAL)) _printf0_("   "<<setw(40)<<left<<"MPISERIAL elapsed time:"<<setw(7)<<setprecision(6)<<profiler->TotalTime(MPISERIAL) << " sec\n");
 
+		if(profiler->Used(SEDLOOP)) _printf0_("   "<<setw(40)<<left<<"SedimentLoop elapsed time:"<<setw(7)<<setprecision(6)<<profiler->TotalTime(SEDLOOP) << " sec\n");
+		if(profiler->Used(SEDMatrix)) _printf0_("   "<<setw(40)<<left<<"SedimentMatrix elapsed time:"<<setw(7)<<setprecision(6)<<profiler->TotalTime(SEDMatrix) << " sec\n");
+		if(profiler->Used(SEDUpdate)) _printf0_("   "<<setw(40)<<left<<"SedimentUpdate elapsed time:"<<setw(7)<<setprecision(6)<<profiler->TotalTime(SEDUpdate) << " sec\n");
+		if(profiler->Used(EPLLOOP)) _printf0_("   "<<setw(40)<<left<<"EplLoop elapsed time:"<<setw(7)<<setprecision(6)<<profiler->TotalTime(EPLLOOP) << " sec\n");
+		if(profiler->Used(EPLMasking)) _printf0_("   "<<setw(40)<<left<<"EPL masking elapsed time:"<<setw(7)<<setprecision(6)<<profiler->TotalTime(EPLMasking) << " sec\n");
+		if(profiler->Used(EPLMatrices)) _printf0_("   "<<setw(40)<<left<<"EPLMatrices elapsed time:"<<setw(7)<<setprecision(6)<<profiler->TotalTime(EPLMatrices) << " sec\n");
+		if(profiler->Used(EPLUpdate)) _printf0_("   "<<setw(40)<<left<<"EPLUpdate elapsed time:"<<setw(7)<<setprecision(6)<<profiler->TotalTime(EPLUpdate) << " sec\n");
+
 		/*Add to results: */
 		results->AddObject(new GenericExternalResult<IssmDouble>(results->Size()+1, ProfilingSolutionTimeEnum,  solution_time));
@@ -1013,6 +1021,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 
 		/*If on water, return 0: */
@@ -1069,6 +1077,6 @@
 void FemModel::CalvingRateVonmisesx(){/*{{{*/
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		element->CalvingRateVonmises();
 	}
@@ -1077,6 +1085,6 @@
 void FemModel::CalvingRateLevermannx(){/*{{{*/
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		element->CalvingRateLevermann();
 	}
@@ -1085,6 +1093,6 @@
 void FemModel::CalvingFluxLevelsetx(){/*{{{*/
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		element->CalvingFluxLevelset();
 	}
@@ -1093,6 +1101,6 @@
 void FemModel::CalvingMeltingFluxLevelsetx(){/*{{{*/
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		element->CalvingMeltingFluxLevelset();
 	}
@@ -1134,6 +1142,6 @@
 void FemModel::DeviatoricStressx(){/*{{{*/
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		element->ComputeDeviatoricStressTensor();
 	}
@@ -1153,6 +1161,6 @@
 	 * segments we have (corresopnding to field = value)*/
 	DataSet* segments=new DataSet();
-	for(int i=0;i<elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		if(!element->IsOnBase()) continue;
 		Element* basalelement = element->SpawnBasalElement();
@@ -1192,7 +1200,6 @@
 	IssmDouble  d,xn,yn,dmin;
 	int         last = -1;
-	for(int v=0;v<vertices->Size();v++){
-
-		Vertex* vertex=dynamic_cast<Vertex*>(this->vertices->GetObjectByOffset(v));
+	for(Object* & object : this->vertices->objects){
+      Vertex* vertex= xDynamicCast<Vertex*>(object);
 		IssmDouble x = vertex->x;
 		IssmDouble y = vertex->y;
@@ -1254,6 +1261,6 @@
 	}
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+      Element* element= xDynamicCast<Element*>(object);
 		element->CreateDistanceInputFromSegmentlist(distances,distanceenum);
 	}
@@ -1269,6 +1276,6 @@
 	IssmDouble total_divergence;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+      Element* element= xDynamicCast<Element*>(object);
 		local_divergence+=element->Divergence();
 	}
@@ -1282,6 +1289,6 @@
 void FemModel::ElementOperationx(void (Element::*function)(void)){ /*{{{*/
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+      Element* element= xDynamicCast<Element*>(object);
 		(element->*function)();
 	}
@@ -1303,6 +1310,6 @@
 
 	/*now, go through our elements, and retrieve the one with this id: index: */
-	for(int i=0;i<this->elements->Size();i++){
-		element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+      element= xDynamicCast<Element*>(object);
 		if (element->Id()==index){
 			found=1;
@@ -1334,6 +1341,6 @@
 	IssmDouble total_floating_area;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+      Element* element= xDynamicCast<Element*>(object);
 		local_floating_area+=element->FloatingArea(scaled);
 	}
@@ -1358,6 +1365,6 @@
 	}
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+      Element* element= xDynamicCast<Element*>(object);
 		element->GetInputLocalMinMaxOnNodes(uLmin_local,uLmax_local,ug);
 	}
@@ -1572,6 +1579,6 @@
 	IssmDouble total_grounded_area;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+      Element* element= xDynamicCast<Element*>(object);
 		local_grounded_area+=element->GroundedArea(scaled);
 	}
@@ -1595,6 +1602,6 @@
 		IssmDouble total_icefront_area;
 
-		for(int i=0;i<this->elements->Size();i++){
-			Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+		for(Object* & object : this->elements->objects){
+			Element* element= xDynamicCast<Element*>(object);
 			element->GetInputListOnVertices(BasinId,FrontalForcingsBasinIdEnum);
 			for(int j=0;j<numvertices;j++){
@@ -1621,6 +1628,6 @@
 	IssmDouble total_mass_flux;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element= xDynamicCast<Element*>(object);
 		local_mass_flux+=element->IcefrontMassFlux(scaled);
 	}
@@ -1637,6 +1644,6 @@
 	IssmDouble total_mass_flux;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element= xDynamicCast<Element*>(object);
 		local_mass_flux+=element->IcefrontMassFluxLevelset(scaled);
 	}
@@ -1653,6 +1660,6 @@
 	IssmDouble* P1DGlist = xNew<IssmDouble>(numvertices);
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element= xDynamicCast<Element*>(object);
 		element->GetInputListOnVertices(P1DGlist,enum_in);
 		element->AddInput(DummyEnum,P1DGlist,P1DGEnum);
@@ -1681,6 +1688,6 @@
 	IssmDouble total_mass_flux;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element= xDynamicCast<Element*>(object);
 		local_mass_flux+=element->GroundinglineMassFlux(scaled);
 	}
@@ -1697,6 +1704,6 @@
 	IssmDouble total_ice_mass;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element= xDynamicCast<Element*>(object);
 		local_ice_mass+=element->IceMass(scaled);
 	}
@@ -1713,6 +1720,6 @@
 	IssmDouble total_ice_volume_af;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element= xDynamicCast<Element*>(object);
 		local_ice_volume_af+=element->IceVolumeAboveFloatation(scaled);
 	}
@@ -1729,6 +1736,6 @@
 	IssmDouble total_ice_volume;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element= xDynamicCast<Element*>(object);
 		local_ice_volume+=element->IceVolume(scaled);
 	}
@@ -1772,6 +1779,6 @@
 	for(i=0;i<num_segments;i++){
 		element_id=reCast<int,IssmDouble>(*(segments+5*i+4));
-		for(j=0;j<elements->Size();j++){
-			element=(Element*)this->elements->GetObjectByOffset(j);
+		for(Object* & object : this->elements->objects){
+			element = xDynamicCast<Element*>(object);
 			if (element->Id()==element_id){
 				/*We found the element which owns this segment, use it to compute the mass flux: */
@@ -1807,6 +1814,6 @@
 	/*Go through elements, and request velocity: */
 	maxabsvx=-INFINITY;
-	for(i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		Input*  input = element->GetInput(VxEnum);
 		element_maxabsvx=input->GetInputMaxAbs();
@@ -1832,6 +1839,6 @@
 	/*Go through elements, and request velocity: */
 	maxabsvy=-INFINITY;
-	for(i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		Input*  input = element->GetInput(VyEnum);
 		element_maxabsvy=input->GetInputMaxAbs();
@@ -1857,6 +1864,6 @@
 	/*Go through elements, and request velocity: */
 	maxabsvz=-INFINITY;
-	for(i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		Input*  input = element->GetInput(VzEnum);
 		element_maxabsvz=input->GetInputMaxAbs();
@@ -1879,6 +1886,6 @@
 	IssmDouble max_divergence = -INFINITY;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		local_divergence=element->Divergence();
 		if(fabs(local_divergence)>max_divergence) max_divergence=fabs(local_divergence);
@@ -1901,6 +1908,6 @@
 	/*Go through elements, and request velocity: */
 	maxvel=-INFINITY;
-	for(i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		Input* vel_input = element->GetInput(VelEnum); _assert_(vel_input);
 		element_maxvel = vel_input->GetInputMax();
@@ -1926,6 +1933,6 @@
 	/*Go through elements, and request velocity: */
 	maxvx=-INFINITY;
-	for(i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input);
 		element_maxvx = vx_input->GetInputMax();
@@ -1951,6 +1958,6 @@
 	/*Go through elements, and request velocity: */
 	maxvy=-INFINITY;
-	for(i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input);
 		element_maxvy = vy_input->GetInputMax();
@@ -1976,6 +1983,6 @@
 	/*Go through elements, and request velocity: */
 	maxvz=-INFINITY;
-	for(i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		Input* vz_input = element->GetInput(VzEnum); _assert_(vz_input);
 		element_maxvz = vz_input->GetInputMax();
@@ -2001,6 +2008,6 @@
 	/*Go through elements, and request velocity: */
 	minvel=INFINITY;
-	for(i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		Input*  input = element->GetInput(VelEnum);
 		element_minvel =input->GetInputMin();
@@ -2026,6 +2033,6 @@
 	/*Go through elements, and request velocity: */
 	minvx=INFINITY;
-	for(i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		Input*  input = element->GetInput(VxEnum);
 		element_minvx =input->GetInputMin();
@@ -2051,6 +2058,6 @@
 	/*Go through elements, and request velocity: */
 	minvy=INFINITY;
-	for(i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		Input*  input = element->GetInput(VyEnum);
 		element_minvy =input->GetInputMin();
@@ -2076,6 +2083,6 @@
 	/*Go through elements, and request velocity: */
 	minvz=INFINITY;
-	for(i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		Input*  input = element->GetInput(VzEnum);
 		element_minvz =input->GetInputMin();
@@ -2104,6 +2111,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 
 		/*If on water, return 0: */
@@ -2159,6 +2166,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 
 		/*If on water, return 0: */
@@ -2245,6 +2252,6 @@
 
 		/*Fill in vector*/
-		for(int j=0;j<elements->Size();j++){
-			Element* element=(Element*)elements->GetObjectByOffset(j);
+		for(Object* & object : this->elements->objects){
+			Element* element = xDynamicCast<Element*>(object);
 			element->ControlToVectors(vector_control,vector_gradient,control_enum,control_interp[i]);
 		}
@@ -2466,6 +2473,6 @@
 
 						/*Get interpolation (and compute input if necessary)*/
-						for(int j=0;j<elements->Size();j++){
-							Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(j));
+						for(Object* & object : this->elements->objects){
+							Element* element = xDynamicCast<Element*>(object);
 							element->ResultInterpolation(&rank_interpolation,&rank_nodesperelement,&rank_arraysize,output_enum);
 							if(rank_arraysize>max_rank_arraysize)max_rank_arraysize=rank_arraysize;
@@ -2495,6 +2502,6 @@
 
 							/*Fill-in matrix*/
-							for(int j=0;j<elements->Size();j++){
-								Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(j));
+							for(Object* & object : this->elements->objects){
+								Element* element = xDynamicCast<Element*>(object);
 								element->ResultToPatch(values,nodesperelement,output_enum);
 							}
@@ -2522,6 +2529,6 @@
 
 								/*Fill in vector*/
-								for(int j=0;j<elements->Size();j++){
-									Element* element=(Element*)elements->GetObjectByOffset(j);
+								for(Object* & object : this->elements->objects){
+									Element* element = xDynamicCast<Element*>(object);
 									element->ResultToVector(vector_result,output_enum);
 								}
@@ -2541,6 +2548,6 @@
 
 								/*Fill-in matrix*/
-								for(int j=0;j<elements->Size();j++){
-									Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(j));
+								for(Object* & object : this->elements->objects){
+									Element* element = xDynamicCast<Element*>(object);
 									element->ResultToMatrix(values,ncols,output_enum);
 								}
@@ -2667,6 +2674,6 @@
 void FemModel::RignotMeltParameterizationx(){/*{{{*/
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->RignotMeltParameterization();
 	}
@@ -2675,6 +2682,6 @@
 void FemModel::StrainRateparallelx(){/*{{{*/
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->StrainRateparallel();
 	}
@@ -2683,6 +2690,6 @@
 void FemModel::StrainRateperpendicularx(){/*{{{*/
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->StrainRateperpendicular();
 	}
@@ -2691,6 +2698,6 @@
 void FemModel::StrainRateeffectivex(){/*{{{*/
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->ComputeStrainRate();
 	}
@@ -2700,6 +2707,6 @@
 
 	/*Update input for basal element only*/
-	for(int i=0;i<elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->StressIntensityFactor();
 	}
@@ -2717,6 +2724,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 
 		/*If on water, return 0: */
@@ -2771,6 +2778,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 
 		/*If on water, return 0: */
@@ -2825,6 +2832,6 @@
    Vector<IssmDouble>* vectotalweight  = new Vector<IssmDouble>(numberofvertices);
 
-   for(int i=0;i<this->elements->Size();i++){
-      Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 
 		/*check if there is ice in this element*/
@@ -2860,6 +2867,6 @@
 
    /*Set element inputs*/
-   for(int i=0;i<this->elements->Size();i++){
-      Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		H[0]=Hserial[element->vertices[0]->Sid()];
 		H[1]=Hserial[element->vertices[1]->Sid()];
@@ -2888,6 +2895,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 
 		/*If on water, return 0: */
@@ -2944,6 +2951,6 @@
 	Element* element=(Element*)elements->GetObjectByOffset(0); min_dt=element->TimeAdapt();
 
-	for(int i=1;i<elements->Size();i++){
-		element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		element = xDynamicCast<Element*>(object);
 		dt=element->TimeAdapt();
 		if(dt<min_dt)min_dt=dt;
@@ -2971,6 +2978,6 @@
 	IssmDouble total_calving_flux;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		local_calving_flux+=element->TotalCalvingFluxLevelset(scaled);
 	}
@@ -2987,6 +2994,6 @@
 	IssmDouble total_calving_flux;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		local_calving_flux+=element->TotalCalvingMeltingFluxLevelset(scaled);
 	}
@@ -3003,6 +3010,6 @@
 	IssmDouble total_fbmb;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		local_fbmb+=element->TotalFloatingBmb(scaled);
 	}
@@ -3019,6 +3026,6 @@
 	IssmDouble total_gbmb;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		local_gbmb+=element->TotalGroundedBmb(scaled);
 	}
@@ -3035,6 +3042,6 @@
 	IssmDouble total_smb;
 
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		local_smb+=element->TotalSmb(scaled);
 	}
@@ -3048,6 +3055,6 @@
 void FemModel::UpdateConstraintsExtrudeFromBasex(void){ /*{{{*/
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->UpdateConstraintsExtrudeFromBase();
 	}
@@ -3057,6 +3064,6 @@
 void FemModel::UpdateConstraintsExtrudeFromTopx(void){ /*{{{*/
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->UpdateConstraintsExtrudeFromTop();
 	}
@@ -3111,6 +3118,6 @@
 
 	/*Update verices new geometry: */
-	for(int i=0;i<vertices->Size();i++){
-		Vertex* vertex=(Vertex*)vertices->GetObjectByOffset(i);
+	for(Object* & object : this->vertices->objects){
+		Vertex* vertex = xDynamicCast<Vertex*>(object);
 		vertex->UpdatePosition(vx,vy,vz,parameters,surface,bed);
 	}
@@ -3332,6 +3339,6 @@
    IssmDouble* r        = xNew<IssmDouble>(numvertices);
 
-	for(int el=0;el<this->elements->Size();el++){
-      Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(el));
+	for(Object* & object : this->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		element->GetVerticesCoordinates(&xyz_list);
 		for(int i=0;i<numvertices;i++){
@@ -3364,6 +3371,6 @@
    IssmDouble* sl      = xNew<IssmDouble>(numvertices);
 
-	for(int el=0;el<this->elements->Size();el++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(el));
+	for(Object* & object : this->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 
 		element->GetInputListOnVertices(&s[0],SurfaceEnum);
@@ -3469,6 +3476,6 @@
 	vP0inputs= new Vector<IssmDouble>(numberofelements*numP0inputs);
 	vP1inputs= new Vector<IssmDouble>(numberofvertices*numP1inputs);
-	for(int i=0;i<this->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 
 		/*Get P0 inputs*/
@@ -4077,6 +4084,6 @@
 
    /*Calculate the Smoothed Deviatoric Stress tensor*/
-	for(int i=0;i<this->elements->Size();i++){
-      Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
       element->GetInputListOnVertices(deviatoricstressxx,DeviatoricStressxxEnum);
       element->GetInputListOnVertices(deviatoricstressyy,DeviatoricStressyyEnum);
@@ -4167,6 +4174,6 @@
 
 	/*Integrate the error over elements*/
-   for(int i=0;i<this->elements->Size();i++){
-      Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->GetInputListOnVertices(tauxx,DeviatoricStressxxEnum);
       element->GetInputListOnVertices(tauyy,DeviatoricStressyyEnum);
@@ -4233,6 +4240,6 @@
    Vector<IssmDouble>* vectotalweight  = new Vector<IssmDouble>(numberofvertices);
 
-   for(int i=0;i<this->elements->Size();i++){
-      Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
       element->GetInputListOnVertices(H,ThicknessEnum);
       element->GetVerticesSidList(elem_vertices);
@@ -4317,6 +4324,6 @@
 
 	/*Integrate the error over elements*/
-   for(int i=0;i<this->elements->Size();i++){
-      Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
       element->GetInputListOnVertices(H,ThicknessEnum);
       element->GetVerticesSidList(elem_vertices);
@@ -4372,6 +4379,6 @@
    Vector<IssmDouble>* vmasklevelset   = new Vector<IssmDouble>(numberofelements);
 
-   for(int i=0;i<this->elements->Size();i++){
-      Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
       element->GetInputListOnVertices(elementlevelset,MaskOceanLevelsetEnum);
       int sid = element->Sid();
@@ -4405,6 +4412,6 @@
 
 	/*Insert the element center coordinates*/
-   for(int i=0;i<this->elements->Size();i++){
-      Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
       //element->GetVerticesSidList(elem_vertices);
       int sid = element->Sid();
@@ -4461,6 +4468,6 @@
 
 	/*Use the element center coordinate if level set is zero (grounding line or ice front), otherwise set NAN*/
-   for(int i=0;i<this->elements->Size();i++){
-      Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
       element->GetInputListOnVertices(levelset,levelset_type);
 		element->GetVerticesSidList(elem_vertices);
@@ -4645,6 +4652,6 @@
 
 	/*Go through elements, and add contribution from each element to the deflection vector wg:*/
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->GiaDeflection(wg,dwgdt, x,y);
 	}
@@ -4749,6 +4756,8 @@
 
 	/*First, figure out the area of the ocean, which is needed to compute the eustatic component: */
-	for(int i=0;i<elements->Size();i++){
-		Element*   element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	int i = -1;
+	for(Object* & object : this->elements->objects){
+		i +=1;
+		Element* element = xDynamicCast<Element*>(object);
 		element->GetInputValue(&area,AreaEnum);
 		if (masks->isoceanin[i]) oceanarea_cpu += area;
@@ -4759,6 +4768,6 @@
 
 	/*Call the sea level rise core: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->SealevelriseEustatic(RSLgi,&eustatic_cpu_e,masks, oceanarea);
 		eustatic_cpu+=eustatic_cpu_e;
@@ -4811,6 +4820,6 @@
 	/*Call the sea level rise non-eustatic core only if required: */
 	if(computerigid | computeelastic){
-		for(int i=0;i<elements->Size();i++){
-			Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+		for(Object* & object : this->elements->objects){
+			Element* element = xDynamicCast<Element*>(object);
 			element->SealevelriseNonEustatic(RSLgo,RSLg_old,masks);
 		}
@@ -4847,6 +4856,6 @@
 	IssmDouble moi_list[3]={0,0,0};
 	IssmDouble moi_list_cpu[3]={0,0,0};
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->SealevelriseMomentOfInertia(&moi_list[0],RSLg_old,masks );
 		moi_list_cpu[0] += moi_list[0];
@@ -4949,6 +4958,6 @@
 
 	/*Call the sea level rise core: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->SealevelriseGeodetic(Up,North,East,RSLg,masks);
 	}
@@ -4985,6 +4994,6 @@
 
 	/*Go through elements, and add contribution from each element and divide by overall ocean area:*/
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		oceanvalue_cpu += element->OceanAverage(RSLg_serial,masks);
 	}
@@ -5023,6 +5032,6 @@
 	GetVectoronBaseFromInputsx(&old_active,this,HydrologydcMaskEplactiveNodeEnum,NodeSIdEnum);
 
-	for (int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		effanalysis->HydrologyEPLGetMask(mask,recurence,element);
 	}
@@ -5031,6 +5040,6 @@
 	recurence->Assemble();
 	serial_rec=recurence->ToMPISerial();
-	for (int i=0;i<nodes->Size();i++){
-		Node* node=xDynamicCast<Node*>(nodes->GetObjectByOffset(i));
+	for(Object* & object : this->nodes->objects){
+		Node* node = xDynamicCast<Node*>(object);
 		if(serial_rec[node->Sid()]==1.)eplzigzag_counter[node->Lid()] ++;
 		if(eplzigzag_counter[node->Lid()]>eplflip_lock && eplflip_lock!=0){
@@ -5055,6 +5064,6 @@
 	/*Step 2: update node activity. If one element is connected to mask=1, all nodes are active*/
 	active=new Vector<IssmDouble>(nodes->NumberOfNodes());
-	for (int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		effanalysis->HydrologyEPLGetActive(active,element);
 	}
@@ -5072,6 +5081,6 @@
 	this->parameters->FindParam(&domaintype,DomainTypeEnum);
 
-	for(int i=0;i<elements->Size();i++){
-		Element    *element  = xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		switch(domaintype){
 			case Domain2DhorizontalEnum:
@@ -5142,6 +5151,6 @@
 		mask=new Vector<IssmDouble>(this->nodes->NumberOfNodes());
 
-		for (int i=0;i<elements->Size();i++){
-			Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+		for(Object* & object : this->elements->objects){
+			Element* element = xDynamicCast<Element*>(object);
 			inefanalysis->HydrologyIDSGetMask(mask,element);
 		}
@@ -5162,6 +5171,6 @@
 	/*get node mask coherent with element mask*/
 	active=new Vector<IssmDouble>(nodes->NumberOfNodes());
-	for (int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		inefanalysis->HydrologyIdsGetActive(active,element);
 	}
@@ -5174,6 +5183,6 @@
 	/*Update node activation accordingly*/
 	int         counter  = 0; //this is probably not acurate but we are only interested in positivity
-	for(int i=0;i<elements->Size();i++){
-		Element    *element  = xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		int         numnodes = element->GetNumberOfNodes();
 		IssmDouble *base     = xNew<IssmDouble>(numnodes);
@@ -5223,6 +5232,6 @@
 	this->SetCurrentConfiguration(HydrologyDCEfficientAnalysisEnum);
 	active=new Vector<IssmDouble>(nodes->NumberOfNodes());
-	for (int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		effanalysis->HydrologyEPLGetActive(active,element);
 	}
@@ -5237,6 +5246,6 @@
 	int counter =0;
 	this->SetCurrentConfiguration(L2ProjectionEPLAnalysisEnum);
-	for (int i=0;i<nodes->Size();i++){
-		Node* node=xDynamicCast<Node*>(nodes->GetObjectByOffset(i));
+	for(Object* & object : this->nodes->objects){
+		Node* node = xDynamicCast<Node*>(object);
 		if(serial_active[node->Sid()]==1.){
 			node->Activate();
@@ -5274,7 +5283,7 @@
 		}
 		else{
-			for(int j=0;j<elements->Size();j++){
+			for(Object* & object : this->elements->objects){
 				/*Get the right transient input*/
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
+				Element* element = xDynamicCast<Element*>(object);
 				TransientInput* transientinput = this->inputs->GetTransientInput(transientinput_enum[i]);
 
@@ -5310,7 +5319,9 @@
 		}
 		else{
-			for(int j=0;j<elements->Size();j++){
+			int j=-1;
+			for(Object* & object : this->elements->objects){
 				/*Get the right transient input*/
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
+				Element* element = xDynamicCast<Element*>(object);
+				j+=1;
 				/*Get basal element*/
 				switch(domaintype){
@@ -5357,6 +5368,6 @@
 
 	for(int i=0;i<numoutputs;i++){
-		for(int j=0;j<this->elements->Size();j++){
-			Element* element = xDynamicCast<Element*>(elements->GetObjectByOffset(j));
+		for(Object* & object : this->elements->objects){
+			Element* element = xDynamicCast<Element*>(object);
 			element->CreateInputTimeAverage(transientinput_enum[i],averagedinput_enum[i],init_time,end_time,averaging_method);
 		}
@@ -5369,6 +5380,6 @@
 
 	for(int i=0;i<numoutputs;i++){
-		for(int j=0;j<this->elements->Size();j++){
-			Element* element = xDynamicCast<Element*>(elements->GetObjectByOffset(j));
+		for(Object* & object : this->elements->objects){
+			Element* element = xDynamicCast<Element*>(object);
 			/*Get basal element*/
 			switch(domaintype){
@@ -5646,6 +5657,6 @@
    this->GetZeroLevelSetPoints(&levelset_points,numberofpoints,levelset_type);//levelset_points is serial (global)
 
-	for(int i=0;i<this->vertices->Size();i++){//only on this partition
-		Vertex* vertex=(Vertex*)this->vertices->GetObjectByOffset(i);
+	for(Object* & object : this->vertices->objects){
+		Vertex* vertex = xDynamicCast<Vertex*>(object);
       /*Attention: no spherical coordinates*/
       x	= vertex->GetX();
@@ -5977,6 +5988,6 @@
 	this->GetZeroLevelSetPoints(&levelset_points,numberofpoints,levelset_type);
 
-	for(int i=0;i<this->elements->Size();i++){//parallel
-      Element* element=xDynamicCast<Element*>(this->elements->GetObjectByOffset(i));
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
       int sid = element->Sid();
 		element->GetVerticesCoordinates(&xyz_list);
Index: /issm/trunk-jpl/src/c/classes/IoModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 25539)
@@ -1700,6 +1700,6 @@
 		if(strcmp(iodata->name,vector_name)==0){
 			_assert_(iodata->code==7);
-			for(int i=0;i<elements->Size();i++){
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+			for(Object* & object : elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
 				element->InputCreate(iodata->data,inputs,this,iodata->M,iodata->N,iodata->layout,input_enum,iodata->code);//we need i to index into elements.
 			}
@@ -1721,6 +1721,6 @@
 	this->FetchData(&doublearray,&M,&N,vector_name);
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		if(!doublearray){
 			element->SetElementInput(inputs,input_enum,default_value);
@@ -1742,6 +1742,6 @@
 		IoData* iodata=*iter;
 		if(strcmp(iodata->name,vector_name)==0){
-			for(int i=0;i<elements->Size();i++){
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+			for(Object* & object : elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
 				element->InputCreate(iodata->data,inputs,this,iodata->M,iodata->N,iodata->layout,input_enum,iodata->code);//we need i to index into elements.
 			}
@@ -1767,6 +1767,6 @@
 		case 1: //boolean constant
 			this->FetchData(&boolean,vector_name);
-			for(i=0;i<elements->Size();i++){
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+			for(Object* & object : elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
 				element->SetBoolInput(inputs,input_enum,boolean);
 			}
@@ -1774,6 +1774,6 @@
 		case 2: //integer constant
 			this->FetchData(&integer,vector_name);
-			for(i=0;i<elements->Size();i++){
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+			for(Object* & object : elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
 				element->SetIntInput(inputs,input_enum,integer);
 			}
@@ -1781,6 +1781,6 @@
 		case 3: //IssmDouble constant
 			this->FetchData(&scalar,vector_name);
-			for(i=0;i<elements->Size();i++){
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+			for(Object* & object : elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
 				element->SetElementInput(inputs,input_enum,scalar);
 			}
@@ -1789,6 +1789,6 @@
 			this->FetchData(&doublearray,&M,&N,vector_name); //we still have a doublearray, because it might include times in transient mode
 			if(!doublearray) _error_("\""<<vector_name<<"\" not found in binary file");
-			for(i=0;i<elements->Size();i++){
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+			for(Object* & object : elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
 				element->InputCreate(doublearray,inputs,this,M,N,vector_layout,input_enum,code);//we need i to index into elements.
 			}
@@ -1797,6 +1797,6 @@
 			this->FetchData(&doublearray,&M,&N,vector_name); //we still have a doublearray, because it might include times in transient mode
 			if(!doublearray) _error_("\""<<vector_name<<"\" not found in binary file");
-			for(i=0;i<elements->Size();i++){
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+			for(Object* & object : elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
 				element->InputCreate(doublearray,inputs,this,M,N,vector_layout,input_enum,code);//we need i to index into elements.
 			}
@@ -1828,8 +1828,8 @@
 				//initialize transient input dataset:
 				TransientInput* transientinput=inputs->SetDatasetTransientInput(input_enum,i, times,N);
-				for(int j=0;j<elements->Size();j++){
+				for(Object* & object : elements->objects){
 
 					/*Get the right transient input*/
-					Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
+					Element* element=xDynamicCast<Element*>(object);
 
 					/*Get values and lid list*/
@@ -1899,6 +1899,6 @@
 			this->FetchData(&doublearray,&M,&N,vector_name);
 			if(!doublearray) _error_("\""<<vector_name<<"\" not found in binary file");
-			for(i=0;i<elements->Size();i++){
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+			for(Object* & object : elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
 				element->InputCreate(doublearray,inputs,this,M,N,vector_layout,input_enum,code);//we need i to index into elements.
 			}
@@ -1919,6 +1919,6 @@
 		IoData* iodata=*iter;
 		if(strcmp(iodata->name,vector_name)==0){
-			for(int i=0;i<elements->Size();i++){
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+			for(Object* & object : elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
 				_error_("to be implemented...");
 				//element->InputCreate(iodata->data,inputs,this,iodata->M,iodata->N,iodata->layout,input_enum,iodata->code);//we need i to index into elements.
@@ -1960,6 +1960,6 @@
 			for(int i=0;i<N;i++) ids[i] = i;
 
-			for(int i=0;i<elements->Size();i++){
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+			for(Object* & object : elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
 				element->DatasetInputCreate(doublearray,M,N,ids,N,inputs,this,input_enum);
 			}
@@ -1975,6 +1975,6 @@
 			for(int i=0;i<N;i++) ids[i] = i;
 
-			for(int i=0;i<elements->Size();i++){
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+			for(Object* & object : elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
 				element->DatasetInputCreate(doublearray,M,N,ids,N,inputs,this,input_enum);
 			}
Index: /issm/trunk-jpl/src/c/classes/Loads/Loads.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Loads.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/classes/Loads/Loads.cpp	(revision 25539)
@@ -57,5 +57,5 @@
 	output->id_offsets=NULL;
 	output->sorted_ids=NULL;
-	if(this->sorted && objsize>0 && this->id_offsets){	
+	if(this->sorted && objsize>0 && this->id_offsets){
 		output->id_offsets=xNew<int>(objsize);
 		xMemCpy<int>(output->id_offsets,this->id_offsets,objsize);
@@ -102,6 +102,6 @@
 
 	/*Now go through all loads, and get how many nodes they own, unless they are clone nodes: */
-	for(int i=0;i<this->Size();i++){
-		Load* load=xDynamicCast<Load*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+      Load* load = xDynamicCast<Load*>(object);
 		if(load->IsPenalty()){
 			ispenalty++;
@@ -135,6 +135,6 @@
 
 	/*Now go through all loads, and get how many nodes they own, unless they are clone nodes: */
-	for(int i=0;i<this->Size();i++){
-		Load* load=xDynamicCast<Load*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+      Load* load = xDynamicCast<Load*>(object);
 		int numnodes=load->GetNumberOfNodes();
 		if(numnodes>max)max=numnodes;
Index: /issm/trunk-jpl/src/c/classes/Misfit.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Misfit.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/classes/Misfit.cpp	(revision 25539)
@@ -90,6 +90,6 @@
 /*}}}*/
 void Misfit::Marshall(MarshallHandle* marshallhandle){/*{{{*/
-	_error_("not implemented yet!"); 
-} 
+	_error_("not implemented yet!");
+}
 /*}}}*/
 int Misfit::ObjectEnum(void){/*{{{*/
@@ -123,5 +123,4 @@
 	 if (this->local==1){ /*area integration using elements: {{{*/
 
-		 int i;
 		 IssmDouble misfit_t=0.;
 		 IssmDouble all_misfit_t=0.;
@@ -132,6 +131,6 @@
 		 if(this->lock)return misfit/(time-starttime);
 
-		 for(i=0;i<femmodel->elements->Size();i++){
-			 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
+		 for(Object* & object : femmodel->elements->objects){
+			 Element* element=xDynamicCast<Element*>(object);
 			 misfit_t+=element->Misfit(model_enum,observation_enum,weights_enum);
 			 area_t+=element->MisfitArea(weights_enum);
@@ -153,5 +152,5 @@
 
 		 /*What we return is the value of misfit / time if transient*/
-		 if(time!=0.) return misfit/(time-starttime); 
+		 if(time!=0.) return misfit/(time-starttime);
 		 return misfit;
 	 } /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Nodes.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Nodes.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/classes/Nodes.cpp	(revision 25539)
@@ -63,5 +63,5 @@
 	output->id_offsets=NULL;
 	output->sorted_ids=NULL;
-	if(this->sorted && objsize>0 && this->id_offsets){	
+	if(this->sorted && objsize>0 && this->id_offsets){
 		output->id_offsets=xNew<int>(objsize);
 		xMemCpy<int>(output->id_offsets,this->id_offsets,objsize);
@@ -148,6 +148,6 @@
 
 	/*First, allocate dof lists based on fset and sset*/
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+      Node* node = xDynamicCast<Node*>(object);
 		node->AllocateDofLists(setenum);
 	}
@@ -155,16 +155,16 @@
 	/*Now, Build local dofs for masters first*/
 	int  dofcount=0;
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+      Node* node = xDynamicCast<Node*>(object);
 		if(!node->IsClone()) node->DistributeLocalDofs(&dofcount,setenum);
 	}
 	/*Build local dofs for clones, they always will be at the end*/
 	int dofcount_local = dofcount;
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+		Node* node = xDynamicCast<Node*>(object);
 		if(node->IsClone()) node->DistributeLocalDofs(&dofcount_local,setenum);
 	}
 
-	/* Now every object has distributed dofs, but locally, and with a dof count starting from 
+	/* Now every object has distributed dofs, but locally, and with a dof count starting from
 	 * 0. This means the dofs between all the cpus are not unique. We now offset the dofs of each
 	 * cpus by the total last (master) dofs of the previus cpu, starting from 0.
@@ -179,11 +179,11 @@
 	xDelete<int>(alldofcount);
 
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+		Node* node = xDynamicCast<Node*>(object);
 		node->DistributeGlobalDofsMasters(offset,setenum);
 	}
 
-	/* Finally, remember that cpus may have skipped some objects, because they were clones. For every 
-	 * object that is not a clone, tell them to show their dofs, so that later on, they can get picked 
+	/* Finally, remember that cpus may have skipped some objects, because they were clones. For every
+	 * object that is not a clone, tell them to show their dofs, so that later on, they can get picked
 	 * up by their clones: */
 	int  maxdofspernode = this->MaxNumDofs(setenum);
@@ -212,6 +212,6 @@
 
 	/*Update indexingupdateflag*/
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+		Node* node = xDynamicCast<Node*>(object);
 		node->ReindexingDone();
 	}
@@ -236,6 +236,6 @@
 	this->numberofnodes_local=this->Size();
 	this->numberofmasters_local=0;
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+		Node* node = xDynamicCast<Node*>(object);
 		if(!node->clone) this->numberofmasters_local++;
 	}
@@ -244,10 +244,10 @@
 	/*2. Distribute lids (First: masters, then clones)*/
 	int lid = 0;
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+		Node* node = xDynamicCast<Node*>(object);
 		if(!node->clone) node->lid=lid++;
 	}
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+		Node* node = xDynamicCast<Node*>(object);
 		if(node->clone) node->lid=lid++;
 	}
@@ -261,6 +261,6 @@
 	xDelete<int>(all_num_masters);
 
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+		Node* node = xDynamicCast<Node*>(object);
 		node->pid = node->lid+offset;
 	}
@@ -301,6 +301,6 @@
 
 	/*Now go through all nodes, and get how many dofs they own, unless they are clone nodes: */
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+		Node* node = xDynamicCast<Node*>(object);
 
 		int numdofs=node->GetNumberOfDofs(NoneApproximationEnum,setenum);
@@ -332,6 +332,6 @@
 
 	/*Now go through all nodes, and get how many dofs they own, unless they are clone nodes: */
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+		Node* node = xDynamicCast<Node*>(object);
 
 		/*Ok, this object is a node, ask it to plug values into partition: */
@@ -348,6 +348,6 @@
 	/*go through all nodes, and get how many dofs they own, unless they are clone nodes: */
 	int numdofs=0;
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+		Node* node = xDynamicCast<Node*>(object);
 		numdofs+=node->GetNumberOfDofs(NoneApproximationEnum,setenum);
 	}
@@ -376,6 +376,6 @@
 
 	/*Now go through all nodes, and get how many dofs they own, unless they are clone nodes: */
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+		Node* node = xDynamicCast<Node*>(object);
 		if(node->RequiresDofReindexing()){
 			flag = 1;
@@ -408,6 +408,6 @@
 
 	/*First, go over all nodes, and masters can write their f dof and -1 for s-set*/
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+		Node* node = xDynamicCast<Node*>(object);
 
 		/*Skip if clone (will check later)*/
@@ -436,6 +436,6 @@
 
 	/*Second, go over all nodes, and check that we still have what's expected...*/
-	for(int i=0;i<this->Size();i++){
-		Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i));
+	for(Object* & object : this->objects){
+		Node* node = xDynamicCast<Node*>(object);
 
 		/*Write degree of freedom if active*/
Index: /issm/trunk-jpl/src/c/classes/Profiler.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Profiler.h	(revision 25538)
+++ /issm/trunk-jpl/src/c/classes/Profiler.h	(revision 25539)
@@ -28,10 +28,17 @@
 #define SLRCORE				15 /*Profiling SLR */
 #define MPISERIAL				16 /*Profiling MPISerial */
-#define MAXPROFSIZE			17 /*Used to initialize static arrays*/
+#define SEDLOOP				17 /*Profiling MPISerial */
+#define SEDMatrix				18 /*Profiling MPISerial */
+#define SEDUpdate				19 /*Profiling MPISerial */
+#define EPLLOOP				20 /*Profiling MPISerial */
+#define EPLMasking			21 /*Profiling MPISerial */
+#define EPLMatrices			22 /*Profiling MPISerial */
+#define EPLUpdate				23 /*Profiling MPISerial */
+#define MAXPROFSIZE			24 /*Used to initialize static arrays*/
 
 
 class Profiler: public Object{
 
-	public: 
+	public:
 		IssmPDouble flops[MAXPROFSIZE];
 		IssmPDouble flops_start[MAXPROFSIZE];
Index: /issm/trunk-jpl/src/c/classes/Radar.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Radar.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/classes/Radar.cpp	(revision 25539)
@@ -30,5 +30,5 @@
 }
 /*}}}*/
-Radar::Radar(char* in_name, int in_definitionenum){/*{{{*/	
+Radar::Radar(char* in_name, int in_definitionenum){/*{{{*/
 	this->definitionenum=in_definitionenum;
 	this->name		= xNew<char>(strlen(in_name)+1);
@@ -59,6 +59,6 @@
 /*}}}*/
 void Radar::Marshall(MarshallHandle* marshallhandle){/*{{{*/
-	_error_("not implemented yet!"); 
-} 
+	_error_("not implemented yet!");
+}
 /*}}}*/
 int Radar::ObjectEnum(void){/*{{{*/
@@ -77,10 +77,9 @@
 }
 /*}}}*/
-IssmDouble Radar::Response(FemModel* femmodel){/*{{{*/	
-	int i; 
-	for(i=0;i<femmodel->elements->Size();i++){
-		Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
+IssmDouble Radar::Response(FemModel* femmodel){/*{{{*/
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		this->ComputeRadarAttenuation(element);
-		this->ComputeRadarPower(element); 
+		this->ComputeRadarPower(element);
 	}
 	return 0.;
@@ -112,10 +111,10 @@
 	IssmDouble  E_Cl_W97=3.6800e-20;
 	IssmDouble  E_NH=3.6800e-20;
-	IssmDouble  mol_H_hol=1.6; 
-	IssmDouble  mol_H_lgp=0.2; 
-	IssmDouble  mol_Cl_hol=0.4; 
-	IssmDouble  mol_Cl_lgp=1.8; 
+	IssmDouble  mol_H_hol=1.6;
+	IssmDouble  mol_H_lgp=0.2;
+	IssmDouble  mol_Cl_hol=0.4;
+	IssmDouble  mol_Cl_lgp=1.8;
 	IssmDouble  mol_NH_hol=0.5;
-	IssmDouble  mol_NH_lgp=0.4; 
+	IssmDouble  mol_NH_lgp=0.4;
 	IssmDouble  mol_H, mol_Cl, mol_NH;
 	IssmDouble  attenuation_rate_macgregor[NUMVERTICES];
@@ -129,5 +128,5 @@
 	/*Retrieve all inputs we will be needing: */
 	Input* temp_input=element->GetInput(TemperatureEnum); _assert_(temp_input);
-	Input* ice_period_input=element->GetInput(RadarIcePeriodEnum); _assert_(ice_period_input); 
+	Input* ice_period_input=element->GetInput(RadarIcePeriodEnum); _assert_(ice_period_input);
 
 	/* Start looping on the number of vertices: */
@@ -136,17 +135,17 @@
 	for (int iv=0;iv<NUMVERTICES;iv++){
 		gauss->GaussVertex(iv);
-   
+
 		/*Get ice temperature: */
 		temp_input->GetInputValue(&temperature,gauss);
 		ice_period_input->GetInputValue(&ice_period,gauss);
 
-		if(ice_period>0){; 
+		if(ice_period>0){;
 			mol_H=mol_H_hol;
 			mol_Cl=mol_Cl_hol;
 			mol_NH=mol_NH_hol;
 			}
-		else{ 
+		else{
 			mol_H=mol_H_lgp;
-			mol_Cl=mol_Cl_lgp; 
+			mol_Cl=mol_Cl_lgp;
 			mol_NH=mol_NH_lgp;
 		}
@@ -209,5 +208,5 @@
 	IssmDouble  rho_ice, gravity, pressure, pressure_melting_pt, frozen_temp, basal_temp, basal_pmp;
 	GaussPenta* gauss=NULL;
-	
+
 	/* Get node coordinates*/
 	element->GetVerticesCoordinates(&xyz_list);
@@ -253,5 +252,5 @@
 				pressure=rho_ice*gravity*thickness;
 				pressure_melting_pt=t_tp-gamma*(pressure-p_tp);
-				
+
 				if((temperature-pressure_melting_pt)<=-1){
 					reflectivity=-40;
Index: /issm/trunk-jpl/src/c/classes/Regionaloutput.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Regionaloutput.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/classes/Regionaloutput.cpp	(revision 25539)
@@ -36,5 +36,5 @@
 /*}}}*/
 Regionaloutput::~Regionaloutput(){/*{{{*/
-	if(this->name)xDelete(this->name); 
+	if(this->name)xDelete(this->name);
 	if(this->outputname)xDelete(this->outputname);
 	if(this->mask)xDelete(this->mask);
@@ -64,6 +64,6 @@
 /*}}}*/
 void Regionaloutput::Marshall(MarshallHandle* marshallhandle){/*{{{*/
-	_error_("not implemented yet!"); 
-} 
+	_error_("not implemented yet!");
+}
 /*}}}*/
 int Regionaloutput::ObjectEnum(void){/*{{{*/
@@ -88,11 +88,10 @@
 IssmDouble Regionaloutput::Response(FemModel* femmodel){/*{{{*/
 
-	int i;
 	IssmDouble val_t=0.;
 	IssmDouble all_val_t=0.;
 	int outputenum = StringToEnumx(this->outputname);
 
-	for(i=0;i<femmodel->elements->Size();i++){
-		Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		switch(outputenum){
 			case GroundedAreaEnum:
Index: /issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp	(revision 25539)
@@ -336,6 +336,6 @@
 
 	/*go through elements and fill the masks: */
-	for (int i=0;i<femmodel->elements->Size();i++){
-		Element*   element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element*   element=xDynamicCast<Element*>(object);
 		element->SetSealevelMasks(masks);
 	}
@@ -377,6 +377,6 @@
 
 	/*Run sealevelrie geometry routine in elements:*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element*   element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element*   element=xDynamicCast<Element*>(object);
 		element->SealevelriseGeometry(latitude,longitude,radius,xx,yy,zz);
 	}
Index: /issm/trunk-jpl/src/c/main/esmfbinders.cpp
===================================================================
--- /issm/trunk-jpl/src/c/main/esmfbinders.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/main/esmfbinders.cpp	(revision 25539)
@@ -28,6 +28,6 @@
 
 		elementsonlocalrank=xNewZeroInit<int>(numberofelements); 
-		for (int i=0;i<femmodel->elements->Size();i++){
-			Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		for(Object* & object : femmodel->elements->objects){
+			Element* element=dynamic_cast<Element*>(object);
 			elementsonlocalrank[element->Sid()]=1;
 		}
@@ -63,6 +63,6 @@
 			int forcing_type=GCMForcingTerms[f];
 
-			for (int i=0;i<femmodel->elements->Size();i++){
-				Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
+			for(Object* & object : femmodel->elements->objects){
+				Element* element=dynamic_cast<Element*>(object);
 
 				switch(forcing_type){
@@ -103,6 +103,6 @@
 			int output_type=ISSMOutputTerms[f];
 
-			for (int i=0;i<femmodel->elements->Size();i++){
-				Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
+			for(Object* & object : femmodel->elements->objects){
+				Element* element=dynamic_cast<Element*>(object);
 
 				switch(output_type){
Index: /issm/trunk-jpl/src/c/modules/AllocateSystemMatricesx/AllocateSystemMatricesx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/AllocateSystemMatricesx/AllocateSystemMatricesx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/AllocateSystemMatricesx/AllocateSystemMatricesx.cpp	(revision 25539)
@@ -120,4 +120,5 @@
 	int elementssize        = femmodel->elements->Size();
 	int loadssize           = femmodel->loads->Size();
+
 	/*First, we are building chaining vectors so that we know what nodes are
 	 * connected to what elements. These vectors are such that:
@@ -128,8 +129,9 @@
 	next_e         = xNew<int>(elementssize*numnodesperelement);
 	count2offset_e = xNew<int>(elementssize*numnodesperelement);
-
 	k=0;
-	for(i=0;i<elementssize;i++){
-		element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	i=-1;
+	for(Object* & object : femmodel->elements->objects){
+      element = xDynamicCast<Element*>(object);
+		i+=1;
 		int elementnumnodes = element->GetNumberOfNodes();
 		lidlist = xNew<int>(elementnumnodes);
@@ -148,5 +150,4 @@
 		xDelete<int>(lidlist);
 	}
-
 	/*Chain for loads*/
 	head_l         = xNew<int>(localnumnodes); for(i=0;i<localnumnodes;i++) head_l[i]=-1;
@@ -154,6 +155,8 @@
 	count2offset_l = xNew<int>(loadssize*numnodesperload);
 	k=0;
-	for(i=0;i<loadssize;i++){
-		load = xDynamicCast<Load*>(femmodel->loads->GetObjectByOffset(i));
+	i=-1;
+	for(Object* & object : femmodel->loads->objects){
+      load = xDynamicCast<Load*>(object);
+		i+=1;
 		int loadnumnodes = load->GetNumberOfNodes();
 		lidlist = xNew<int>(loadnumnodes);
@@ -182,5 +185,4 @@
 
 	Vector<IssmDouble> *connectivity_clone= new Vector<IssmDouble>(localmasters,numnodes);
-
 	femmodel->parameters->FindParam(&analysis_type,AnalysisTypeEnum);
 	/*Resetting flags to false at each iteration takes a lot of time, so we keep track of the flags
@@ -190,6 +192,6 @@
 
 	/*Create connectivity vector*/
-	for(i=0;i<femmodel->nodes->Size();i++){
-		Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(i));
+	for(Object* & object : femmodel->nodes->objects){
+      Node* node = xDynamicCast<Node*>(object);
 		int   lid = node->Lid();
 		int   pid = node->Pid();
@@ -207,5 +209,4 @@
 		}
 		flagsindices_counter = 0;
-
 		for(j=head_e[lid];j!=-1;j=next_e[j]){
 			offset=count2offset_e[j];
@@ -252,6 +253,6 @@
 		d_nnz=xNew<int>(m);
 		o_nnz=xNew<int>(m);
-		for(i=0;i<femmodel->nodes->Size();i++){
-			Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(i));
+		for(Object* & object : femmodel->nodes->objects){
+			Node* node = xDynamicCast<Node*>(object);
 			int   lid = node->Lid();
 			if(!node->IsClone()){
Index: /issm/trunk-jpl/src/c/modules/AverageOntoPartitionx/AverageOntoPartitionx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/AverageOntoPartitionx/AverageOntoPartitionx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/AverageOntoPartitionx/AverageOntoPartitionx.cpp	(revision 25539)
@@ -30,6 +30,6 @@
 
 	/*loop on each element, and add contribution of the element to the partition (surface weighted average): */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->AverageOntoPartition(partition_contributions,partition_areas,vertex_response,qmu_part);
 	}
Index: /issm/trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/ConfigureObjectsx/ConfigureObjectsx.cpp	(revision 25539)
@@ -16,6 +16,6 @@
 
 	if(VerboseMProcessor()) _printf0_("      Configuring elements...\n");
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->Configure(elements,loads,nodes,vertices,materials,parameters,inputs);
 	}
Index: /issm/trunk-jpl/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp	(revision 25539)
@@ -25,6 +25,6 @@
 	int offset = 0;
 	for(int i=0;i<num_controls;i++){
-		for(int j=0;j<elements->Size();j++){
-			Element* element=(Element*)elements->GetObjectByOffset(j);
+		for(Object* & object : elements->objects){
+			Element* element=xDynamicCast<Element*>(object);
 			element->ControlInputSetGradient(gradient,control_type[i],i,offset,M_all[i],N_all[i],interp_all[i]);
 		}
Index: /issm/trunk-jpl/src/c/modules/CreateJacobianMatrixx/CreateJacobianMatrixx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/CreateJacobianMatrixx/CreateJacobianMatrixx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/CreateJacobianMatrixx/CreateJacobianMatrixx.cpp	(revision 25539)
@@ -10,5 +10,4 @@
 void CreateJacobianMatrixx(Matrix<IssmDouble>** pJff,FemModel* femmodel,IssmDouble kmax){
 
-	int      i;
 	int      configuration_type,analysisenum;
 	Element *element = NULL;
@@ -28,11 +27,11 @@
 
 	/*Create and assemble matrix*/
-	for(i=0;i<femmodel->elements->Size();i++){
-		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		element=xDynamicCast<Element*>(object);
 		ElementMatrix* Je = analysis->CreateJacobianMatrix(element);
 		if(Je) Je->AddToGlobal(Jff);
 		delete Je;
 	}
-	for (i=0;i<femmodel->loads->Size();i++){
+	for (int i=0;i<femmodel->loads->Size();i++){
 		load=(Load*)femmodel->loads->GetObjectByOffset(i);
 		load->CreateJacobianMatrix(Jff);
Index: /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp	(revision 25539)
@@ -16,6 +16,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		J+=DragCoefficientAbsGradient(element);
 	}
Index: /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.cpp	(revision 25539)
@@ -14,6 +14,6 @@
 
 	/*First, reset all melt to 0 */
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		int numvertices = element->GetNumberOfVertices();
 		IssmDouble* values = xNewZeroInit<IssmDouble>(numvertices);
@@ -55,6 +55,6 @@
 	IssmDouble maxdist_cpu=-1.;
 	for(int i=0;i<num_basins;i++){dmax_basin_cpu[i]=-1;}
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		if(!element->IsIceInElement() || !element->IsFloating()) continue;
 		numvertices = element->GetNumberOfVertices();
@@ -91,6 +91,6 @@
 
 	/*Assign box numbers*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->PicoUpdateBoxid(nd);
 	}
@@ -112,6 +112,6 @@
 	IssmDouble* boxareas=xNewZeroInit<IssmDouble>(num_basins*maxbox);
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		if(!element->IsOnBase()) continue;
 		Element* basalelement = element->SpawnBasalElement();
@@ -138,6 +138,6 @@
 }/*}}}*/
 void UpdateBoxPico(FemModel* femmodel, int loopboxid){/*{{{*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->PicoUpdateBox(loopboxid);
 	}
@@ -160,6 +160,6 @@
 
 	/* Compute Toc and Soc weighted avg (boxes 0 to n-1) */
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		if(!element->IsOnBase()) continue;
 		Element* basalelement = element->SpawnBasalElement();
@@ -201,6 +201,6 @@
 	if(boxid==0){ 
 		overturning_weighted_avg=xNewZeroInit<IssmDouble>(num_basins);
-		for(int i=0;i<femmodel->elements->Size();i++){
-			Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		for(Object* & object : femmodel->elements->objects){
+			Element* element=xDynamicCast<Element*>(object);
 			if(!element->IsOnBase()) continue;
 			Element* basalelement = element->SpawnBasalElement();
@@ -243,6 +243,6 @@
 }/*}}}*/
 void ComputeBasalMeltPlume(FemModel* femmodel){/*{{{*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->PicoComputeBasalMelt();
 	}
Index: /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp	(revision 25539)
@@ -54,6 +54,6 @@
 void LinearFloatingiceMeltingRatex(FemModel* femmodel){/*{{{*/
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		element->LinearFloatingiceMeltingRate();
 	}
@@ -62,6 +62,6 @@
 void SpatialLinearFloatingiceMeltingRatex(FemModel* femmodel){/*{{{*/
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		element->SpatialLinearFloatingiceMeltingRate();
 	}
@@ -70,6 +70,6 @@
 void MismipFloatingiceMeltingRatex(FemModel* femmodel){/*{{{*/
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		element->MismipFloatingiceMeltingRate();
 	}
@@ -84,5 +84,5 @@
 
 	femmodel->parameters->FindParam(&num_basins,BasalforcingsIsmip6NumBasinsEnum);
-	femmodel->parameters->FindParam(&tf_depths,&num_depths,BasalforcingsIsmip6TfDepthsEnum); _assert_(tf_depths); 
+	femmodel->parameters->FindParam(&tf_depths,&num_depths,BasalforcingsIsmip6TfDepthsEnum); _assert_(tf_depths);
 	femmodel->parameters->FindParam(&islocal,BasalforcingsIsmip6IsLocalEnum);
 
@@ -96,6 +96,6 @@
 
 	/*Get TF at each ice shelf point - linearly intepolate in depth and time*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element     = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		int      numvertices = element->GetNumberOfVertices();
 
@@ -123,5 +123,5 @@
 			IssmDouble depth = -depth_vertices[iv]; /*NOTE: make sure we are dealing with depth>0*/
 			int offset;
-			int found=binary_search(&offset,depth,tf_depths,num_depths); 
+			int found=binary_search(&offset,depth,tf_depths,num_depths);
 			if(!found) _error_("depth not found");
 
@@ -157,6 +157,6 @@
 	if(!islocal) {
 		/*Compute sums of tf*area and shelf-area per cpu*/
-		for(int i=0;i<femmodel->elements->Size();i++){
-			Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		for(Object* & object : femmodel->elements->objects){
+			Element* element = xDynamicCast<Element*>(object);
 			if(!element->IsOnBase() || !element->IsIceInElement() || !element->IsFloating()) continue;
 			/*Spawn basal element if on base to compute element area*/
@@ -169,5 +169,5 @@
 			area=basalelement->GetHorizontalSurfaceArea();
 			tf_weighted_avg[basinid]+=tf*area;
-			areas_summed[basinid]   +=area;	
+			areas_summed[basinid]   +=area;
 			/*Delete spawned element if we are in 3D*/
 			basalelement->FindParam(&domaintype,DomainTypeEnum);
@@ -185,6 +185,6 @@
 
    /*Compute meltrates*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		element->Ismip6FloatingiceMeltingRate();
 	}
@@ -200,6 +200,6 @@
 void BeckmannGoosseFloatingiceMeltingRatex(FemModel* femmodel){/*{{{*/
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		element->BeckmannGoosseFloatingiceMeltingRate();
 	}
Index: /issm/trunk-jpl/src/c/modules/GeothermalFluxx/GeothermalFluxx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GeothermalFluxx/GeothermalFluxx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/GeothermalFluxx/GeothermalFluxx.cpp	(revision 25539)
@@ -39,6 +39,6 @@
 void MantlePlumeGeothermalFluxx(FemModel* femmodel){/*{{{*/
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->MantlePlumeGeothermalFlux();
 	}
Index: /issm/trunk-jpl/src/c/modules/GetSolutionFromInputsx/GetSolutionFromInputsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetSolutionFromInputsx/GetSolutionFromInputsx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/GetSolutionFromInputsx/GetSolutionFromInputsx.cpp	(revision 25539)
@@ -7,5 +7,5 @@
 #include "../../toolkits/toolkits.h"
 
-void GetSolutionFromInputsx(Vector<IssmDouble>** psolution,FemModel* femmodel){
+void GetSolutionFromInputsx(Vector<IssmDouble>** psolution,FemModel* femmodel){/*{{{*/
 
 	if(VerboseModule()) _printf0_("   Get solution from inputs\n");
@@ -25,6 +25,6 @@
 	/*Go through elements and plug solution: */
 	Analysis* analysis = EnumToAnalysis(analysisenum);
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		analysis->GetSolutionFromInputs(solution,element);
 	}
@@ -36,3 +36,44 @@
 	/*Assign output pointers:*/
 	*psolution=solution;
-}
+}/*}}}*/
+
+void GetBasalSolutionFromInputsx(Vector<IssmDouble>** psolution,FemModel* femmodel){ /*{{{*/
+
+	if(VerboseModule()) _printf0_("   Get solution from inputs\n");
+
+	/*retrieve parameters: */
+	int analysisenum;
+	int domaintype;
+	femmodel->parameters->FindParam(&analysisenum,AnalysisTypeEnum);
+	femmodel->parameters->FindParam(&domaintype,DomainTypeEnum);
+	/*Get size of vector: */
+	int gsize       = femmodel->nodes->NumberOfDofs(GsetEnum);
+	int gsize_local = femmodel->nodes->NumberOfDofsLocal(GsetEnum);
+	if(gsize==0) _error_("Allocating a Vec of size 0 as gsize=0 ");
+
+	/*Initialize solution: */
+	Vector<IssmDouble>* solution=new Vector<IssmDouble>(gsize_local,gsize);
+
+	/*Go through elements and plug solution: */
+	Analysis* analysis = EnumToAnalysis(analysisenum);
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
+		switch(domaintype){
+			case Domain2DhorizontalEnum:
+				analysis->GetSolutionFromInputs(solution,element);
+			break;
+		case Domain3DEnum:
+			if(!element->IsOnBase()) continue;
+			analysis->GetSolutionFromInputs(solution,element);
+			break;
+		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+		}
+	}
+	delete analysis;
+
+	/*Assemble vector: */
+	solution->Assemble();
+
+	/*Assign output pointers:*/
+	*psolution=solution;
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/modules/GetSolutionFromInputsx/GetSolutionFromInputsx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetSolutionFromInputsx/GetSolutionFromInputsx.h	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/GetSolutionFromInputsx/GetSolutionFromInputsx.h	(revision 25539)
@@ -1,5 +1,5 @@
 /*!\file:  GetSolutionFromInputsx.h
  * \brief header file for updating datasets from inputs
- */ 
+ */
 
 #ifndef _GETSOLUTIONFROMINPUTSXX_H
@@ -11,4 +11,5 @@
 /* local prototypes: */
 void GetSolutionFromInputsx(Vector<IssmDouble>** psolution,FemModel* femmodel);
+void GetBasalSolutionFromInputsx(Vector<IssmDouble>** psolution,FemModel* femmodel);
 
 #endif  /* _GETSOLUTIONFROMINPUTSXX_H */
Index: /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp	(revision 25539)
@@ -30,6 +30,6 @@
 	int offset = 0;
 	for(int i=0;i<num_controls;i++){
-		for(int j=0;j<elements->Size();j++){
-			Element* element=(Element*)elements->GetObjectByOffset(j);
+		for(Object* & object : elements->objects){
+			Element* element=xDynamicCast<Element*>(object);
 			element->GetVectorFromControlInputs(vector,control_type[i],i,N[i],data,offset);
 		}
Index: /issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp	(revision 25539)
@@ -9,5 +9,4 @@
 void GetVectorFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type){ /*{{{*/
 
-	int i;
 	Vector<IssmDouble>* vector=NULL;
 
@@ -26,6 +25,6 @@
 	}
 	/*Look up in elements*/
-	for(i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->GetVectorFromInputs(vector,name,type);
 	}
@@ -38,5 +37,5 @@
 void GetVectoronBaseFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type){ /*{{{*/
 
-	int i, domaintype;
+	int domaintype;
 	Vector<IssmDouble>* vector=NULL;
 
@@ -56,6 +55,6 @@
 
 	/*Look up in elements*/
-	for(i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->FindParam(&domaintype,DomainTypeEnum);
 		switch(domaintype){
@@ -76,5 +75,4 @@
 void GetVectorFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type,IssmDouble time){/*{{{*/
 
-	int i;
 	Vector<IssmDouble>* vector=NULL;
 
@@ -90,6 +88,6 @@
 	}
 	/*Look up in elements*/
-	for(i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->GetVectorFromInputs(vector,name,type,time);
 	}
Index: /issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.cpp	(revision 25539)
@@ -44,6 +44,6 @@
 	/*Compute all gradient_list*/
 	for(int i=0;i<num_controls;i++){
-		for(int j=0;j<elements->Size();j++){
-			Element* element=(Element*)elements->GetObjectByOffset(j);
+		for(Object* & object : elements->objects){
+			Element* element=xDynamicCast<Element*>(object);
 			analysis->GradientJ(gradient_list[i],element,control_type[i],control_interp[i],i);
 		}
Index: /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 25539)
@@ -43,6 +43,6 @@
 
 	/*Migrate grounding line : */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->MigrateGroundingLine(phi_ungrounding);
 	}
@@ -68,6 +68,6 @@
 
 	/*Fill vector vertices_potentially_floating: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->FSContactMigration(vertex_sigmann,vertex_waterpressure);
 	}
@@ -104,6 +104,6 @@
 
 	/*Fill vector vertices_potentially_floating: */
-	for(i=0;i<elements->Size();i++){
-		element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		element=xDynamicCast<Element*>(object);
 		element->PotentialUngrounding(vec_vertices_potentially_ungrounding);
 	}
@@ -132,6 +132,6 @@
 	/*recover vec_phi*/
 	vec_phi=new Vector<IssmDouble>(vertices->NumberOfVertices());
-	for(i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->GetVectorFromInputs(vec_phi,MaskOceanLevelsetEnum,VertexPIdEnum);
 	}
@@ -146,6 +146,6 @@
 
 		/*Figure out if any of the nodes of the element will be floating -> elements neighbouting the floating ice*/
-		for(i=0;i<elements->Size();i++){
-			element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+		for(Object* & object : elements->objects){
+			element=xDynamicCast<Element*>(object);
 			vec_elements_neighboring_floatingice->SetValue(element->Sid(),element->IsNodeOnShelfFromFlags(phi)?1.0:0.0,INS_VAL);
 		}
@@ -157,6 +157,6 @@
 		/*Go through elements_neighboring_floatingce, and update vector of the nodes that will start floating*/
 		local_nflipped=0;
-		for(i=0;i<elements->Size();i++){
-			element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+		for(Object* & object : elements->objects){
+			element=xDynamicCast<Element*>(object);
 			if(reCast<int,IssmDouble>(elements_neighboring_floatingce[element->Sid()])){
 				local_nflipped+=element->UpdatePotentialUngrounding(vertices_potentially_ungrounding,vec_phi,phi);
Index: /issm/trunk-jpl/src/c/modules/InputDepthAverageAtBasex/InputDepthAverageAtBasex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputDepthAverageAtBasex/InputDepthAverageAtBasex.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/InputDepthAverageAtBasex/InputDepthAverageAtBasex.cpp	(revision 25539)
@@ -9,6 +9,6 @@
 
 void InputDepthAverageAtBasex(FemModel* femmodel,int original_enum, int new_enum){
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->InputDepthAverageAtBase(original_enum,new_enum);
 	}
Index: /issm/trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/InputExtrudex/InputExtrudex.cpp	(revision 25539)
@@ -9,6 +9,6 @@
 
 void InputExtrudex(FemModel* femmodel,int input_enum,int start){
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->InputExtrude(input_enum,start);
 	}
Index: /issm/trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp	(revision 25539)
@@ -12,6 +12,6 @@
 
 	/*Elements and loads drive the update: */
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->InputUpdateFromConstant(constant,name);
 	}
@@ -22,6 +22,6 @@
 
 	/*Elements and loads drive the update: */
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 		element->InputUpdateFromConstant(constant,name);
 	}
@@ -33,6 +33,6 @@
 	/*Elements and loads drive the update: */
 	if(IsInputEnum(name)){
-		for(int i=0;i<femmodel->elements->Size();i++){
-			Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		for(Object* & object : femmodel->elements->objects){
+			Element* element = xDynamicCast<Element*>(object);
 			element->InputUpdateFromConstant(constant,name);
 		}
@@ -55,6 +55,6 @@
 
 	/*Elements and loads drive the update: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->SetElementInput(inputs,name,constant);
 	}
@@ -65,6 +65,6 @@
 
 	/*Elements and loads drive the update: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->SetBoolInput(inputs,name,constant);
 	}
@@ -79,6 +79,6 @@
 
 	/*Elements and loads drive the update: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->SetElementInput(inputs,name,constant2);
 	}
Index: /issm/trunk-jpl/src/c/modules/InputUpdateFromDakotax/InputUpdateFromDakotax.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputUpdateFromDakotax/InputUpdateFromDakotax.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/InputUpdateFromDakotax/InputUpdateFromDakotax.cpp	(revision 25539)
@@ -12,5 +12,5 @@
 #include "../InputUpdateFromConstantx/InputUpdateFromConstantx.h"
 #include "../InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.h"
-			
+
 void  InputUpdateFromDakotax(FemModel* femmodel,double* variables,char* *variables_descriptors,int numdakotavariables){ /*{{{*/
 
@@ -34,27 +34,27 @@
 
 	/*retrieve parameters: */
-	femmodel->parameters->FindParam(&variable_partitions,&variable_partitions_num,NULL,NULL,QmuVariablePartitionsEnum); 
-	femmodel->parameters->FindParam(&variable_partitions_npart,NULL,NULL,QmuVariablePartitionsNpartEnum); 
-	femmodel->parameters->FindParam(&variable_partitions_nt,NULL,NULL,QmuVariablePartitionsNtEnum); 
-	
-
-	/*Go through all dakota descriptors, ex: "rho_ice","thermal_conductivity","thickness1","thickness2", etc ..., and 
-	 * for each descriptor, take the variable value and plug it into the inputs (more or less :)): 
-	 * We also start with distributed and standard values , as they tend to be used to pluck data from a multi-modle ensemble (mme) 
-	 * which can then be scaled. Doing the scaling first would be impractical, as the entire mme would have to be scaled, 
+	femmodel->parameters->FindParam(&variable_partitions,&variable_partitions_num,NULL,NULL,QmuVariablePartitionsEnum);
+	femmodel->parameters->FindParam(&variable_partitions_npart,NULL,NULL,QmuVariablePartitionsNpartEnum);
+	femmodel->parameters->FindParam(&variable_partitions_nt,NULL,NULL,QmuVariablePartitionsNtEnum);
+
+
+	/*Go through all dakota descriptors, ex: "rho_ice","thermal_conductivity","thickness1","thickness2", etc ..., and
+	 * for each descriptor, take the variable value and plug it into the inputs (more or less :)):
+	 * We also start with distributed and standard values , as they tend to be used to pluck data from a multi-modle ensemble (mme)
+	 * which can then be scaled. Doing the scaling first would be impractical, as the entire mme would have to be scaled,
 	 * which is a waste of time:*/
 
 	variablecount=0;
-	for(i=0;i<numdakotavariables;i++){ //these are the dakota variables, for all partitions. 
+	for(i=0;i<numdakotavariables;i++){ //these are the dakota variables, for all partitions.
 
 		descriptor=variables_descriptors[i];
-	
+
 
 		/*From descriptor, figure out if the variable is scaled, indexed, distributed or just a simple variable: */
-		if (strncmp(descriptor,"scaled_",7)==0){ 
+		if (strncmp(descriptor,"scaled_",7)==0){
 			/*we are skipping these for now.*/
 			npart=variable_partitions_npart[variablecount];
 			nt=variable_partitions_nt[variablecount];
-				
+
 			/*increment i to skip the distributed values just collected: */
 			i+=npart*nt-1; //careful, the for loop will add 1.
@@ -66,13 +66,13 @@
 			/*we are skipping these for now.*/
 		}
-		
+
 		else if (strncmp(descriptor,"distributed_",12)==0){
 			if (VerboseQmu())_printf0_("   updating variable " << descriptor << "\n");
-			
+
 			/*recover partition vector: */
 			variable_partition=variable_partitions[variablecount];
 			npart=variable_partitions_npart[variablecount];
 
-			/*Variable is distributed. Determine root name of variable (ex: distributed_DragCoefficient_1 -> DragCoefficient). 
+			/*Variable is distributed. Determine root name of variable (ex: distributed_DragCoefficient_1 -> DragCoefficient).
 			 * Allocate distributed_values and fill the distributed_values with the next npart variables: */
 
@@ -86,11 +86,11 @@
 
 			//for (int j=0;j<npart;j++)_printf_(j << ":" << distributed_values[j] << "\n");
-			
+
 			//Call specialty code:
 			InputUpdateSpecialtyCode(femmodel,distributed_values,variable_partition,npart,root);
-			
+
 			/*increment i to skip the distributed values just collected: */
 			i+=npart-1; //careful, the for loop will add 1.
-			
+
 			/*Free allocations: */
 			xDelete<double>(parameter);
@@ -104,16 +104,16 @@
 		variablecount++;
 	}
-	
+
 	variablecount=0;
 	/*now deal with scaled variabes:*/
-	for(i=0;i<numdakotavariables;i++){ //these are the dakota variables, for all partitions. 
+	for(i=0;i<numdakotavariables;i++){ //these are the dakota variables, for all partitions.
 
 		descriptor=variables_descriptors[i];
-	
+
 		/*From descriptor, figure out if the variable is scaled, indexed, distributed or just a simple variable: */
 		if (strncmp(descriptor,"scaled_",7)==0){
-		
+
 			if (VerboseQmu())_printf0_("   updating variable " << descriptor << "\n");
-		
+
 			/*recover partition vector: */
 			variable_partition=variable_partitions[variablecount];
@@ -121,5 +121,5 @@
 			nt=variable_partitions_nt[variablecount];
 
-			/* Variable is scaled, determine its root name (ex: scaled_DragCoefficient_1 -> DragCoefficient). Allocate distributed_values and fill the 
+			/* Variable is scaled, determine its root name (ex: scaled_DragCoefficient_1 -> DragCoefficient). Allocate distributed_values and fill the
 			 * distributed_values with the next npart variables coming from Dakota: */
 			memcpy(root,strstr(descriptor,"_")+1,(strlen(strstr(descriptor,"_")+1)+1)*sizeof(char));
@@ -136,5 +136,5 @@
 			/*increment i to skip the distributed values just collected: */
 			i+=npart*nt-1; //careful, the for loop will add 1.
-			
+
 			/*Free allocations: */
 			xDelete<double>(parameter);
@@ -201,8 +201,7 @@
 	femmodel->inputs->SetTransientInput(DummyEnum,times,N);
 	transientinput2 = femmodel->inputs->GetTransientInput(DummyEnum);
-		
-	for (int i=0;i<femmodel->elements->Size();i++){
-
-		Tria*   element=xDynamicCast<Tria*>(femmodel->elements->GetObjectByOffset(i));
+
+	for(Object* & object : femmodel->elements->objects){
+		Tria*   element=xDynamicCast<Tria*>(object);
 
 		if((int)variable_partition[element->Sid()]==-1)id=0; //grab background field
@@ -218,5 +217,5 @@
 			if(interpolationenum==P0Enum){
 				value=tria_input->element_values[0];
-				transientinput2->AddTriaTimeInput( j,1,&(element->lid),&value,P0Enum); 
+				transientinput2->AddTriaTimeInput( j,1,&(element->lid),&value,P0Enum);
 			}
 			else if(interpolationenum==P1Enum){
@@ -231,5 +230,5 @@
 				element->GetVerticesSidList(&vertexsids[0]);
 				values=tria_input->element_values;
-				transientinput2->AddTriaTimeInput( j,numvertices,vertexlids,values,P1Enum); 
+				transientinput2->AddTriaTimeInput( j,numvertices,vertexlids,values,P1Enum);
 			}
 		}
@@ -248,10 +247,10 @@
 
 	/*Go through elements, copy input name to dummy, and scale it using the distributed_values and the partition vector:*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->InputScaleFromDakota(distributed_values,partition,npart,nt,name);
 	}
 
-	/*We created a dummy input, which was a scaled copy of the name input. Now wipe 
+	/*We created a dummy input, which was a scaled copy of the name input. Now wipe
 	 * out the name input with the new input:*/
 	femmodel->inputs->ChangeEnum(DummyEnum,name);
Index: /issm/trunk-jpl/src/c/modules/InputUpdateFromMatrixDakotax/InputUpdateFromMatrixDakotax.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputUpdateFromMatrixDakotax/InputUpdateFromMatrixDakotax.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/InputUpdateFromMatrixDakotax/InputUpdateFromMatrixDakotax.cpp	(revision 25539)
@@ -10,5 +10,4 @@
 void InputUpdateFromMatrixDakotax(FemModel* femmodel,double* matrix,int nrows,int ncols, int name, int type){
 
-	int i;
 	int numberofvertices,numberofelements;
 
@@ -20,6 +19,6 @@
 
 		/*Update elements, nodes, loads and materials from inputs: */
-		for(i=0;i<femmodel->elements->Size();i++){
-			Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		for(Object* & object : femmodel->elements->objects){
+			Element* element=xDynamicCast<Element*>(object);
 			element->InputUpdateFromMatrixDakota(matrix,nrows,ncols,name,type);
 		}
Index: /issm/trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.cpp	(revision 25539)
@@ -22,6 +22,6 @@
 
 	/*Now update inputs (analysis specific)*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		analysis->InputUpdateFromSolution(local_ug,element);
 	}
Index: /issm/trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.h	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.h	(revision 25539)
@@ -1,5 +1,5 @@
 /*!\file:  InputUpdateFromSolutionx.h
  * \brief header file for updating datasets from inputs
- */ 
+ */
 
 #ifndef _UPDATEINPUTSFROMSOLUTIONXX_H
Index: /issm/trunk-jpl/src/c/modules/InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.cpp	(revision 25539)
@@ -19,6 +19,6 @@
 
 	/*Update elements, nodes, loads and materials from inputs: */
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->InputUpdateFromVectorDakota(vector,name,type);
 	}
Index: /issm/trunk-jpl/src/c/modules/InputUpdateFromVectorx/InputUpdateFromVectorx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputUpdateFromVectorx/InputUpdateFromVectorx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/InputUpdateFromVectorx/InputUpdateFromVectorx.cpp	(revision 25539)
@@ -25,6 +25,6 @@
 
 	/*Update elements, nodes, loads and materials from inputs: */
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->InputUpdateFromVector(vector,name,type);
 	}
Index: /issm/trunk-jpl/src/c/modules/KillIcebergsx/KillIcebergsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/KillIcebergsx/KillIcebergsx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/KillIcebergsx/KillIcebergsx.cpp	(revision 25539)
@@ -96,6 +96,6 @@
 
 	/*OK, now deactivate iceberg and count the number of deactivated vertices*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
 
 		if(element->IsIceInElement()){
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 25539)
@@ -83,6 +83,6 @@
 			if(domaintype!=Domain2DverticalEnum) iomodel->FetchDataToInput(inputs,elements,"md.inversion.vy_obs",InversionVyObsEnum); 
 		}
-		for(int j=0;j<elements->Size();j++){
-			Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
+		for(Object* & object : elements->objects){
+			Element* element=xDynamicCast<Element*>(object);
 			element->DatasetInputAdd(InversionCostFunctionsCoefficientsEnum,&weights[i*iomodel->numberofvertices],inputs,iomodel,M,1,1,cost_function,7,cost_function);
 		}
@@ -160,6 +160,6 @@
 		}
 
-		for(int j=0;j<elements->Size();j++){
-			Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
+		for(Object* & object : elements->objects){
+			Element* element=xDynamicCast<Element*>(object);
 			element->ControlInputCreate(independent,&independents_min[offset],&independents_max[offset],inputs,iomodel,M,N,scale,control,i+1);
 		}
@@ -290,6 +290,6 @@
 
 
-			for(int j=0;j<elements->Size();j++){
-				Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
+			for(Object* & object : elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
 				element->ControlInputCreate(independent,independents_min,independents_max,inputs,iomodel,M,N,1.,input_enum,i+1);
 			}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 25539)
@@ -216,6 +216,6 @@
 							if (!isice){
 								/*go through elements, and zero the hmaterials pointers: */
-								for(int j=0;j<elements->Size();j++){
-									Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
+								for(Object* & object : elements->objects){
+									Element* element=xDynamicCast<Element*>(object);
 									switch(element->ObjectEnum()){
 										case TriaEnum: 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 25539)
@@ -118,6 +118,6 @@
 
 					/*Now, for this particular misfit object, make sure we plug into the elements: the observation, and the weights.*/
-					for(int k=0;k<elements->Size();k++){
-						Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(k));
+					for(Object* & object : elements->objects){
+						Element* element=xDynamicCast<Element*>(object);
 						element->InputCreate(misfit_observation_s[j],inputs,iomodel,misfit_observation_M_s[j],misfit_observation_N_s[j],obs_vector_type,StringToEnumx(misfit_observation_string_s[j]),7);
 						element->InputCreate(misfit_weights_s[j],inputs,iomodel,misfit_weights_M_s[j],misfit_weights_N_s[j],weight_vector_type,StringToEnumx(misfit_weights_string_s[j]),7);
@@ -208,6 +208,6 @@
 
 					/*Now, for this particular cfsurfacesquare object, make sure we plug into the elements: the observation, and the weights.*/
-					for(int k=0;k<elements->Size();k++){
-						Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(k));
+					for(Object* & object : elements->objects){
+						Element* element=xDynamicCast<Element*>(object);
 						element->DatasetInputAdd(StringToEnumx(cfsurfacesquare_definitionstring_s[j]),cfsurfacesquare_observation_s[j],inputs,iomodel,cfsurfacesquare_observation_M_s[j],cfsurfacesquare_observation_N_s[j],obs_vector_type,StringToEnumx(cfsurfacesquare_observation_string_s[j]),7,SurfaceObservationEnum);
 						element->DatasetInputAdd(StringToEnumx(cfsurfacesquare_definitionstring_s[j]),cfsurfacesquare_weights_s[j],inputs,iomodel,cfsurfacesquare_weights_M_s[j],cfsurfacesquare_weights_N_s[j],weight_vector_type,StringToEnumx(cfsurfacesquare_weights_string_s[j]),7,WeightsSurfaceObservationEnum);
@@ -278,7 +278,7 @@
 
 					/*Now, for this particular cfdragcoeffabsgrad object, make sure we plug into the elements: the observation, and the weights.*/
-					for(int k=0;k<elements->Size();k++){
-
-						Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(k));
+					for(Object* & object : elements->objects){
+
+						Element* element=xDynamicCast<Element*>(object);
 
 						element->DatasetInputAdd(StringToEnumx(cfdragcoeffabsgrad_definitionstring_s[j]),cfdragcoeffabsgrad_weights_s[j],inputs,iomodel,cfdragcoeffabsgrad_weights_M_s[j],cfdragcoeffabsgrad_weights_N_s[j],weight_vector_type,StringToEnumx(cfdragcoeffabsgrad_weights_string_s[j]),7,WeightsSurfaceObservationEnum);
@@ -361,7 +361,7 @@
 
 					/*Now, for this particular cfsurfacelogvel object, make sure we plug into the elements: the observation, and the weights.*/
-					for(int k=0;k<elements->Size();k++){
-
-						Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(k));
+					for(Object* & object : elements->objects){
+
+						Element* element=xDynamicCast<Element*>(object);
 
 						element->DatasetInputAdd(StringToEnumx(cfsurfacelogvel_definitionstring[j]),cfsurfacelogvel_vxobs[j],inputs,iomodel,cfsurfacelogvel_observation_M[j],cfsurfacelogvel_observation_N[j],obs_vector_type,StringToEnumx(cfsurfacelogvel_vxobs_string[j]),7,VxObsEnum);
@@ -606,6 +606,6 @@
 
 					/*Now, for this particular misfit object, make sure we plug into the elements: the observation, and the weights.*/
-					for(int k=0;k<elements->Size();k++){
-						Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(k));
+					for(Object* & object : elements->objects){
+						Element* element=xDynamicCast<Element*>(object);
 						element->DatasetInputCreate(cost_functions_weights[j],cost_functions_weights_M[j],cost_functions_weights_N[j],cost_function_enums,num_cost_functions,inputs,iomodel,InversionCostFunctionsCoefficientsEnum);
 					}
Index: /issm/trunk-jpl/src/c/modules/NodalValuex/NodalValuex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/NodalValuex/NodalValuex.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/NodalValuex/NodalValuex.cpp	(revision 25539)
@@ -22,6 +22,6 @@
 	found=0;
 
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		found=element->NodalValue(&value,index,natureofdataenum);
 		if(found){
Index: /issm/trunk-jpl/src/c/modules/ResetFSBasalBoundaryConditionx/ResetFSBasalBoundaryConditionx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ResetFSBasalBoundaryConditionx/ResetFSBasalBoundaryConditionx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/ResetFSBasalBoundaryConditionx/ResetFSBasalBoundaryConditionx.cpp	(revision 25539)
@@ -11,6 +11,6 @@
 	Element *element = NULL;
 
-	for (int i=0;i<elements->Size();i++){
-		element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+for(Object* & object : elements->objects){
+      element = xDynamicCast<Element*>(object);
 		element->ResetFSBasalBoundaryCondition();
 	}
Index: /issm/trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/RheologyBAbsGradientx/RheologyBAbsGradientx.cpp	(revision 25539)
@@ -16,6 +16,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		J+=RheologyBAbsGradient(element);
 	}
@@ -85,6 +85,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		J+=RheologyBInitialguessMisfit(element);
 	}
Index: /issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp	(revision 25539)
@@ -16,6 +16,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		J+=RheologyBbarAbsGradient(element);
 	}
Index: /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp	(revision 25539)
@@ -17,6 +17,6 @@
 	femmodel->parameters->FindParam(&domaintype,DomainTypeEnum);
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element    *element  = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element    *element  = xDynamicCast<Element*>(object);
 		int         numnodes = element->GetNumberOfNodes();
 		IssmDouble *mask     = xNew<IssmDouble>(numnodes);
@@ -66,6 +66,6 @@
 
 	/*Fill vector with values: */
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		if(element->IsIceInElement()){
 			int nbv = element->GetNumberOfVertices();
@@ -92,6 +92,6 @@
 
 	/*Fill vector with values: */
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 
 		if(element->IsIceInElement()){
@@ -116,6 +116,6 @@
 
 	/*Now update inputs (analysis specific)*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->InputUpdateFromSolutionOneDof(local_ug,IceMaskNodeActivationEnum);
 	}
Index: /issm/trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp	(revision 25539)
@@ -22,6 +22,6 @@
 	int offset = 0;
 	for(int i=0;i<num_controls;i++){
-		for(int j=0;j<femmodel->elements->Size();j++){
-			Element* element=(Element*)femmodel->elements->GetObjectByOffset(j);
+		for(Object* & object : femmodel->elements->objects){
+			Element* element=xDynamicCast<Element*>(object);
 			element->SetControlInputsFromVector(vector,control_type[i],i,offset,M[i],N[i]);
 		}
Index: /issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp	(revision 25539)
@@ -16,6 +16,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		J+=SurfaceAbsVelMisfit(element);
 	}
Index: /issm/trunk-jpl/src/c/modules/SurfaceAreax/SurfaceAreax.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceAreax/SurfaceAreax.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/SurfaceAreax/SurfaceAreax.cpp	(revision 25539)
@@ -19,6 +19,6 @@
 
 	/*Compute gradients: */
-	for(int i=0;i<femmodel->elements->Size();i++){
-		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		element=xDynamicCast<Element*>(object);
 		S+=element->SurfaceArea();
 	}
Index: /issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp	(revision 25539)
@@ -17,6 +17,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		J+=SurfaceAverageVelMisfit(element);
 	}
Index: /issm/trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp	(revision 25539)
@@ -15,6 +15,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		J+=SurfaceLogVelMisfit(element);
 	}
Index: /issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp	(revision 25539)
@@ -16,6 +16,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		J+=SurfaceLogVxVyMisfit(element);
 	}
@@ -91,5 +91,5 @@
 		 *
 		 *      1            [        |u| + eps     2          |v| + eps     2  ]
-		 * J = --- \bar{v}^2 | log ( -----------  )   +  log ( -----------  )   |  
+		 * J = --- \bar{v}^2 | log ( -----------  )   +  log ( -----------  )   |
 		 *      2            [       |u    |+ eps              |v    |+ eps     ]
 		 *                              obs                       obs
Index: /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/Gembx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/Gembx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/Gembx.cpp	(revision 25539)
@@ -59,6 +59,6 @@
 	for (t=time;t<=time+dt-smb_dt;t=t+smb_dt){
 
-		for(int i=0;i<femmodel->elements->Size();i++){
-			Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		for(Object* & object : femmodel->elements->objects){
+			Element* element=xDynamicCast<Element*>(object);
 
 			timeclim=time;
Index: /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 25539)
@@ -21,9 +21,9 @@
 		/*Get time parameters*/
 		IssmDouble time,dt,starttime,finaltime;
-		femmodel->parameters->FindParam(&time,TimeEnum); 
+		femmodel->parameters->FindParam(&time,TimeEnum);
 		femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
 		femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
 		femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
-		
+
 		if(time<=starttime+dt){
 			/*FIXME: this is wrong, should be done at the ElementUpdate step of analysis, not here!*/
@@ -54,6 +54,6 @@
 
 		/*Loop over all the elements of this partition*/
-		for(int i=0;i<femmodel->elements->Size();i++){
-			Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		for(Object* & object : femmodel->elements->objects){
+			Element* element=xDynamicCast<Element*>(object);
 
 			int         numvertices = element->GetNumberOfVertices();
@@ -80,6 +80,6 @@
 
 	/*Loop over all the elements of this partition*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 
 		/*Allocate all arrays*/
@@ -140,6 +140,6 @@
 
 	/*Loop over all the elements of this partition*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 
 		/*Allocate all arrays*/
@@ -199,6 +199,6 @@
 void Delta18oParameterizationx(FemModel* femmodel){/*{{{*/
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->Delta18oParameterization();
 	}
@@ -207,6 +207,6 @@
 void MungsmtpParameterizationx(FemModel* femmodel){/*{{{*/
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->MungsmtpParameterization();
 	}
@@ -215,6 +215,6 @@
 void Delta18opdParameterizationx(FemModel* femmodel){/*{{{*/
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->Delta18opdParameterization();
 	}
@@ -233,5 +233,5 @@
 	//    mean annual surface temperature (degrees C): Tsurf(NA)
 
-	int    i, it, jj, itm;
+	int    it, jj, itm;
 	IssmDouble DT = 0.02, sigfac, snormfac;
 	IssmDouble signorm = 5.5;      // signorm : sigma of the temperature distribution for a normal day
@@ -315,6 +315,6 @@
 	//     *******END initialize PDD
 
-	for(i=0;i<femmodel->elements->Size();i++){
-		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		element=xDynamicCast<Element*>(object);
 		element->PositiveDegreeDay(pdds,pds,signorm,ismungsm,issetpddfac);
 	}
@@ -328,6 +328,6 @@
 	femmodel->parameters->FindParam(&isfirnwarming,SmbIsfirnwarmingEnum);
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->PositiveDegreeDaySicopolis(isfirnwarming);
 	}
@@ -355,6 +355,6 @@
 
 	/*Loop over all the elements of this partition*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 
 		/*Get reference SMB (uncorrected) and allocate all arrays*/
@@ -414,6 +414,6 @@
 
 	/*Loop over all the elements of this partition*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 
 		/*Allocate all arrays*/
@@ -432,5 +432,5 @@
 
 			/*Get time parameters*/
-			femmodel->parameters->FindParam(&time,TimeEnum); 
+			femmodel->parameters->FindParam(&time,TimeEnum);
 			femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
 			femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
@@ -514,6 +514,6 @@
 
 	/*Loop over all the elements of this partition*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 
 		/*Allocate all arrays*/
@@ -620,6 +620,6 @@
 void SmbGradientsComponentsx(FemModel* femmodel){/*{{{*/
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->SmbGradCompParameterization();
 	}
@@ -629,6 +629,6 @@
 void SmbSemicx(FemModel* femmodel){/*{{{*/
 
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		element->SmbSemic();
 	}
Index: /issm/trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp	(revision 25539)
@@ -16,6 +16,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		J+=SurfaceRelVelMisfit(element);
 	}
@@ -89,9 +89,9 @@
 
 		/*Compute SurfaceRelVelMisfit:
-		 *                        
+		 *
 		 *      1  [     \bar{v}^2             2   \bar{v}^2              2 ]
 		 * J = --- | -------------  (u - u   ) + -------------  (v - v   )  |
 		 *      2  [  (u   + eps)^2       obs    (v   + eps)^2       obs    ]
-		 *              obs                        obs                      
+		 *              obs                        obs
 		 */
 
Index: /issm/trunk-jpl/src/c/modules/SystemMatricesx/SystemMatricesx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SystemMatricesx/SystemMatricesx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/SystemMatricesx/SystemMatricesx.cpp	(revision 25539)
@@ -41,6 +41,6 @@
 
 		/*Get complete stiffness matrix without penalties*/
-		for (i=0;i<femmodel->elements->Size();i++){
-			element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		for(Object* & object : femmodel->elements->objects){
+			element = xDynamicCast<Element*>(object);
 			if(!element->AnyFSet() && analysisenum!=StressbalanceAnalysisEnum) continue;
 			ElementMatrix* Ke = analysis->CreateKMatrix(element);
@@ -52,6 +52,6 @@
 		}
 
-		for (i=0;i<femmodel->loads->Size();i++){
-			load=xDynamicCast<Load*>(femmodel->loads->GetObjectByOffset(i));
+		for(Object* & object : femmodel->loads->objects){
+			load = xDynamicCast<Load*>(object);
 			load->CreateKMatrix(Kff_temp,NULL);
 		}
@@ -83,6 +83,6 @@
 
 	/*Fill stiffness matrix and load vector from elements*/
-	for (i=0;i<femmodel->elements->Size();i++){
-		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(Object* & object : femmodel->elements->objects){
+      element = xDynamicCast<Element*>(object);
 		if(!element->AnyFSet() && analysisenum!=StressbalanceAnalysisEnum) continue;
 		ElementMatrix* Ke = analysis->CreateKMatrix(element);
@@ -98,6 +98,6 @@
 
 	/*Fill stiffness matrix and load vector from loads*/
-	for(i=0;i<femmodel->loads->Size();i++){
-		load=xDynamicCast<Load*>(femmodel->loads->GetObjectByOffset(i));
+	for(Object* & object : femmodel->loads->objects){
+      load = xDynamicCast<Load*>(object);
 		load->CreateKMatrix(Kff,Kfs);
 		load->CreatePVector(pf);
@@ -106,6 +106,6 @@
 	/*Now deal with penalties (only in loads)*/
 	if(ispenalty){
-		for (i=0;i<femmodel->loads->Size();i++){
-			load=xDynamicCast<Load*>(femmodel->loads->GetObjectByOffset(i));
+		for(Object* & object : femmodel->loads->objects){
+			load = xDynamicCast<Load*>(object);
 			load->PenaltyCreateKMatrix(Kff,Kfs,kmax);
 			load->PenaltyCreatePVector(pf,kmax);
@@ -115,9 +115,9 @@
 	/*Create dof vector for stiffness matrix preconditioning*/
 	if(pdf){
-		for(i=0;i<femmodel->elements->Size();i++){
-			element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
-			ElementVector* de=analysis->CreateDVector(element);
-			if(de) de->InsertIntoGlobal(df);
-			delete de;
+	for(Object* & object : femmodel->elements->objects){
+      element = xDynamicCast<Element*>(object);
+		ElementVector* de=analysis->CreateDVector(element);
+		if(de) de->InsertIntoGlobal(df);
+		delete de;
 		}
 	}
Index: /issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp	(revision 25539)
@@ -16,6 +16,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		J+=ThicknessAbsMisfit(element);
 	}
Index: /issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp	(revision 25539)
@@ -16,6 +16,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+      Element* element = xDynamicCast<Element*>(object);
 		J+=ThicknessAcrossGradient(element);
 	}
Index: /issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp	(revision 25539)
@@ -16,6 +16,6 @@
 
 	/*Compute Misfit: */
-	for(int i=0;i<elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+	for(Object* & object : elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
 		J+=ThicknessAlongGradient(element);
 	}
Index: /issm/trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp	(revision 25539)
@@ -58,5 +58,5 @@
 
 	/*{{{*//*Retrieve inputs as the initial state for the non linear iteration*/
-	GetSolutionFromInputsx(&ug_sed,femmodel);
+	GetBasalSolutionFromInputsx(&ug_sed,femmodel);
 	Reducevectorgtofx(&uf_sed, ug_sed, femmodel->nodes,femmodel->parameters);
 	if(isefficientlayer) {
@@ -64,5 +64,5 @@
 		effanalysis = new HydrologyDCEfficientAnalysis();
 		femmodel->SetCurrentConfiguration(HydrologyDCEfficientAnalysisEnum);
-		GetSolutionFromInputsx(&ug_epl,femmodel);
+		GetBasalSolutionFromInputsx(&ug_epl,femmodel);
 		/*Initialize the EPL element mask*/
 		inefanalysis->ElementizeEplMask(femmodel);
@@ -96,4 +96,5 @@
 
 		/*{{{*//*Treating the sediment*/
+		femmodel->profiler->Start(SEDLOOP);
 		for(;;){
 			sedconverged=false;
@@ -104,8 +105,10 @@
 				/*{{{*//*Core of the computation*/
 				if(VerboseSolution()) _printf0_("Building Sediment Matrix...\n");
+				femmodel->profiler->Start(SEDMatrix);
 				SystemMatricesx(&Kff,&Kfs,&pf,&df,&sediment_kmax,femmodel);
 				CreateNodalConstraintsx(&ys,femmodel->nodes);
 				Reduceloadx(pf,Kfs,ys); delete Kfs;
 				delete uf_sed;
+				femmodel->profiler->Stop(SEDMatrix);
 
 				femmodel->profiler->Start(SOLVER);
@@ -115,7 +118,9 @@
 				delete Kff; delete pf; delete df;
 				delete ug_sed;
+				femmodel->profiler->Start(SEDUpdate);
 				Mergesolutionfromftogx(&ug_sed,uf_sed,ys,femmodel->nodes,femmodel->parameters); delete ys;
 				InputUpdateFromSolutionx(femmodel,ug_sed);
 				ConstraintsStatex(&constraints_converged,&num_unstable_constraints,femmodel);
+				femmodel->profiler->Stop(SEDUpdate);
 				/*}}}*/
 				if (!sedconverged){
@@ -157,6 +162,8 @@
 			}
 		}
+		femmodel->profiler->Stop(SEDLOOP);
 		/*}}}*//*End of the global sediment loop*/
 		/*{{{*//*Now dealing with the EPL in the same way*/
+		femmodel->profiler->Start(EPLLOOP);
 		if(isefficientlayer){
 			femmodel->SetCurrentConfiguration(HydrologyDCEfficientAnalysisEnum);
@@ -173,4 +180,5 @@
 				/*{{{*//*Retrieve the EPL head slopes and compute EPL Thickness*/
 				if(VerboseSolution()) _printf0_("computing EPL Head slope...\n");
+				femmodel->profiler->Start(EPLMasking);
 				femmodel->SetCurrentConfiguration(L2ProjectionEPLAnalysisEnum);
 				femmodel->UpdateConstraintsL2ProjectionEPLx(&L2Count);
@@ -185,11 +193,12 @@
 				femmodel->HydrologyEPLupdateDomainx(&ThickCount);
 				/*}}}*/
-
+				femmodel->profiler->Stop(EPLMasking);
 				if(VerboseSolution()) _printf0_("Building EPL Matrix...\n");
+				femmodel->profiler->Start(EPLMatrices);
 				SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
 				CreateNodalConstraintsx(&ys,femmodel->nodes);
 				Reduceloadx(pf,Kfs,ys); delete Kfs;
 				delete uf_epl;
-
+				femmodel->profiler->Stop(EPLMatrices);
 				femmodel->profiler->Start(SOLVER);
 				Solverx(&uf_epl,Kff,pf,uf_epl_sub_iter,df,femmodel->parameters);
@@ -201,7 +210,9 @@
 				uf_epl->Copy(uf_epl_sub_iter);
 				delete ug_epl;
+				femmodel->profiler->Start(EPLUpdate);
 				Mergesolutionfromftogx(&ug_epl,uf_epl,ys,femmodel->nodes,femmodel->parameters); delete ys;
 				InputUpdateFromSolutionx(femmodel,ug_epl);
 				ConstraintsStatex(&constraints_converged,&num_unstable_constraints,femmodel);
+				femmodel->profiler->Stop(EPLUpdate);
 
 				dug=ug_epl_sub_iter->Duplicate();_assert_(dug);
@@ -230,4 +241,5 @@
 			}
 		}
+		femmodel->profiler->Stop(EPLLOOP);
 		/*}}}*//*End of the global EPL loop*/
 		/*{{{*//*Now dealing with the convergence of the whole system*/
Index: /issm/trunk-jpl/src/c/solutionsequences/solutionsequence_schurcg.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutionsequences/solutionsequence_schurcg.cpp	(revision 25538)
+++ /issm/trunk-jpl/src/c/solutionsequences/solutionsequence_schurcg.cpp	(revision 25539)
@@ -753,6 +753,6 @@
 		if(precond)
 		{
-			for(int i=0;i<femmodel->elements->Size();i++){
-				Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+			for(Object* & object : femmodel->elements->objects){
+				Element* element=xDynamicCast<Element*>(object);
 				ElementMatrix* Ie = analysis->CreateSchurPrecondMatrix(element);
 				if(Ie) Ie->AddToGlobal(Kff,NULL);
@@ -761,6 +761,6 @@
 		}else{
 			
-			for(int i=0;i<femmodel->elements->Size();i++){
-				Element* element2=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+			for(Object* & object : femmodel->elements->objects){
+				Element* element2=xDynamicCast<Element*>(object);
 				ElementMatrix* Ie2 = analysis->CreatePressureMassMatrix(element2);
 				if(Ie2) Ie2->AddToGlobal(Kff,NULL);
