diff --git a/contrib/mobile/Android/src/org/geuz/onelab/Gmsh.java b/contrib/mobile/Android/src/org/geuz/onelab/Gmsh.java
index 6aea74250596a16e8e093f69007f485ea6234b21..9800649e93bc761756464fac07561511be1b70e4 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/Gmsh.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/Gmsh.java
@@ -32,6 +32,8 @@ public class Gmsh implements Parcelable {
 	public native void setPView(int position, int intervalsType,int visible,int nbIso, float raisez); // Change options for a PView
 	public native int onelabCB(String action); // Call onelab
 	
+	public native void animationNext();
+	
 	/** Java CLASS **/
 	private long ptr;
 	private Handler handler;
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java b/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java
index d6b9b0983dedb8285a39e0cdee9be489b3456c44..89b384b594ff53d220acf617c2bf5f699a73651f 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java
@@ -4,6 +4,8 @@ import java.io.File;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
 
 import android.app.ActionBar;
 import android.app.Activity;
@@ -26,6 +28,7 @@ import android.view.Menu;
 import android.view.MenuItem;
 import android.view.Window;
 import android.view.WindowManager;
+import android.widget.Toast;
 
 
 public class MainActivity extends Activity{
@@ -37,6 +40,7 @@ public class MainActivity extends Activity{
 	private OptionsFragment _optionsFragment;
 	private ArrayList<String> _errors = new ArrayList<String>();
 	private Dialog _errorDialog;
+	private Timer _animation;
 
 	public MainActivity() {
 	}
@@ -97,6 +101,8 @@ public class MainActivity extends Activity{
     	_runStopMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
     	MenuItem shareMenuItem = menu.add(R.string.menu_share);
     	shareMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+    	MenuItem playPauseMenuItem = menu.add("Play animation");
+    	playPauseMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
         return true;
     }
 	@Override
@@ -139,8 +145,34 @@ public class MainActivity extends Activity{
     			startActivity(Intent.createChooser(shareIntent, getString(R.string.title_share)));
     		}
     	}
-		else if(item.getItemId() == android.R.id.home)
-		{
+    	else if(item.getTitle().equals("Play animation")) {
+    		if(this._compute) {
+				AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
+    			_errorDialog = dialogBuilder.setTitle("Can't start animation")
+    			.setMessage("The computing have to be finished before you can play animation.")
+    			.setPositiveButton("OK", new DialogInterface.OnClickListener() {
+					
+					public void onClick(DialogInterface dialog, int which) {
+						dialog.dismiss();
+					}
+				})
+    			.show();
+    		}
+    		else {
+	    		item.setTitle("Stop animation");
+	    		_animation = new Timer();
+	    		_animation.schedule(new TimerTask() {
+	    			public void run()  {
+	    				_gmsh.animationNext();
+	    				_modelFragment.requestRender();
+	    			} }, 2000, 1);
+    		}
+    	}
+    	else if(item.getTitle().equals("Stop animation")) {
+    		item.setTitle("Play animation");
+    		_animation.cancel();
+    	}
+		else if(item.getItemId() == android.R.id.home) {
 			if(this._compute) {
 				AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
     			_errorDialog = dialogBuilder.setTitle("Can't show the models list")
@@ -200,22 +232,22 @@ public class MainActivity extends Activity{
     	if(_errors.size()>0){
     		if(_errorDialog != null && _errorDialog.isShowing()) _errorDialog.dismiss();
     		AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
-    		_errorDialog = dialogBuilder.setTitle("Gmsh/GetDP Error(s)")
+    		dialogBuilder.setTitle("Gmsh/GetDP Error(s)")
 		    .setMessage(_errors.get(_errors.size()-1))
 		    .setNegativeButton("Hide", new DialogInterface.OnClickListener() {
 		        public void onClick(DialogInterface dialog, int which) {
 		        	_errors.clear();
 		        	_errorDialog.dismiss();
 		        }
-		     })
-		    .setPositiveButton("Show more", new DialogInterface.OnClickListener() {
+		     });
+    		if(_errors.size()>1)dialogBuilder.setPositiveButton("Show more", new DialogInterface.OnClickListener() {
 		        public void onClick(DialogInterface dialog, int which) {
 		        	_errors.remove(_errors.size()-1);
 		        	_errorDialog.dismiss();
 		            showError();
 		        }
-		     })
-		     .show();
+		     });
+		     _errorDialog = dialogBuilder.show();
     	}
     }
 	@Override
@@ -241,6 +273,22 @@ public class MainActivity extends Activity{
 		_notify = true;
 	}
 	
+	@Override
+	public void onLowMemory() {
+		_gmsh.onelabCB("stop");
+		Toast.makeText(this, "Low memory !!! computing is going to stop", Toast.LENGTH_LONG).show();
+		super.onLowMemory();
+	}
+	
+	@Override
+	public void onTrimMemory(int level) {
+		if(level == Activity.TRIM_MEMORY_COMPLETE){
+			_gmsh.onelabCB("stop");
+			notifyInterruptComputing();
+		}
+		super.onTrimMemory(level);
+	}
+	
 	private void notifyComputing() {
 		Intent intent = new Intent(this, MainActivity.class);
 	    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
@@ -260,8 +308,7 @@ public class MainActivity extends Activity{
 		Intent intent = new Intent(this, MainActivity.class);
 	    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
 	    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
-		Notification.Builder notifyBuilder =
-		        new Notification.Builder(this)
+		Notification.Builder notifyBuilder = new Notification.Builder(this)
 		        .setSmallIcon(R.drawable.ic_launcher)
 		        .setContentIntent(pendingIntent)
 		        .setContentTitle("ONELAB")
@@ -273,6 +320,23 @@ public class MainActivity extends Activity{
 			    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 		mNotificationManager.notify(1337, notifyBuilder.getNotification());
 	}
+	
+	private void notifyInterruptComputing() {
+		Intent intent = new Intent(this, MainActivity.class);
+	    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
+	    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+		Notification.Builder notifyBuilder = new Notification.Builder(this)
+		        .setSmallIcon(R.drawable.ic_launcher)
+		        .setContentIntent(pendingIntent)
+		        .setContentTitle("ONELAB")
+		        .setDefaults(Notification.DEFAULT_ALL)
+		        .setAutoCancel(true)
+		        .setProgress(0, 0, false)
+		        .setContentText("The computing had to stop because your device ran out of memory");
+		NotificationManager mNotificationManager =
+			    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+		mNotificationManager.notify(1337, notifyBuilder.getNotification());
+	}
 
 	private final Handler mainHandler = new Handler(){
     	public void handleMessage(android.os.Message msg) {
diff --git a/contrib/mobile/androidGModel.cpp b/contrib/mobile/androidGModel.cpp
index 22cdf6e3c9e8053cd74d60252d7ddba68d8f0647..2d8e3de46ab013644473d8e98e0ff71d689b623d 100644
--- a/contrib/mobile/androidGModel.cpp
+++ b/contrib/mobile/androidGModel.cpp
@@ -304,4 +304,9 @@ JNIEXPORT jint JNICALL Java_org_geuz_onelab_Gmsh_onelabCB
 	const char*  action = env->GetStringUTFChars(jaction, NULL);
 	return onelab_cb(action);
 }
+JNIEXPORT void JNICALL Java_org_geuz_onelab_Gmsh_animationNext
+  (JNIEnv *, jobject)
+{
+	animation_next();
+}
 }
diff --git a/contrib/mobile/androidGModel.h b/contrib/mobile/androidGModel.h
index e886d82ab09770e47fefd92f3608b99b0ccec38b..7497acd9288d7b370f251d7ba85ca61f571acf8f 100644
--- a/contrib/mobile/androidGModel.h
+++ b/contrib/mobile/androidGModel.h
@@ -137,6 +137,14 @@ JNIEXPORT void JNICALL Java_org_geuz_onelab_Gmsh_setPView
 JNIEXPORT jint JNICALL Java_org_geuz_onelab_Gmsh_onelabCB
   (JNIEnv *, jobject, jstring);
 
+/*
+ * Class:     org_geuz_onelab_Gmsh
+ * Method:    animationNext
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_org_geuz_onelab_Gmsh_animationNext
+  (JNIEnv *, jobject);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/contrib/mobile/drawContext.cpp b/contrib/mobile/drawContext.cpp
index 5c453e38dd2c75a984c4d3b626031caf871c033e..a9e361165079da1ec4e1454ae4bce320c097c878 100644
--- a/contrib/mobile/drawContext.cpp
+++ b/contrib/mobile/drawContext.cpp
@@ -680,4 +680,24 @@ int onelab_cb(std::string action)
 	return redraw;
 }
 
+void animation_next() {
+	for(unsigned int i = 0; i < PView::list.size(); i++){
+		PView * p = PView::list[i];
+		if(p->getOptions()->visible){
+			// skip empty steps
+			int step = (int)p->getOptions()->timeStep + 1;
+			int numSteps = (int)p->getData()->getNumTimeSteps();
+			for(int j = 0; j < numSteps; j++){
+				if(p->getData()->hasTimeStep(step)) break;
+				else step += 1;
+				if(step < 0) step = numSteps - 1;
+				if(step > numSteps - 1) step = 0;
+			}
+			Msg::Info("animation: step%d nextstep%d totalstep%d", p->getOptions()->timeStep, step, p->getData()->getNumTimeSteps());
+			p->getOptions()->timeStep = step;
+			p->setChanged(true);
+		}
+	}
+}
+
 // vim:set ts=2:
diff --git a/contrib/mobile/drawContext.h b/contrib/mobile/drawContext.h
index ef5fd7159740247a2cfb8512104e3aaedfc2b7ab..befc96db43d4b67a365db7bf48d4bd8b59d5bcd8 100644
--- a/contrib/mobile/drawContext.h
+++ b/contrib/mobile/drawContext.h
@@ -21,6 +21,7 @@
 
 void drawArray(VertexArray *va, int type, bool useColorArray=false, bool useNormalArray=false);
 int onelab_cb(std::string);
+void animation_next();
 
 class drawContext{
 private: