Index: /issm/trunk-jpl/src/c/classes/DofIndexing.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/DofIndexing.cpp	(revision 20461)
+++ /issm/trunk-jpl/src/c/classes/DofIndexing.cpp	(revision 20462)
@@ -28,4 +28,5 @@
 	this->clone    = false;
 	this->active   = true;
+	this->freeze   = false;
 	this->f_set    = NULL;
 	this->s_set    = NULL;
@@ -51,4 +52,5 @@
 	this->clone  = in->clone;
 	this->active = in->active;
+	this->freeze = in->freeze;
 
 	if(this->gsize>0){
@@ -112,4 +114,5 @@
 	this->clone  = in.clone;
 	this->active = in.active;
+	this->freeze = in.freeze;
 
 	if(this->gsize>0){
@@ -219,4 +222,5 @@
 	_printf_("   clone:  " << clone << "\n");
 	_printf_("   active: " << active << "\n");
+	_printf_("   freeze: " << freeze << "\n");
 }
 /*}}}*/
@@ -231,4 +235,5 @@
 	_printf_("   clone:  " << clone << "\n");
 	_printf_("   active: " << active << "\n");
+	_printf_("   freeze: " << freeze << "\n");
 
 	_printf_("   set membership: f,s sets \n");
@@ -284,4 +289,5 @@
 /*}}}*/
 void DofIndexing::Activate(void){/*{{{*/
+
 	this->active = true;
 
@@ -302,4 +308,5 @@
 	MARSHALLING(clone);
 	MARSHALLING(active);
+	MARSHALLING(freeze);
 	MARSHALLING_DYNAMIC(f_set,bool,gsize);
 	MARSHALLING_DYNAMIC(s_set,bool,gsize);
Index: /issm/trunk-jpl/src/c/classes/DofIndexing.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/DofIndexing.h	(revision 20461)
+++ /issm/trunk-jpl/src/c/classes/DofIndexing.h	(revision 20462)
@@ -18,6 +18,7 @@
 
 		/*partitioning: */
-		bool clone;   //this node is replicated from another one
-		bool active;  //Is this node active or inactive (all dofs are constrained)
+		bool clone;  //this node is replicated from another one
+		bool active; //Is this node active or inactive (all dofs are constrained)
+		bool freeze; //this is required for 2d solutions, we never activate nodes that are not on base
 
 		/*boundary conditions sets: */
Index: /issm/trunk-jpl/src/c/classes/Loads/Riftfront.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Riftfront.cpp	(revision 20461)
+++ /issm/trunk-jpl/src/c/classes/Loads/Riftfront.cpp	(revision 20462)
@@ -253,5 +253,5 @@
 void  Riftfront::InputUpdateFromVector(IssmDouble* vector, int name, int type){/*{{{*/
 
-	_error_("not implemented yet");
+	/*Nothing to update*/
 
 }
Index: /issm/trunk-jpl/src/c/classes/Node.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Node.cpp	(revision 20461)
+++ /issm/trunk-jpl/src/c/classes/Node.cpp	(revision 20462)
@@ -64,12 +64,12 @@
 			_assert_(iomodel->Data(FlowequationVertexEquationEnum));
 			if(in_approximation==SSAApproximationEnum && !reCast<int>(iomodel->Data(MeshVertexonbaseEnum)[io_index])){
-				this->Deactivate();
+				this->HardDeactivate();
 			}
 			if(in_approximation==L1L2ApproximationEnum && !reCast<int>(iomodel->Data(MeshVertexonbaseEnum)[io_index])){
-				this->Deactivate();
+				this->HardDeactivate();
 			}
 			if(in_approximation==SSAHOApproximationEnum && reCast<int>(iomodel->Data(FlowequationBorderSSAEnum)[io_index])){
 				if(!reCast<int>(iomodel->Data(MeshVertexonbaseEnum)[io_index])){
-					this->Deactivate();
+					this->HardDeactivate();
 				}
 			}
@@ -82,5 +82,5 @@
 		/*spc all nodes on SIA*/
 		if(in_approximation==SIAApproximationEnum){
-			this->Deactivate();
+			this->HardDeactivate();
 		}
 	}
@@ -101,5 +101,5 @@
 			_assert_(iomodel->Data(MeshVertexonbaseEnum));
 			if(!(reCast<bool>(iomodel->Data(MeshVertexonbaseEnum)[io_index]))){
-				this->Deactivate();
+				this->HardDeactivate();
 			}
 		}
@@ -112,5 +112,5 @@
 			_assert_(iomodel->Data(MeshVertexonsurfaceEnum));
 			if(!(reCast<bool>(iomodel->Data(MeshVertexonsurfaceEnum)[io_index]))){
-				this->Deactivate();
+				this->HardDeactivate();
 			}
 		}
@@ -463,4 +463,5 @@
 
 	if(this->indexing.f_set[dof] == 1){
+		//if(this->indexing.freeze) _error_("Cannot change dof of frozen node");
 		this->indexingupdate = true;
 		this->indexing.f_set[dof]=0; //n splits into f (for which we solve) and s (single point constraints)
@@ -476,4 +477,5 @@
 
 	if(this->indexing.f_set[dof] == 0){
+		if(this->indexing.freeze) _error_("Cannot change dof of frozen node");
 		this->indexingupdate = true;
 		this->indexing.f_set[dof]=1; 
@@ -485,4 +487,6 @@
 
 	DofInSSet(dof); //with 0 displacement for this dof.
+	//FIXME: for now we don't want this element to change so we use freeze
+	this->indexing.freeze =true;
 
 }
@@ -490,5 +494,5 @@
 void Node::Deactivate(void){/*{{{*/
 
-	if(IsActive()){
+	if(IsActive() && !this->indexing.freeze){
 		this->indexingupdate = true;
 		indexing.Deactivate();
@@ -497,7 +501,14 @@
 }
 /*}}}*/
+void Node::HardDeactivate(void){/*{{{*/
+
+	this->indexing.Deactivate();
+	this->indexing.freeze =true;
+
+}
+/*}}}*/
 void Node::Activate(void){/*{{{*/
 
-	if(!IsActive()){
+	if(!IsActive() && !this->indexing.freeze){
 		this->indexingupdate = true;
 		indexing.Activate();
Index: /issm/trunk-jpl/src/c/classes/Node.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Node.h	(revision 20461)
+++ /issm/trunk-jpl/src/c/classes/Node.h	(revision 20462)
@@ -73,4 +73,5 @@
 		void  Activate(void);
 		void  Deactivate(void);
+		void  HardDeactivate(void);
 		void  ReindexingDone(void);
 		bool  RequiresDofReindexing(void);
Index: /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp	(revision 20461)
+++ /issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp	(revision 20462)
@@ -49,37 +49,4 @@
 		}
 
-		/* if solving 2d problem on vertically extende mesh, solve on basal layer only*/
-		if(domaintype!=Domain2DhorizontalEnum){
-			femmodel->parameters->FindParam(&analysis_type,AnalysisTypeEnum);
-			if(
-					analysis_type==FreeSurfaceBaseAnalysisEnum || 
-					analysis_type==MasstransportAnalysisEnum || 
-					analysis_type==MeltingAnalysisEnum || 
-					analysis_type==L2ProjectionBaseAnalysisEnum || 
-					analysis_type==BalancethicknessAnalysisEnum ||
-					analysis_type==HydrologyDCInefficientAnalysisEnum ||
-					//analysis_type==DamageEvolutionAnalysisEnum || 
-					analysis_type==HydrologyDCEfficientAnalysisEnum ||
-					analysis_type==LevelsetAnalysisEnum ||
-					analysis_type==ExtrapolationAnalysisEnum
-					){ solvein2d=true;}
-
-			if(analysis_type==StressbalanceAnalysisEnum){
-				bool isSIA,isSSA,isL1L2;
-				femmodel->parameters->FindParam(&isSIA,FlowequationIsSIAEnum);
-				femmodel->parameters->FindParam(&isSSA,FlowequationIsSSAEnum);
-				femmodel->parameters->FindParam(&isL1L2,FlowequationIsL1L2Enum);
-				if(isSIA || isSSA || isL1L2)
-					solvein2d=true;
-			}
-
-			if(solvein2d){
-				IssmDouble *mask_isonbase = xNew<IssmDouble>(numnodes);
-				element->GetInputListOnNodes(&mask_isonbase[0],MeshVertexonbaseEnum);
-				for(in=0;in<numnodes;in++)	 mask[in]*=mask_isonbase[in];
-				xDelete<IssmDouble>(mask_isonbase);
-			}
-		}
-
 		for(in=0;in<numnodes;in++){
 			Node* node=element->GetNode(in);
