Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 17256)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 17257)
@@ -226,4 +226,5 @@
 		virtual int    PressureInterpolation()=0;
 		virtual bool   IsZeroLevelset(int levelset_enum)=0;
+		virtual bool   IsIcefront(void)=0;
 		virtual void   ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum)=0;
 		virtual void   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum)=0;
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 17256)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 17257)
@@ -114,4 +114,5 @@
 		int    PressureInterpolation();
 		bool   IsZeroLevelset(int levelset_enum);
+		bool   IsIcefront(void){_error_("not implemented yet");};
 		void   ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum);
 		void   GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 17256)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 17257)
@@ -159,4 +159,5 @@
 		void        ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){_error_("not implemented yet");};
 		bool        IsZeroLevelset(int levelset_enum){_error_("not implemented");};
+		bool		IsIcefront(void){_error_("not implemented yet");};
 		void        ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented");};
 		void		GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 17256)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 17257)
@@ -910,9 +910,25 @@
 	}
 
+	if(nrfrontnodes!=2){
+		_printf0_("in elt nr: " << this->Id() << "\n");
+		_printf0_("nrfrontnodes: " << nrfrontnodes << "\n");
+		for(i=0;i<NUMVERTICES;i++){
+			_printf_("levelsetfunction[" << i << "]=" << levelset[i] << "; indicesfront: " << indicesfront[i] << ";\n");
+		}
+	}
+	_assert_(nrfrontnodes==2);
+
+	/* arrange order of frontnodes such that they are oriented counterclockwise */
+	if((NUMVERTICES+indicesfront[0]-indicesfront[1])%NUMVERTICES!=NUMVERTICES-1){
+		int index=indicesfront[0];
+		indicesfront[0]=indicesfront[1];
+		indicesfront[1]=index;
+	}	
+
 	IssmDouble* xyz_front = xNew<IssmDouble>(3*nrfrontnodes);
 	/* Return nodes */
 	for(i=0;i<nrfrontnodes;i++){
 		for(dir=0;dir<3;dir++){
-			xyz_front[3*i+dir]=xyz_list[indicesfront[i]+dir];
+			xyz_front[3*i+dir]=xyz_list[3*indicesfront[i]+dir];
 		}
 	}
@@ -2588,4 +2604,23 @@
 }
 /*}}}*/
+bool Tria::IsIcefront(void){/*{{{*/
+
+	bool isicefront;
+	int i,nrice;
+   IssmDouble ls[NUMVERTICES];
+
+	/*Retrieve all inputs and parameters*/
+	GetInputListOnVertices(&ls[0],MaskIceLevelsetEnum);
+
+	/* If only one vertex has ice, there is an ice front here */
+	isicefront=false;
+	if(IsIceInElement()){
+		nrice=0;       
+		for(i=0;i<NUMVERTICES;i++)
+			if(ls[i]<0.) nrice++;
+		if(nrice==1) isicefront= true;
+	}
+	return isicefront;
+}/*}}}*/
 
 /*FUNCTION Tria::AverageOntoPartition {{{*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 17256)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 17257)
@@ -134,4 +134,5 @@
 	    void        GetNormalFromLSF(IssmDouble *pnormal);
 		bool        IsZeroLevelset(int levelset_enum);
+		bool		IsIcefront(void);
 
 		void       AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part);
