Index: /issm/trunk/src/c/EnumDefinitions/EnumAsString.cpp
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumAsString.cpp	(revision 4977)
+++ /issm/trunk/src/c/EnumDefinitions/EnumAsString.cpp	(revision 4978)
@@ -268,5 +268,4 @@
 		case EpsRelEnum : return "EpsRel";
 		case EpsResEnum : return "EpsRes";
-		case ExtrudeParamEnum : return "ExtrudeParam";
 		case HeatCapacityEnum : return "HeatCapacity";
 		case IsHutterEnum : return "IsHutter";
Index: /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 4977)
+++ /issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h	(revision 4978)
@@ -305,5 +305,4 @@
 	EpsRelEnum,
 	EpsResEnum,
-	ExtrudeParamEnum,
 	HeatCapacityEnum,
 	IsHutterEnum,
Index: /issm/trunk/src/c/EnumDefinitions/StringAsEnum.cpp
===================================================================
--- /issm/trunk/src/c/EnumDefinitions/StringAsEnum.cpp	(revision 4977)
+++ /issm/trunk/src/c/EnumDefinitions/StringAsEnum.cpp	(revision 4978)
@@ -266,5 +266,4 @@
 	else if (strcmp(name,"EpsRel")==0) return EpsRelEnum;
 	else if (strcmp(name,"EpsRes")==0) return EpsResEnum;
-	else if (strcmp(name,"ExtrudeParam")==0) return ExtrudeParamEnum;
 	else if (strcmp(name,"HeatCapacity")==0) return HeatCapacityEnum;
 	else if (strcmp(name,"IsHutter")==0) return IsHutterEnum;
Index: /issm/trunk/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 4977)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 4978)
@@ -26,9 +26,7 @@
 
 		if (strcmp(iomodel->control_type,"drag_coefficient")==0){
-			parameters->AddObject(new BoolParam(ExtrudeParamEnum,false));
 			parameters->AddObject(new IntParam(ControlTypeEnum,DragCoefficientEnum));
 		}
 		else  if (strcmp(iomodel->control_type,"rheology_B")==0){
-			parameters->AddObject(new BoolParam(ExtrudeParamEnum,true));
 			parameters->AddObject(new IntParam(ControlTypeEnum,RheologyB2dEnum));
 		}
Index: /issm/trunk/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 4977)
+++ /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 4978)
@@ -697,14 +697,29 @@
 		/*This element should be collapsed into a tria element at its base. Create this tria element, 
 		 * and compute CostFunction*/
+
+		/*Depth Average B*/
+		this->InputDepthAverageAtBase(RheologyBEnum,RheologyB2dEnum,MaterialsEnum);
+
 		tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria (lower face).
 		J=tria->CostFunction(process_units);
 		delete tria;
+
+		/*delete B average*/
+		this->matice->inputs->DeleteInput(RheologyB2dEnum);
+
 		return J;
 	}
 	else{
+
+		/*Depth Average B*/
+		this->InputDepthAverageAtBase(RheologyBEnum,RheologyB2dEnum,MaterialsEnum);
 
 		tria=(Tria*)SpawnTria(3,4,5); //grids 3, 4 and 5 make the new tria (upper face).
 		J=tria->CostFunction(process_units);
 		delete tria;
+
+		/*delete B average*/
+		this->matice->inputs->DeleteInput(RheologyB2dEnum);
+
 		return J;
 	}
@@ -994,4 +1009,5 @@
 	double cm_min,cm_max;
 	int    control_type;
+	bool   onbed;
 
 	/*retrieve some parameters: */
@@ -1000,7 +1016,10 @@
 	this->parameters->FindParam(&control_type,ControlTypeEnum);
 
-
 	/*Rheology*/
 	if(control_type==RheologyB2dEnum){
+
+		/*The update is done by the element on bed only*/
+		inputs->GetParameterValue(&onbed,ElementOnBedEnum);
+		if (!onbed) return;
 
 		/*First, get revert to previous parameter value (kept in ControlParameter input)*/
@@ -1018,6 +1037,12 @@
 		input->Constrain(cm_min,cm_max);
 
+		/*OK, now we can propagate the new parameter up*/
+		this->InputExtrude(RheologyBEnum,MaterialsEnum);
+
 		/*Finally: save input if requested*/
-		if (save_parameter) matice->inputs->DuplicateInput(RheologyBEnum,ControlParameterEnum);
+		if (save_parameter){
+			matice->inputs->DuplicateInput(RheologyBEnum,ControlParameterEnum);
+			this->InputExtrude(ControlParameterEnum,MaterialsEnum);
+		}
 
 	}
