diff --git a/contrib/mobile/Android/src/org/geuz/onelab/GLESRender.java b/contrib/mobile/Android/src/org/geuz/onelab/GLESRender.java
index a53a5cdab25932ceb321f0de5ef3ef4be566c035..15fdae608d76be4e00f55e831d6076c2093efd41 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/GLESRender.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/GLESRender.java
@@ -1,18 +1,23 @@
 package org.geuz.onelab;
 
+import java.nio.IntBuffer;
+
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
+import android.graphics.Bitmap;
 import android.opengl.GLSurfaceView.Renderer;
-import android.os.Handler;
 
 public class GLESRender implements Renderer{
 
-	Gmsh mGModel;
-	Handler loadingHand;
+	private Gmsh mGModel;
+	private int _width, _height;
+	private Bitmap _screenshot;
+	private boolean _needScreenshot;
 
 	public GLESRender(Gmsh model) {
 		this.mGModel = model;
+		_needScreenshot = false;
 	}
 	
 	public void load(String filename){
@@ -44,13 +49,36 @@ public class GLESRender implements Renderer{
 	// OpenGL ES methods
 	public void onDrawFrame(GL10 gl) {
 		mGModel.viewDraw();
+		if(_needScreenshot) this.screenshot(gl);
 	}
 
 	public void onSurfaceChanged(GL10 gl, int width, int height) {
 		mGModel.viewInit(width, height);
+		_width = width + 5;
+		_height = height;
 	}
 
-	public void onSurfaceCreated(GL10 gl, EGLConfig config) {
-	}
+	public void onSurfaceCreated(GL10 gl, EGLConfig config) { }
+	public void needScreenshot() {_screenshot = null; _needScreenshot = true;}
+	public Bitmap getScreenshot(){return _screenshot;}
+	private void screenshot(GL10 gl)
+	{
+		_needScreenshot = false;
+		int bitmapBuffer[] = new int[_width * _height];
+	    int bitmapSource[] = new int[_width * _height];
+	    IntBuffer intBuffer = IntBuffer.wrap(bitmapBuffer);
+	    intBuffer.position(0);
 
+	    gl.glReadPixels(0, 0, _width, _height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, intBuffer);
+        int offset1, offset2;
+        for (int i = 0; i < _height; i++) {
+            offset1 = i * _width;
+            offset2 = (_height - i - 1) * _width;
+            for (int j = 0; j < _width; j++) {
+                int pixel = bitmapBuffer[offset1 + j];
+                bitmapSource[offset2 + j] = (pixel & 0xFF00FF00) | (pixel << 16) & 0x00FF0000 | (pixel >> 16) & 0x000000FF;
+            }
+        }
+        _screenshot = Bitmap.createBitmap(bitmapSource, _width, _height, Bitmap.Config.ARGB_8888);
+	}
 }
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java b/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java
index 8b78f363f33c4515000847656df541944b36a700..2440c94010544958ccf9337e1dc9c91faf92dec8 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/MainActivity.java
@@ -1,5 +1,6 @@
 package org.geuz.onelab;
 
+import java.io.File;
 import java.util.ArrayList;
 
 import android.app.ActionBar;
@@ -14,6 +15,7 @@ import android.content.DialogInterface;
 import android.content.Intent;
 import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
+import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Handler;
@@ -92,6 +94,8 @@ public class MainActivity extends Activity{
     	}
     	_runStopMenuItem = menu.add((_compute)?R.string.menu_stop:R.string.menu_run);
     	_runStopMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+    	MenuItem shareMenuItem = menu.add("Share ...");
+    	shareMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
         return true;
     }
 	@Override
@@ -115,6 +119,16 @@ public class MainActivity extends Activity{
     	}
     	else if(item.getTitle().equals(getString(R.string.menu_stop))){
     		_gmsh.onelabCB("stop");
+    	}
+    	else if(item.getTitle().equals("Share ...")) {
+    		File file = new File(this.getExternalFilesDir(null), "onelab_screenshot.png");
+			file.setReadable(true, false);
+			_modelFragment.takeScreenshot(file);
+			Intent shareIntent = new Intent();
+			shareIntent.setAction(Intent.ACTION_SEND);
+			shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
+			shareIntent.setType("image/jpeg");
+			startActivity(Intent.createChooser(shareIntent, "Share screenshot with ..."));
     	}
 		else if(item.getItemId() == android.R.id.home)
 		{
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/ModelFragment.java b/contrib/mobile/Android/src/org/geuz/onelab/ModelFragment.java
index 182365c6060f3cabbfb065c62e2646840f0bc10a..77fe46fc31a7618febfc511555c5f3efb485b1f6 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/ModelFragment.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/ModelFragment.java
@@ -1,6 +1,11 @@
 package org.geuz.onelab;
 
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+
 import android.app.Fragment;
+import android.graphics.Bitmap;
 import android.opengl.GLSurfaceView;
 import android.os.Bundle;
 import android.view.Gravity;
@@ -78,4 +83,16 @@ public class ModelFragment extends Fragment{
 	public void requestRender() {
 		_glView.requestRender();
 	}
+	public void takeScreenshot(File out) {
+		Bitmap screenshot = _glView.getScreenshot();
+		try {
+			FileOutputStream f = new FileOutputStream(out);
+			screenshot.compress(Bitmap.CompressFormat.PNG, 85, f);
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		}
+		finally {
+			_glView.setDrawingCacheEnabled(false);
+		}
+	}
 }
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/ModelList.java b/contrib/mobile/Android/src/org/geuz/onelab/ModelList.java
index e25d2c21afc53970a15ada2887a5d1f143a89850..3b3adb021e94110aba8fc6d5c5be938428f6043d 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/ModelList.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/ModelList.java
@@ -20,6 +20,8 @@ import android.net.Uri;
 import android.os.Bundle;
 import android.os.Environment;
 import android.util.Xml;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup.LayoutParams;
 import android.widget.AdapterView;
@@ -42,7 +44,7 @@ public class ModelList extends Activity {
 		} catch (IOException e) {
 			e.printStackTrace();
 		}
-		
+
 		LinearLayout layout = new LinearLayout(this);
     	layout.setOrientation(LinearLayout.VERTICAL);
     	ListView list = new ListView(this);
@@ -113,6 +115,22 @@ public class ModelList extends Activity {
 		layout.setBackgroundColor(Color.argb(255, 67, 67, 67));
 	}
 	
+	@Override
+	public boolean onCreateOptionsMenu(Menu menu) {
+		MenuItem loadFile = menu.add(R.string.button_open_external_file);
+		loadFile.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+		return super.onCreateOptionsMenu(menu);
+	}
+	
+	@Override
+	public boolean onMenuItemSelected(int featureId, MenuItem item) {
+		if(item.getTitle().equals(getString(R.string.button_open_external_file))) {
+			Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.fromFile(this.getFilesDir()));
+			startActivity(browserIntent);
+		}
+		return super.onMenuItemSelected(featureId, item);
+	}
+	
 	private void getModels() throws XmlPullParserException, IOException
     {
 		File document = this.getFilesDir();
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/OptionsDisplayFragment.java b/contrib/mobile/Android/src/org/geuz/onelab/OptionsDisplayFragment.java
index dc758a14b055c7c21bf73385bfe4a727e90d13e5..fe8d78e63dd32ec24b0efe28ee0863a612d4adf4 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/OptionsDisplayFragment.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/OptionsDisplayFragment.java
@@ -95,7 +95,7 @@ public class OptionsDisplayFragment extends Fragment{
 		if(_gmsh == null) return;
 		String[] PViews = _gmsh.getPView();
 		for(int i=0; i<_listView.itemsCountInSection("Result"); i++) {
-			View v = (View)_listView.getItemAtPosition(7+i);
+			View v = (View)_listView.getItemAtPosition(6+i);
 			if(!v.getClass().equals(LinearLayout.class)) continue;
 			for(int j=0; j<((LinearLayout)v).getChildCount(); j++) {
 				View sv = ((LinearLayout)v).getChildAt(j);
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/mGLSurfaceView.java b/contrib/mobile/Android/src/org/geuz/onelab/mGLSurfaceView.java
index 09fdd481f729137f7f360ce4b93b4d44d96a80f4..c4a10c17119ec9cedfccacab082c6039685ede5c 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/mGLSurfaceView.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/mGLSurfaceView.java
@@ -1,6 +1,7 @@
 package org.geuz.onelab;
 
 import android.content.Context;
+import android.graphics.Bitmap;
 import android.opengl.GLSurfaceView;
 import android.support.v4.view.MotionEventCompat;
 import android.view.GestureDetector;
@@ -124,5 +125,11 @@ class mGLSurfaceView extends GLSurfaceView {
 	public void resetScale(){
 		scaleFactor = 1f;
 		_renderer.scaleModel(scaleFactor);
-	}	
+	}
+	public Bitmap getScreenshot() {
+		_renderer.needScreenshot();
+		this.requestRender();
+		while(_renderer.getScreenshot() == null);
+		return _renderer.getScreenshot();
+	}
 }