Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 17578)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 17579)
@@ -295,4 +295,5 @@
 
 		virtual void   MigrateGroundingLine(IssmDouble* sheet_ungrounding)=0;
+		virtual void   FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating)=0;
 		virtual void   PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding)=0;
 		virtual int    UpdatePotentialUngrounding(IssmDouble* potential_sheet_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf)=0;
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 17578)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 17579)
@@ -60,4 +60,5 @@
 		void   ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
 		int    FiniteElement(void);
+		void   FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating){_error_("not implemented yet");};
 		void   SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
 		void   Delta18oParameterization(void);
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 17578)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 17579)
@@ -60,4 +60,5 @@
 		void        Delta18oParameterization(void){_error_("not implemented yet");};
 		void        ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){_error_("not implemented yet");};
+		void        FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating){_error_("not implemented yet");};
 		int         FiniteElement(void);
 		Element*    GetUpperElement(void){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tetra.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 17578)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 17579)
@@ -63,4 +63,5 @@
 		void        FaceOnBedIndices(int* pindex1,int* pindex2,int* pindex3);
 		void        FaceOnSurfaceIndices(int* pindex1,int* pindex2,int* pindex3);
+		void        FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating){_error_("not implemented yet");};
 		int         FiniteElement(void);
 		Element*    GetUpperElement(void){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 17578)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 17579)
@@ -59,4 +59,5 @@
 		void        Delta18oParameterization(void);
 		void        ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
+		void        FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating){_error_("not implemented yet");};
 		int         FiniteElement(void);
 		Element*    GetUpperElement(void){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 17578)
+++ /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 17579)
@@ -23,19 +23,24 @@
 	if(migration_style==NoneEnum) return;
 
-	if(migration_style!=AgressiveMigrationEnum  &&
-		migration_style!=SoftMigrationEnum       &&
-		migration_style!=SubelementMigrationEnum &&
-		migration_style!=SubelementMigration2Enum)
-	 _error_("Grounding line migration "<<EnumToStringx(migration_style) << " not supported yet!");
-
 	/*Set toolkit to default*/
 	ToolkitsOptionsFromAnalysis(parameters,DefaultAnalysisEnum);
 
-	if(migration_style==SoftMigrationEnum){
-		/*Create flag for grounded vertices above the hydrostatic equilibrium: */
-		vertices_potentially_ungrounding=PotentialUngrounding(elements,vertices,parameters);
-
-		/*propagate ice shelf into connex areas of the ice sheet that potentially want to unground: */
-		phi_ungrounding=PropagateFloatingiceToGroundedNeighbors(elements,nodes,vertices,parameters,vertices_potentially_ungrounding);
+	switch(migration_style){
+		case SoftMigrationEnum:
+			/*Create flag for grounded vertices above the hydrostatic equilibrium: */
+			vertices_potentially_ungrounding=PotentialUngrounding(elements,vertices,parameters);
+			/*propagate ice shelf into connex areas of the ice sheet that potentially want to unground: */
+			phi_ungrounding=PropagateFloatingiceToGroundedNeighbors(elements,nodes,vertices,parameters,vertices_potentially_ungrounding);
+			break;
+		case ContactEnum:
+			phi_ungrounding=ContactFSLevelset(elements,vertices);
+			break;
+		case AgressiveMigrationEnum:
+		case SubelementMigrationEnum:
+		case SubelementMigration2Enum:
+			/*Nothing additional to do here, MigrateGroundingLine takes care of everything*/
+			break;
+		default:
+			_error_("Grounding line migration "<<EnumToStringx(migration_style) << " not supported yet!");
 	}
 
@@ -51,4 +56,55 @@
 }
 