@@ -1174,5 +1199,5 @@
 	/*Go through all the input objects, and find the one corresponding to enum_type, if it exists: */
 	if (enum_type==RheologyB2dEnum){
-		input=this->matice->inputs->GetInput(enum_type);
+		input=this->matice->inputs->GetInput(RheologyBEnum);
 	}
 	else{
@@ -4671,15 +4696,27 @@
 		/*This element should be collapsed into a tria element at its base. Create this tria element, 
 		 * and compute gardj*/
+
+		/*Depth Average B*/
+		this->InputDepthAverageAtBase(RheologyBEnum,RheologyB2dEnum,MaterialsEnum);
+
 		tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria (lower face).
 		tria->GradjB(gradient);
 		delete tria;
+
+		/*delete B average*/
+		this->matice->inputs->DeleteInput(RheologyB2dEnum);
 	}
 	else{
+		/*Depth Average B*/
+		this->InputDepthAverageAtBase(RheologyBEnum,RheologyB2dEnum,MaterialsEnum);
+
 		/*B is a 2d field, use MacAyeal(2d) gradient even if it is Stokes or Pattyn*/
 		tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria (lower face).
 		tria->GradjB(gradient);
 		delete tria;
-	}
-
+
+		/*delete B average*/
+		this->matice->inputs->DeleteInput(RheologyB2dEnum);
+	}
 
 }
@@ -4736,16 +4773,12 @@
 /*}}}*/
 /*FUNCTION Penta::InputExtrude {{{1*/
-void  Penta::InputExtrude(int enum_type,bool only_if_collapsed){
-
-	bool   onbed,collapse=false;
+void  Penta::InputExtrude(int enum_type,int object_type){
+
+	bool   onbed;
 	Penta *penta          = NULL;
 	Input *original_input = NULL;
 
 	/*recover parameters: */
-	if (only_if_collapsed) inputs->GetParameterValue(&collapse,CollapseEnum);
 	inputs->GetParameterValue(&onbed,ElementOnBedEnum);
-
-	/*First: if only_if_collapsed, check wether this penta is collapsed*/
-	if (only_if_collapsed && !collapse) return;
 
 	/*Are we on the base, not on the surface?:*/
@@ -4758,5 +4791,10 @@
 
 		/*Step1: Extrude the original input: */
-		original_input=(Input*)this->inputs->GetInput(enum_type);
+		if (object_type==ElementsEnum)
+		 original_input=(Input*)this->inputs->GetInput(enum_type);
+		else if (object_type==MaterialsEnum)
+		 original_input=(Input*)matice->inputs->GetInput(enum_type);
+		else
+		 ISSMERROR("object of type %s not supported yet",EnumAsString(object_type));
 		if(!original_input) ISSMERROR("%s%s"," could not find input with enum:",EnumAsString(enum_type));
 		original_input->Extrude();
@@ -4776,5 +4814,10 @@
 			Input* copy=NULL;
 			copy=(Input*)original_input->copy();
-			penta->inputs->AddInput((Input*)copy);
+			if (object_type==ElementsEnum)
+			 penta->inputs->AddInput((Input*)copy);
+			else if (object_type==MaterialsEnum)
+			 penta->matice->inputs->AddInput((Input*)copy);
+			else
+			 ISSMERROR("object of type %s not supported yet",EnumAsString(object_type));
 
 			/*Stop if we have reached the surface*/
Index: /issm/trunk/src/c/objects/Elements/Penta.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.h	(revision 4977)
+++ /issm/trunk/src/c/objects/Elements/Penta.h	(revision 4978)
@@ -156,5 +156,5 @@
 		void    GetStrainRate3d(double* epsilon,double* xyz_list, double* gauss, Input* vx_input, Input* vy_input, Input* vz_input);
 		Penta*  GetUpperElement(void);
-		void	  InputExtrude(int enum_type,bool only_if_collapsed);
+		void	  InputExtrude(int enum_type,int object_type);
 		void    InputUpdateFromSolutionAdjointHoriz( double* solutiong);
 		void    InputUpdateFromSolutionAdjointStokes( double* solutiong);
Index: /issm/trunk/src/c/objects/Materials/Matice.cpp
===================================================================
--- /issm/trunk/src/c/objects/Materials/Matice.cpp	(revision 4977)
+++ /issm/trunk/src/c/objects/Materials/Matice.cpp	(revision 4978)
@@ -547,5 +547,4 @@
 
 	/*Call inputs method*/
-	printf("%s\n",EnumAsString(original_enum));
 	if (IsInput(original_enum)) inputs->DuplicateInput(original_enum,new_enum);
 
Index: sm/trunk/src/m/enum/ExtrudeParamEnum.m
===================================================================
--- /issm/trunk/src/m/enum/ExtrudeParamEnum.m	(revision 4977)
+++ 	(revision )
@@ -1,11 +1,0 @@
-function macro=ExtrudeParamEnum()
-%EXTRUDEPARAMENUM - Enum of ExtrudeParam
-%
-%   WARNING: DO NOT MODIFY THIS FILE
-%            this file has been automatically generated by src/c/SynchronizeMatlabEnum
-%            Please read src/c/README for more information
-%
-%   Usage:
-%      macro=ExtrudeParamEnum()
-
-macro=252;
