Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 21772)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 21773)
@@ -2071,10 +2071,9 @@
 
 	/*intermediary: */
-	Element *element     = NULL;
 	IssmDouble   min_dt      = 0;
 	IssmDouble   node_min_dt = 0;
 
 	/*Go through elements, and figure out the minimum of the time steps for each element (using CFL criterion): */
-	element=(Element*)elements->GetObjectByOffset(0); min_dt=element->TimeAdapt();
+	Element* element=(Element*)elements->GetObjectByOffset(0); min_dt=element->TimeAdapt();
 
 	for (i=1;i<elements->Size();i++){
@@ -2088,4 +2087,15 @@
 	ISSM_MPI_Bcast(&node_min_dt,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
 	min_dt=node_min_dt;
+
+	/*Constrain dt if necessary*/
+	int timestepping_type;
+	IssmDouble dt_low,dt_high;
+	parameters->FindParam(&timestepping_type,TimesteppingTypeEnum);
+	if(timestepping_type==TimeAdaptationEnum){
+		parameters->FindParam(&dt_low,TimesteppingTimeStepMinEnum);
+		parameters->FindParam(&dt_high,TimesteppingTimeStepMaxEnum);
+		if(min_dt<dt_low)  min_dt = dt_low;
+		if(min_dt>dt_high) min_dt = dt_high;
+	}
 
 	/*Assign output pointers:*/
Index: /issm/trunk-jpl/src/c/classes/IoModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 21772)
+++ /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 21773)
@@ -603,4 +603,5 @@
 					if(strcmp(record_name,"md.hydrology.model")==0) integer = IoCodeToEnumHydrology(integer);
 					if(strcmp(record_name,"md.materials.type")==0) integer = IoCodeToEnumMaterials(integer);
+					if(strcmp(record_name,"md.timestepping.type")==0) integer = IoCodeToEnumTimestepping(integer);
 
 					/*Broadcast to other cpus*/
Index: /issm/trunk-jpl/src/c/cores/transient_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 21772)
+++ /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 21773)
@@ -44,5 +44,4 @@
 	femmodel->parameters->FindParam(&time,TimeEnum);
 	femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
-	femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
 	femmodel->parameters->FindParam(&yts,ConstantsYtsEnum);
 	femmodel->parameters->FindParam(&dakota_analysis,QmuIsdakotaEnum);
@@ -77,4 +76,7 @@
 			if(time+dt>finaltime) dt=finaltime-time;
 			femmodel->parameters->SetParam(dt,TimesteppingTimeStepEnum);
+		}
+		else{
+			femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
 		}
 		step+=1;
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 21772)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 21773)
@@ -19,5 +19,5 @@
 
 	int         i,j,m,k;
-	int         numoutputs,materialtype,smb_model,basalforcing_model;
+	int         numoutputs,materialtype,smb_model,basalforcing_model,timestepping_type;
 	char**      requestedoutputs = NULL;
 	IssmDouble  time;
@@ -46,10 +46,4 @@
 	parameters->AddObject(iomodel->CopyConstantObject("md.settings.recording_frequency",SettingsRecordingFrequencyEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.constants.yts",ConstantsYtsEnum));
-	parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.start_time",TimesteppingStartTimeEnum));
-	parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.final_time",TimesteppingFinalTimeEnum));
-	parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.time_adapt",TimesteppingTimeAdaptEnum));
-	parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.time_step",TimesteppingTimeStepEnum));
-	parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.cfl_coefficient",TimesteppingCflCoefficientEnum));
-	parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.interp_forcings",TimesteppingInterpForcingsEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.settings.lowmem",SettingsLowmemEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.debug.profiling",DebugProfilingEnum));
@@ -142,4 +136,28 @@
 	parameters->AddObject(new IntParam(SolutionTypeEnum,solution_type));
 
+	/*Time stepping*/
+	parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.type",TimesteppingTypeEnum));
+	iomodel->FindConstant(&timestepping_type,"md.timestepping.type");
+	switch(timestepping_type){
+		case FixedTimesteppingEnum:
+			parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.start_time",TimesteppingStartTimeEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.final_time",TimesteppingFinalTimeEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.time_adapt",TimesteppingTimeAdaptEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.time_step",TimesteppingTimeStepEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.cfl_coefficient",TimesteppingCflCoefficientEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.interp_forcings",TimesteppingInterpForcingsEnum));
+			break;
+		case TimeAdaptationEnum:
+			parameters->AddObject(new BoolParam(TimesteppingTimeAdaptEnum,true));
+			parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.start_time",TimesteppingStartTimeEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.final_time",TimesteppingFinalTimeEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.time_step_min",TimesteppingTimeStepMinEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.time_step_max",TimesteppingTimeStepMaxEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.cfl_coefficient",TimesteppingCflCoefficientEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.timestepping.interp_forcings",TimesteppingInterpForcingsEnum));
+			break;
+		default:
+			_error_(EnumToStringx(timestepping_type) <<" not supported yet");
+	}
 	iomodel->FindConstant(&time,"md.timestepping.start_time");
 	parameters->AddObject(new DoubleParam(TimeEnum,time));  
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 21772)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 21773)
@@ -30,4 +30,9 @@
 	SmoothThicknessMultiplierEnum,
 	LevelsetStabilizationEnum,
