diff --git a/contrib/mobile/iOS/Onelab.xcodeproj/project.pbxproj b/contrib/mobile/iOS/Onelab.xcodeproj/project.pbxproj
index c308fb445d93b8bf34397ed80fd86cb7fa37f80d..e85cbc52f13226d2b32993b75dba56201786da03 100644
--- a/contrib/mobile/iOS/Onelab.xcodeproj/project.pbxproj
+++ b/contrib/mobile/iOS/Onelab.xcodeproj/project.pbxproj
@@ -9,6 +9,7 @@
 /* Begin PBXBuildFile section */
 		2901F1211BB0086C004C328B /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 2901F1201BB0086C004C328B /* libz.tbd */; };
 		2907CCEC193DE6560011341A /* icon_onelab.png in Resources */ = {isa = PBXBuildFile; fileRef = 2907CCEB193DE6560011341A /* icon_onelab.png */; };
+		295056611D9AF3D200B9D9C4 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 295056601D9AF3D200B9D9C4 /* MessageUI.framework */; };
 		2988FF1E18E59558001435B6 /* libf2cblas.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2988FF1C18E59558001435B6 /* libf2cblas.a */; };
 		2988FF1F18E59558001435B6 /* libf2clapack.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2988FF1D18E59558001435B6 /* libf2clapack.a */; };
 		29A4AC80193CE6DA0007B5A5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 29A4AC7F193CE6DA0007B5A5 /* Images.xcassets */; };
@@ -54,6 +55,7 @@
 /* Begin PBXFileReference section */
 		2901F1201BB0086C004C328B /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-tbd-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
 		2907CCEB193DE6560011341A /* icon_onelab.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_onelab.png; sourceTree = "<group>"; };
+		295056601D9AF3D200B9D9C4 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; };
 		2988FF1C18E59558001435B6 /* libf2cblas.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libf2cblas.a; path = ../../frameworks_ios/libf2cblas.a; sourceTree = "<group>"; };
 		2988FF1D18E59558001435B6 /* libf2clapack.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libf2clapack.a; path = ../../frameworks_ios/libf2clapack.a; sourceTree = "<group>"; };
 		29A4AC7F193CE6DA0007B5A5 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
@@ -132,6 +134,7 @@
 				9C96083D1712C16300E1D4A0 /* Foundation.framework in Frameworks */,
 				9C96083F1712C16300E1D4A0 /* CoreGraphics.framework in Frameworks */,
 				9CE2773B17E197F50076E728 /* Social.framework in Frameworks */,
+				295056611D9AF3D200B9D9C4 /* MessageUI.framework in Frameworks */,
 				9CE08E10178AEB1600A83B4B /* GetDP.framework in Frameworks */,
 				9CE08E11178AEB1600A83B4B /* Gmsh.framework in Frameworks */,
 				9CE08E12178AEB1600A83B4B /* petsc.framework in Frameworks */,
@@ -172,6 +175,7 @@
 		9C9608391712C16300E1D4A0 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				295056601D9AF3D200B9D9C4 /* MessageUI.framework */,
 				2901F1201BB0086C004C328B /* libz.tbd */,
 				9C1B9911194F4E0400507EFD /* slepc.framework */,
 				2988FF1C18E59558001435B6 /* libf2cblas.a */,
diff --git a/contrib/mobile/iOS/Onelab/ModelListController.h b/contrib/mobile/iOS/Onelab/ModelListController.h
index 0f02d299c09564f17ec8e15727635f8e7930ce6f..0461b62b40fc8d7251e5513e98b3908db99d8d8b 100644
--- a/contrib/mobile/iOS/Onelab/ModelListController.h
+++ b/contrib/mobile/iOS/Onelab/ModelListController.h
@@ -1,8 +1,8 @@
 #import <UIKit/UIKit.h>
-
+#import <MessageUI/MessageUI.h>
 #import "EAGLView.h"
 
-@interface ModelListController : UITableViewController <NSXMLParserDelegate, UIActionSheetDelegate>
+@interface ModelListController : UITableViewController <NSXMLParserDelegate, UIActionSheetDelegate, MFMailComposeViewControllerDelegate>
 {
     @private
     NSMutableArray *models;
diff --git a/contrib/mobile/iOS/Onelab/ModelListController.mm b/contrib/mobile/iOS/Onelab/ModelListController.mm
index 6112efee94648830b1048bee44f613ec3c820e03..b23577a9d53f97a46b63936a8268293faee52442 100644
--- a/contrib/mobile/iOS/Onelab/ModelListController.mm
+++ b/contrib/mobile/iOS/Onelab/ModelListController.mm
@@ -129,9 +129,9 @@
   if(indexPath == nil) return;
   UIActionSheet *actionSheet;
   if([[models objectAtIndex:indexPath.row] getUrl])
-    actionSheet = [[UIActionSheet alloc] initWithTitle:[[models objectAtIndex:indexPath.row] getName] delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles: @"Open model", @"Remove model", @"View model website", nil];
+    actionSheet = [[UIActionSheet alloc] initWithTitle:[[models objectAtIndex:indexPath.row] getName] delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles: @"Open", @"Remove", @"Clear results", @"Email model files", @"Visit model website", nil];
   else
-    actionSheet = [[UIActionSheet alloc] initWithTitle:[[models objectAtIndex:indexPath.row] getName] delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles: @"Open model", @"Remove model", nil];
+    actionSheet = [[UIActionSheet alloc] initWithTitle:[[models objectAtIndex:indexPath.row] getName] delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles: @"Open", @"Remove", @"Clear results", @"Email model files", nil];
   actionSheet.tag = indexPath.row;
   [actionSheet showInView:self.view];
 }
