diff --git a/contrib/mobile/Android/res/drawable-mdpi/icon_rotate.png b/contrib/mobile/Android/res/drawable-mdpi/icon_rotate.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f0ec77d927c324994704e7064ac2125110060a3
Binary files /dev/null and b/contrib/mobile/Android/res/drawable-mdpi/icon_rotate.png differ
diff --git a/contrib/mobile/Android/res/drawable-mdpi/icon_translate.png b/contrib/mobile/Android/res/drawable-mdpi/icon_translate.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c43ceab43ff0d8214f7b41ba6e47b6566f55e36
Binary files /dev/null and b/contrib/mobile/Android/res/drawable-mdpi/icon_translate.png differ
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/ModelFragment.java b/contrib/mobile/Android/src/org/geuz/onelab/ModelFragment.java
index 5545d77f62c856ef2773861fcac3ed14a5012076..d3db4e1ec1d03c6f4c762c9d2b73aa375f7d2512 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/ModelFragment.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/ModelFragment.java
@@ -96,6 +96,25 @@ public class ModelFragment extends Fragment{
 			}
 		});
 		glViewLayout.addView(_glView);
+		RelativeLayout topRightLayout = new RelativeLayout(container.getContext());
+		ImageButton rotationButton = new ImageButton(container.getContext());
+		rotationButton.setBackgroundResource(R.drawable.icon_rotate);
+		rotationButton.setLayoutParams(new LinearLayout.LayoutParams(50, 50));
+		rotationButton.setOnClickListener(new View.OnClickListener() {
+			public void onClick(View v) {
+				boolean rotate = !_glView.getRotate();
+				((ImageButton)v).setBackgroundResource((rotate)?R.drawable.icon_translate:R.drawable.icon_rotate);
+				_glView.setRotate(rotate);
+			}
+		});
+		topRightLayout.addView(rotationButton);
+		RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
+			    RelativeLayout.LayoutParams.WRAP_CONTENT, 
+			    RelativeLayout.LayoutParams.WRAP_CONTENT);
+		layoutParams.setMargins(0, 100, 10, 0);
+		layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
+		layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
+		glViewLayout.addView(topRightLayout, layoutParams);
 		_progressLayout = new LinearLayout(container.getContext());
 		ProgressBar bar = new ProgressBar(container.getContext());
 		bar.setOnClickListener(new View.OnClickListener() {
@@ -108,7 +127,7 @@ public class ModelFragment extends Fragment{
 		_progressLayout.setAlpha(0);
 		_progressLayout.setGravity(Gravity.CENTER);
 		_progressLayout.addView(_progress);
-		RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
+		layoutParams = new RelativeLayout.LayoutParams(
 			    RelativeLayout.LayoutParams.WRAP_CONTENT, 
 			    RelativeLayout.LayoutParams.WRAP_CONTENT);
 		layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
diff --git a/contrib/mobile/Android/src/org/geuz/onelab/mGLSurfaceView.java b/contrib/mobile/Android/src/org/geuz/onelab/mGLSurfaceView.java
index 5f8d0cd1190c592a8ad2fe012099d481dccaa365..f22f26b09c19dbe6b065e0107610be20e2aae5a7 100644
--- a/contrib/mobile/Android/src/org/geuz/onelab/mGLSurfaceView.java
+++ b/contrib/mobile/Android/src/org/geuz/onelab/mGLSurfaceView.java
@@ -15,6 +15,8 @@ class mGLSurfaceView extends GLSurfaceView {
 	private GestureDetector gesture;
 	private ScaleGestureDetector scaleGesture;
 	private GLESRender _renderer;
+	private boolean _rotate;
+
 	public mGLSurfaceView(Context context, GLESRender renderer) {
 		super(context);
 		_renderer = renderer;
@@ -43,32 +45,8 @@ class mGLSurfaceView extends GLSurfaceView {
 		
 	@Override
 	public boolean onTouchEvent(MotionEvent event) {
-		if(event.getPointerCount() >= 3){
-			scaleGesture.onTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0,0, 0));
-			
-			final float x = event.getX(1);
-	        final float y = event.getY(1);
-	        
-	        int action = event.getActionMasked();
-	        
-	        if(action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_POINTER_1_DOWN){
-	        	_renderer.startInteraction(x,y);
-	        }
-	        else if(action == MotionEvent.ACTION_MOVE){
-	        	_renderer.rotateModel(x, y);
-	        	requestRender();
-	        }
-	        else if(action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_1_UP){
-	        	_renderer.endInteraction(x, y);
-	        }
-
-			return true;
-		}
-		else {
-			scaleGesture.onTouchEvent(event);
-			return gesture.onTouchEvent(event);
-		}
-		
+		scaleGesture.onTouchEvent(event);
+		return gesture.onTouchEvent(event);
 	}
 	
 	private class GestureListener implements OnGestureListener, OnDoubleTapListener{
@@ -91,7 +69,10 @@ class mGLSurfaceView extends GLSurfaceView {
 		public boolean onScroll(MotionEvent e1, MotionEvent e2,
 				float distanceX, float distanceY) {
 			if(e1.getPointerCount() > 1 || e2.getPointerCount() > 1) return false;
-			_renderer.translateModel(e2.getX(), e2.getY());
+			if(_rotate)
+				_renderer.rotateModel(e2.getX(), e2.getY());
+			else
+				_renderer.translateModel(e2.getX(), e2.getY());
 			requestRender();
 			return true;
 		}
@@ -121,6 +102,8 @@ class mGLSurfaceView extends GLSurfaceView {
 		}
 		
 	}
+	public boolean getRotate() {return _rotate;}
+	public void setRotate(boolean r) {_rotate = r;}
 	public void resetScale(){
 		scaleFactor = 1f;
 		_renderer.scaleModel(scaleFactor);