+	TimesteppingTypeEnum,
+	FixedTimesteppingEnum,
+	TimeAdaptationEnum,
+	TimesteppingTimeStepMinEnum,
+	TimesteppingTimeStepMaxEnum,
 	/*}}}*/
 	/*Model fields {{{*/
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 21772)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 21773)
@@ -38,4 +38,9 @@
 		case SmoothThicknessMultiplierEnum : return "SmoothThicknessMultiplier";
 		case LevelsetStabilizationEnum : return "LevelsetStabilization";
+		case TimesteppingTypeEnum : return "TimesteppingType";
+		case FixedTimesteppingEnum : return "FixedTimestepping";
+		case TimeAdaptationEnum : return "TimeAdaptation";
+		case TimesteppingTimeStepMinEnum : return "TimesteppingTimeStepMin";
+		case TimesteppingTimeStepMaxEnum : return "TimesteppingTimeStepMax";
 		case AutodiffIsautodiffEnum : return "AutodiffIsautodiff";
 		case AutodiffNumDependentsEnum : return "AutodiffNumDependents";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 21772)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 21773)
@@ -38,4 +38,9 @@
 	      else if (strcmp(name,"SmoothThicknessMultiplier")==0) return SmoothThicknessMultiplierEnum;
 	      else if (strcmp(name,"LevelsetStabilization")==0) return LevelsetStabilizationEnum;
+	      else if (strcmp(name,"TimesteppingType")==0) return TimesteppingTypeEnum;
+	      else if (strcmp(name,"FixedTimestepping")==0) return FixedTimesteppingEnum;
+	      else if (strcmp(name,"TimeAdaptation")==0) return TimeAdaptationEnum;
+	      else if (strcmp(name,"TimesteppingTimeStepMin")==0) return TimesteppingTimeStepMinEnum;
+	      else if (strcmp(name,"TimesteppingTimeStepMax")==0) return TimesteppingTimeStepMaxEnum;
 	      else if (strcmp(name,"AutodiffIsautodiff")==0) return AutodiffIsautodiffEnum;
 	      else if (strcmp(name,"AutodiffNumDependents")==0) return AutodiffNumDependentsEnum;
@@ -132,13 +137,13 @@
 	      else if (strcmp(name,"Hydrologydc")==0) return HydrologydcEnum;
 	      else if (strcmp(name,"SedimentHead")==0) return SedimentHeadEnum;