@@ -139,9 +139,36 @@
 -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
 {
   switch (buttonIndex) {
-  case 2:
+  case 4:
     [[UIApplication sharedApplication] openURL:[[models objectAtIndex:actionSheet.tag] getUrl]];
     break;
+  case 3:
+		{
+			NSString *modelFile = [[models objectAtIndex:actionSheet.tag] getFile];
+			NSString *modelPath = [modelFile stringByDeletingLastPathComponent];
+			NSArray *modelFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:modelPath error:NULL];
+			// TODO: would probably be better to email a zip archive? (this ignores subdirectories)
+			[self attachFilesToEmail:modelFiles filePath:modelPath];
+		}
+		break;
+  case 2:
+    {
+      NSString *modelFile = [[models objectAtIndex:actionSheet.tag] getFile];
+      NSString *modelPath = [modelFile stringByDeletingLastPathComponent];
+      NSArray *modelFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:modelPath error:NULL];
+      for (NSString *obj in modelFiles){
+        NSString *extension = [obj pathExtension];
+        if([extension isEqualToString:@"msh"] ||
+           [extension isEqualToString:@"pre"] ||
+           [extension isEqualToString:@"res"] ||
+           [extension isEqualToString:@"pos"]){
+          NSString *file = [[modelPath stringByAppendingString:@"/"] stringByAppendingString:obj];
+          NSLog(@"Removing file %@", file);
+          [[NSFileManager defaultManager] removeItemAtPath:file error:nil];
+        }
+			}
+    }
+    break;
   case 1:
     {
       NSString *file = [[models objectAtIndex:actionSheet.tag] getFile];
@@ -156,6 +183,66 @@
   }
 }
 
+- (void)attachFilesToEmail:(NSArray*)files filePath:(NSString*)path
+{
+	if([MFMailComposeViewController canSendMail] == NO) return;
+	
+	MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];
+	mc.mailComposeDelegate = self;
+	[mc setSubject:@"My ONELAB model"];
+	
+	// Add attachments
+	for (NSString *file in files){
+		NSString *extension = [file pathExtension];
+		NSString *filePath = [[path stringByAppendingString:@"/"] stringByAppendingString:file];
+		NSData *fileData = [NSData dataWithContentsOfFile:filePath];
+		if(fileData){
+			NSString *mimeType;
+			if ([extension isEqualToString:@"jpg"]) {
+				mimeType = @"image/jpeg";
+			}
+			else if([extension isEqualToString:@"png"]) {
+				mimeType = @"image/png";
+			}
+			else if([extension isEqualToString:@"doc"]) {
+				mimeType = @"application/msword";
+			}
+			else if([extension isEqualToString:@"ppt"]) {
+				mimeType = @"application/vnd.ms-powerpoint";
+			}
+			else if([extension isEqualToString:@"html"]) {
+				mimeType = @"text/html";
+			}
+			else if([extension isEqualToString:@"pdf"]) {
+				mimeType = @"application/pdf";
+			}
+			else{
+				mimeType = @"text/plain";
+			}
+
+			[mc addAttachmentData:fileData mimeType:@"" fileName:file];
+		}
+	}
+	
+	// Present mail view controller on screen
+	[self presentViewController:mc animated:YES completion:NULL];
+	
+}
+
+- (void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
+{
+	switch (result){
+	case MFMailComposeResultCancelled: NSLog(@"Mail cancelled"); break;
+	case MFMailComposeResultSaved: NSLog(@"Mail saved"); break;
+	case MFMailComposeResultSent: NSLog(@"Mail sent"); break;
+	case MFMailComposeResultFailed: NSLog(@"Mail sent failure: %@", [error localizedDescription]); break;
+  default: break;
+	}
+	// Close the Mail Interface
+	[self dismissViewControllerAnimated:YES completion:NULL];
+}
+
+
 - (BOOL) parseInfosFile:(NSString *)file
 {
   NSData *xmlFile = [[NSFileManager defaultManager] contentsAtPath:file];