+/*FUNCTION ContactFSLevelset{{{*/
+IssmDouble*    ContactFSLevelset(Elements* elements,Vertices* vertices){ 
+
+	Vector<IssmDouble>* vertexgrounded = NULL;
+	Vector<IssmDouble>* vertexfloating = NULL;
+	IssmDouble*  serial_vertexgrounded = NULL;
+	IssmDouble*  serial_vertexfloating = NULL;
+	IssmDouble*  phi                   = NULL;
+
+	/*Initialize vector with number of vertices*/
+	int numberofvertices=vertices->NumberOfVertices();
+	vertexgrounded=new Vector<IssmDouble>(numberofvertices);
+	vertexfloating=new Vector<IssmDouble>(numberofvertices);
+	phi           =xNew<IssmDouble>(numberofvertices);
+
+	/*Fill vector vertices_potentially_floating: */
+	for(int i=0;i<elements->Size();i++){
+		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
+		element->FSContactMigration(vertexgrounded,vertexfloating);
+	}
+
+	/*Assemble vector and serialize */
+	vertexgrounded->Assemble();
+	vertexfloating->Assemble();
+	serial_vertexgrounded=vertexgrounded->ToMPISerial();
+	serial_vertexfloating=vertexfloating->ToMPISerial();
+
+	for(int i=0;i<numberofvertices;i++){
+		if(serial_vertexgrounded[i]==1. && serial_vertexfloating[i]==1.){
+			phi[i]=0.;
+		}
+		else if(serial_vertexgrounded[i]==1.){
+			phi[i]=1.;
+		}
+		else if(serial_vertexfloating[i]==1.){
+			phi[i]=-1.;
+		}
+		else{
+			_error_("not supported");
+		}
+	}
+
+	/*free ressouces and return: */
+	delete vertexgrounded;
+	delete vertexfloating;
+	xDelete<IssmDouble>(serial_vertexgrounded);
+	xDelete<IssmDouble>(serial_vertexfloating);
+
+	return phi;
+}
+/*}}}*/
 /*FUNCTION PotentialUngrounding {{{*/
 IssmDouble*    PotentialUngrounding(Elements* elements,Vertices* vertices,Parameters* parameters){ 
Index: /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.h	(revision 17578)
+++ /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.h	(revision 17579)
@@ -13,4 +13,5 @@
 /* local prototypes: */
 void         GroundinglineMigrationx(Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads,Materials* materials, Parameters* parameters);
+IssmDouble*  ContactFSLevelset(Elements* elements,Vertices* vertices);
 IssmDouble*  PotentialUngrounding(Elements* elements,Vertices* vertices,Parameters* parameters);
 IssmDouble*  PropagateFloatingiceToGroundedNeighbors(Elements* elements,Nodes* nodes,Vertices* vertices,Parameters* parameters,IssmDouble* vertices_potentially_ungrounding);
Index: /issm/trunk-jpl/src/m/classes/groundingline.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/groundingline.m	(revision 17578)
+++ /issm/trunk-jpl/src/m/classes/groundingline.m	(revision 17579)
@@ -29,5 +29,5 @@
 		function md = checkconsistency(obj,md,solution,analyses) % {{{
 
-			md = checkfield(md,'fieldname','groundingline.migration','values',{'None' 'AgressiveMigration' 'SoftMigration' 'SubelementMigration','SubelementMigration2'});
+			md = checkfield(md,'fieldname','groundingline.migration','values',{'None' 'AgressiveMigration' 'SoftMigration' 'SubelementMigration','SubelementMigration2' 'Contact'});
 
 			if ~strcmp(obj.migration,'None'),
Index: /issm/trunk-jpl/src/m/classes/groundingline.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/groundingline.py	(revision 17578)
+++ /issm/trunk-jpl/src/m/classes/groundingline.py	(revision 17579)
@@ -42,5 +42,5 @@
 	def checkconsistency(self,md,solution,analyses):    # {{{
 
-		md = checkfield(md,'fieldname','groundingline.migration','values',['None','AgressiveMigration','SoftMigration','SubelementMigration','SubelementMigration2'])
+		md = checkfield(md,'fieldname','groundingline.migration','values',['None','AgressiveMigration','SoftMigration','SubelementMigration','SubelementMigration2' 'Contact'])
 
 		if not m.strcmp(self.migration,'None'):