-	      else if (strcmp(name,"SedimentHeadOld")==0) return SedimentHeadOldEnum;
+         else stage=2;
+   }
+   if(stage==2){
+	      if (strcmp(name,"SedimentHeadOld")==0) return SedimentHeadOldEnum;
 	      else if (strcmp(name,"SedimentHeadResidual")==0) return SedimentHeadResidualEnum;
 	      else if (strcmp(name,"EffectivePressure")==0) return EffectivePressureEnum;
 	      else if (strcmp(name,"EplHead")==0) return EplHeadEnum;
 	      else if (strcmp(name,"EplHeadOld")==0) return EplHeadOldEnum;
-         else stage=2;
-   }
-   if(stage==2){
-	      if (strcmp(name,"EplHeadSlopeX")==0) return EplHeadSlopeXEnum;
+	      else if (strcmp(name,"EplHeadSlopeX")==0) return EplHeadSlopeXEnum;
 	      else if (strcmp(name,"EplHeadSlopeY")==0) return EplHeadSlopeYEnum;
 	      else if (strcmp(name,"EplZigZagCounter")==0) return EplZigZagCounterEnum;
@@ -255,13 +260,13 @@
 	      else if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum;
 	      else if (strcmp(name,"CalvingLaw")==0) return CalvingLawEnum;
-	      else if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
+         else stage=3;
+   }
+   if(stage==3){
+	      if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
 	      else if (strcmp(name,"CalvingMeltingrate")==0) return CalvingMeltingrateEnum;
 	      else if (strcmp(name,"CalvingLevermann")==0) return CalvingLevermannEnum;
 	      else if (strcmp(name,"CalvingDev")==0) return CalvingDevEnum;
 	      else if (strcmp(name,"CalvingMinthickness")==0) return CalvingMinthicknessEnum;
-         else stage=3;
-   }
-   if(stage==3){
-	      if (strcmp(name,"DefaultCalving")==0) return DefaultCalvingEnum;
+	      else if (strcmp(name,"DefaultCalving")==0) return DefaultCalvingEnum;
 	      else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum;
 	      else if (strcmp(name,"CalvinglevermannMeltingrate")==0) return CalvinglevermannMeltingrateEnum;
@@ -378,13 +383,13 @@
 	      else if (strcmp(name,"BalancethicknessD0")==0) return BalancethicknessD0Enum;
 	      else if (strcmp(name,"Smb")==0) return SmbEnum;
-	      else if (strcmp(name,"SmbAnalysis")==0) return SmbAnalysisEnum;
+         else stage=4;
+   }
+   if(stage==4){
+	      if (strcmp(name,"SmbAnalysis")==0) return SmbAnalysisEnum;
 	      else if (strcmp(name,"SmbSolution")==0) return SmbSolutionEnum;
 	      else if (strcmp(name,"SmbNumRequestedOutputs")==0) return SmbNumRequestedOutputsEnum;
 	      else if (strcmp(name,"SmbRequestedOutputs")==0) return SmbRequestedOutputsEnum;
 	      else if (strcmp(name,"SmbIsInitialized")==0) return SmbIsInitializedEnum;
-         else stage=4;
-   }
-   if(stage==4){
-	      if (strcmp(name,"SmbDzini")==0) return SmbDziniEnum;
+	      else if (strcmp(name,"SmbDzini")==0) return SmbDziniEnum;
 	      else if (strcmp(name,"SmbDini")==0) return SmbDiniEnum;
 	      else if (strcmp(name,"SmbReini")==0) return SmbReiniEnum;
@@ -501,13 +506,13 @@
 	      else if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
 	      else if (strcmp(name,"Misfit")==0) return MisfitEnum;
-	      else if (strcmp(name,"Pressure")==0) return PressureEnum;
+         else stage=5;
+   }
+   if(stage==5){
+	      if (strcmp(name,"Pressure")==0) return PressureEnum;
 	      else if (strcmp(name,"PressurePicard")==0) return PressurePicardEnum;
 	      else if (strcmp(name,"AndroidFrictionCoefficient")==0) return AndroidFrictionCoefficientEnum;
 	      else if (strcmp(name,"ResetPenalties")==0) return ResetPenaltiesEnum;
 	      else if (strcmp(name,"SurfaceAbsVelMisfit")==0) return SurfaceAbsVelMisfitEnum;
-         else stage=5;
-   }
-   if(stage==5){
-	      if (strcmp(name,"SurfaceArea")==0) return SurfaceAreaEnum;
+	      else if (strcmp(name,"SurfaceArea")==0) return SurfaceAreaEnum;
 	      else if (strcmp(name,"SurfaceAverageVelMisfit")==0) return SurfaceAverageVelMisfitEnum;
 	      else if (strcmp(name,"SurfaceLogVelMisfit")==0) return SurfaceLogVelMisfitEnum;
@@ -624,13 +629,13 @@
 	      else if (strcmp(name,"Outputdefinition22")==0) return Outputdefinition22Enum;
 	      else if (strcmp(name,"Outputdefinition23")==0) return Outputdefinition23Enum;
-	      else if (strcmp(name,"Outputdefinition24")==0) return Outputdefinition24Enum;
+         else stage=6;
+   }
+   if(stage==6){
+	      if (strcmp(name,"Outputdefinition24")==0) return Outputdefinition24Enum;
 	      else if (strcmp(name,"Outputdefinition25")==0) return Outputdefinition25Enum;
 	      else if (strcmp(name,"Outputdefinition26")==0) return Outputdefinition26Enum;
 	      else if (strcmp(name,"Outputdefinition27")==0) return Outputdefinition27Enum;
 	      else if (strcmp(name,"Outputdefinition28")==0) return Outputdefinition28Enum;
-         else stage=6;
-   }
-   if(stage==6){
-	      if (strcmp(name,"Outputdefinition29")==0) return Outputdefinition29Enum;
+	      else if (strcmp(name,"Outputdefinition29")==0) return Outputdefinition29Enum;
 	      else if (strcmp(name,"Outputdefinition30")==0) return Outputdefinition30Enum;
 	      else if (strcmp(name,"Outputdefinition31")==0) return Outputdefinition31Enum;
@@ -747,13 +752,13 @@
 	      else if (strcmp(name,"InputFileName")==0) return InputFileNameEnum;
 	      else if (strcmp(name,"LockFileName")==0) return LockFileNameEnum;
-	      else if (strcmp(name,"RestartFileName")==0) return RestartFileNameEnum;
+         else stage=7;
+   }
+   if(stage==7){
+	      if (strcmp(name,"RestartFileName")==0) return RestartFileNameEnum;
 	      else if (strcmp(name,"ToolkitsOptionsAnalyses")==0) return ToolkitsOptionsAnalysesEnum;
 	      else if (strcmp(name,"ToolkitsOptionsStrings")==0) return ToolkitsOptionsStringsEnum;
 	      else if (strcmp(name,"QmuErrName")==0) return QmuErrNameEnum;
 	      else if (strcmp(name,"QmuInName")==0) return QmuInNameEnum;
-         else stage=7;
-   }
-   if(stage==7){
-	      if (strcmp(name,"QmuOutName")==0) return QmuOutNameEnum;
+	      else if (strcmp(name,"QmuOutName")==0) return QmuOutNameEnum;
 	      else if (strcmp(name,"Regular")==0) return RegularEnum;
 	      else if (strcmp(name,"Scaled")==0) return ScaledEnum;
@@ -870,13 +875,13 @@
 	      else if (strcmp(name,"ElementSId")==0) return ElementSIdEnum;
 	      else if (strcmp(name,"VectorParam")==0) return VectorParamEnum;
-	      else if (strcmp(name,"Riftfront")==0) return RiftfrontEnum;
+         else stage=8;
+   }
+   if(stage==8){
+	      if (strcmp(name,"Riftfront")==0) return RiftfrontEnum;
 	      else if (strcmp(name,"Segment")==0) return SegmentEnum;
 	      else if (strcmp(name,"SegmentRiftfront")==0) return SegmentRiftfrontEnum;
 	      else if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum;
 	      else if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum;
-         else stage=8;
-   }
-   if(stage==8){
-	      if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
+	      else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
 	      else if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum;
 	      else if (strcmp(name,"StringParam")==0) return StringParamEnum;
@@ -993,13 +998,13 @@
 	      else if (strcmp(name,"P2")==0) return P2Enum;
 	      else if (strcmp(name,"P2bubble")==0) return P2bubbleEnum;
-	      else if (strcmp(name,"P2bubblecondensed")==0) return P2bubblecondensedEnum;
+         else stage=9;
+   }
+   if(stage==9){
+	      if (strcmp(name,"P2bubblecondensed")==0) return P2bubblecondensedEnum;
 	      else if (strcmp(name,"P2xP1")==0) return P2xP1Enum;
 	      else if (strcmp(name,"P1xP2")==0) return P1xP2Enum;
 	      else if (strcmp(name,"P1xP3")==0) return P1xP3Enum;
 	      else if (strcmp(name,"P2xP4")==0) return P2xP4Enum;
-         else stage=9;
-   }
-   if(stage==9){
-	      if (strcmp(name,"P1P1")==0) return P1P1Enum;
+	      else if (strcmp(name,"P1P1")==0) return P1P1Enum;
 	      else if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum;
 	      else if (strcmp(name,"MINI")==0) return MINIEnum;
Index: /issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp	(revision 21772)
+++ /issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp	(revision 21773)
@@ -121,4 +121,11 @@
 	}
 }/*}}}*/
+int IoCodeToEnumTimestepping(int enum_in){/*{{{*/
+	switch(enum_in){
+		case 1: return FixedTimesteppingEnum;
+		case 2: return TimeAdaptationEnum; 
+		default: _error_("Marshalled materials code \""<<enum_in<<"\" not supported yet"); 
+	}
+}/*}}}*/
 
 int IoCodeToEnumVertexEquation(int enum_in){/*{{{*/
Index: /issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.h	(revision 21772)
+++ /issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.h	(revision 21773)
@@ -9,4 +9,5 @@
 int IoCodeToEnumHydrology(int enum_in);
 int IoCodeToEnumMaterials(int enum_in);
+int IoCodeToEnumTimestepping(int enum_in);
 
 int IoCodeToEnumVertexEquation(int enum_in);
