Index: trunk/src/org/expeditee/auth/Actions.java
===================================================================
--- trunk/src/org/expeditee/auth/Actions.java	(revision 1361)
+++ trunk/src/org/expeditee/auth/Actions.java	(revision 1362)
@@ -14,4 +14,5 @@
 import java.security.PrivateKey;
 import java.security.PublicKey;
+import java.security.SecureRandom;
 import java.security.cert.CertificateException;
 import java.security.spec.InvalidKeySpecException;
@@ -26,4 +27,5 @@
 import java.util.Map;
 import java.util.Optional;
+import java.util.Random;
 import java.util.Scanner;
 import java.util.stream.Collectors;
@@ -32,4 +34,6 @@
 import javax.crypto.IllegalBlockSizeException;
 import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
 
 import org.expeditee.agents.ExistingFramesetException;
@@ -44,4 +48,5 @@
 import org.expeditee.auth.tags.AuthenticationTag;
 import org.expeditee.core.Colour;
+import org.expeditee.gio.gesture.StandardGestureActions;
 import org.expeditee.gui.DisplayController;
 import org.expeditee.gui.Frame;
@@ -81,4 +86,33 @@
 		Mail.sendMail(mail, recipient);
 		MessageBay.displayMessage("Test message sent.");
+	}
+	public static void SendTestOneOffMessage(String colleagueName) {
+		String time = Formatter.getDateTime();
+		String sender = UserSettings.UserName.get();
+		String topic = "Test Message";
+		String message = "This is a test message.";
+		Map<String, String> options = new HashMap<String, String>();
+		options.put("Neat", "Beep");
+		MailEntry mail = new MailEntry(time, sender, colleagueName, topic, message, options);
+		Random rand = new SecureRandom();
+		byte[] key = new byte[16];
+		rand.nextBytes(key);
+		System.out.println(Base64.getEncoder().encodeToString(key));
+		Mail.sendOneOffMail(mail, colleagueName, key);
+	}
+	public static void AuthOneOffSecureMessage(Text cursor, Text actionItem) {
+		byte[] keyBytes = Base64.getDecoder().decode(cursor.getText());
+		SecretKey key = new SecretKeySpec(keyBytes, SymmetricAlgorithm);
+		List<String> data = actionItem.getData();
+		String topic = new String(org.expeditee.auth.sharing.Actions.DecryptSymmetric(Base64.getDecoder().decode(data.get(3)), key));
+		String message = new String(org.expeditee.auth.sharing.Actions.DecryptSymmetric(Base64.getDecoder().decode(data.get(4)), key));
+		Map<String, String> options = new HashMap<String, String>();
+		for (int i = 5; i < data.size(); i+=2) {
+			String k = new String(org.expeditee.auth.sharing.Actions.DecryptSymmetric(Base64.getDecoder().decode(data.get(i)), key));
+			String v = new String(org.expeditee.auth.sharing.Actions.DecryptSymmetric(Base64.getDecoder().decode(data.get(i + 1)), key));
+			options.put(k, v);
+		}
+		MailBay.addMessage(data.get(0), topic, message, options);
+		StandardGestureActions.Refresh();
 	}
 	public static void SetPWColleagues(String colleagueOne, String colleagueTwo) {
Index: trunk/src/org/expeditee/auth/AuthenticatorBrowser.java
===================================================================
--- trunk/src/org/expeditee/auth/AuthenticatorBrowser.java	(revision 1361)
+++ trunk/src/org/expeditee/auth/AuthenticatorBrowser.java	(revision 1362)
@@ -219,5 +219,7 @@
 			}
 			
-			Mail.addEntry(new Mail.MailEntry(timestamp, from, to, msg, msg2, options));
+			Mail.MailEntry mail = new Mail.MailEntry(timestamp, from, to, msg, msg2, options);
+			mail.deadDropSource = dbFile;
+			Mail.addEntry(mail);
 		}
 		
Index: trunk/src/org/expeditee/auth/Mail.java
===================================================================
--- trunk/src/org/expeditee/auth/Mail.java	(revision 1361)
+++ trunk/src/org/expeditee/auth/Mail.java	(revision 1362)
@@ -216,63 +216,113 @@
 	 * If the private key can decrypt a message, then it was encrypted using the users public key, and is therefore for them.
 	 */
-	public static List<MailEntry> getEntries(String name, PrivateKey key) throws NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException {
+	private static List<MailEntry> getEntries(String name, PrivateKey key) throws NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException {
 		List<MailEntry> filtered = new ArrayList<MailEntry>();
 		
 		for (MailEntry mail: messages) {
-			// confirm this is a message for the requester of entries
-			String receiver = mail.receiver;
-			byte[] receiverBytes = Base64.getDecoder().decode(receiver);
-			String receiverDecrypted = null;
-			Cipher c = Cipher.getInstance(AsymmetricAlgorithm + AsymmetricAlgorithmParameters);
-			try {
+			if (isEncryptedOneOffMessage(mail)) {
+				getOneOffSecureMail(name, filtered, mail);
+			} else {
+				getStandardSecureMail(name, key, filtered, mail);
+			}
+		}
+		
+		return filtered;
+	}
+
+	private static void getOneOffSecureMail(String name, List<MailEntry> filtered, MailEntry mail) {
+		StringBuilder sb = new StringBuilder();
+		String sep = ":::";
+		sb.append("Read one-off secure message." + sep);
+		sb.append(mail.timestamp + sep);
+		sb.append(mail.sender + sep);
+		sb.append(mail.receiver + sep);
+		sb.append(mail.message + sep);
+		sb.append(mail.message2 + sep);
+		for (String k: mail.options.keySet()) {
+			sb.append(k + sep + mail.options.get(k) + sep);
+		}
+		sb.reverse().delete(0, 3).reverse();
+		Map<String, String> options = new HashMap<String, String>();
+		options.put(sb.toString(), "AuthOneOffSecureMessage");
+		String currentTime = org.expeditee.stats.Formatter.getDateTime();
+		MailEntry mailOuter = new MailEntry(currentTime, "Unknown", name, "You have received a one-off secure message.", "Check your email for more details.", options);
+		
+		if (mail.deadDropSource != null) {
+			Path lastAccessedFile = mail.deadDropSource.getParent().resolve(name + ".last-accessed");
+			SimpleDateFormat format = new SimpleDateFormat("ddMMMyyyy[HH:mm]");
+			try (Scanner in = new Scanner(lastAccessedFile.toFile())) {
+				Date lastAccessedTimestamp = format.parse(in.nextLine());
+				Date mailTimestamp = format.parse(mail.timestamp);
+				if (mailTimestamp.after(lastAccessedTimestamp)) {
+					filtered.add(mailOuter);
+				}
+			} catch (FileNotFoundException e) {
+				// It may not have been created yet, then err on the safe side and add it in.
+				filtered.add(mailOuter);
+			} catch (ParseException e) {
+				// If we fail to parse, then err on the safe side and add it in.
+				filtered.add(mailOuter);
+			}
+		}
+	}
+
+	private static void getStandardSecureMail(String name, PrivateKey key, List<MailEntry> filtered, MailEntry mail)
+			throws NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, InvalidKeyException,
+			BadPaddingException {
+		// confirm this is a message for the requester of entries
+		String receiver = mail.receiver;
+		byte[] receiverBytes = Base64.getDecoder().decode(receiver);
+		String receiverDecrypted = null;
+		Cipher c = Cipher.getInstance(AsymmetricAlgorithm + AsymmetricAlgorithmParameters);
+		try {
+			c.init(Cipher.DECRYPT_MODE, key);
+			receiverDecrypted = new String(c.doFinal(receiverBytes));
+		} catch (InvalidKeyException | BadPaddingException e) {
+			return;
+		}
+		
+		// add an unencrypted version of the message to the return list
+		if (receiverDecrypted.compareToIgnoreCase(name) == 0) {
+			c.init(Cipher.DECRYPT_MODE, key);
+			String sender = new String(c.doFinal(Base64.getDecoder().decode(mail.sender)));
+			c.init(Cipher.DECRYPT_MODE, key);
+			String message = new String(c.doFinal(Base64.getDecoder().decode(mail.message)));
+			c.init(Cipher.DECRYPT_MODE, key);
+			String message2 = new String(c.doFinal(Base64.getDecoder().decode(mail.message2)));
+			
+			Map<String, String> options = new HashMap<String, String>();
+			for (String label: mail.options.keySet()) {
 				c.init(Cipher.DECRYPT_MODE, key);
-				receiverDecrypted = new String(c.doFinal(receiverBytes));
-			} catch (InvalidKeyException | BadPaddingException e) {
-				// this is not a message for 'us'
-				continue;
-			}
-			
-			// add an unencrypted version of the message to the return list
-			if (receiverDecrypted.compareToIgnoreCase(name) == 0) {
+				String labelDecrypted = new String(c.doFinal(Base64.getDecoder().decode(label)));
 				c.init(Cipher.DECRYPT_MODE, key);
-				String sender = new String(c.doFinal(Base64.getDecoder().decode(mail.sender)));
-				c.init(Cipher.DECRYPT_MODE, key);
-				String message = new String(c.doFinal(Base64.getDecoder().decode(mail.message)));
-				c.init(Cipher.DECRYPT_MODE, key);
-				String message2 = new String(c.doFinal(Base64.getDecoder().decode(mail.message2)));
-				
-				Map<String, String> options = new HashMap<String, String>(); //mail.options;
-				for (String label: mail.options.keySet()) {
-					c.init(Cipher.DECRYPT_MODE, key);
-					String labelDecrypted = new String(c.doFinal(Base64.getDecoder().decode(label)));
-					c.init(Cipher.DECRYPT_MODE, key);
-					String actionNameDecrypted = new String(c.doFinal(Base64.getDecoder().decode(mail.options.get(label))));
-					options.put(labelDecrypted, actionNameDecrypted);
+				String actionNameDecrypted = new String(c.doFinal(Base64.getDecoder().decode(mail.options.get(label))));
+				options.put(labelDecrypted, actionNameDecrypted);
+			}
+			
+			Path lastAccessedFile = Paths.get(FrameIO.DEAD_DROPS_PATH).resolve(UserSettings.UserName.get() + "+" + sender).resolve(name + ".last-accessed");
+			if (!lastAccessedFile.toFile().exists()) {
+				lastAccessedFile = Paths.get(FrameIO.DEAD_DROPS_PATH).resolve(sender + "+" + UserSettings.UserName.get()).resolve(name + ".last-accessed");
+			}
+			SimpleDateFormat format = new SimpleDateFormat("ddMMMyyyy[HH:mm]");
+			MailEntry mailEntry = new MailEntry(mail.timestamp, sender, receiverDecrypted, message, message2, options);
+			try (Scanner in = new Scanner(lastAccessedFile.toFile())) {
+				Date lastAccessedTimestamp = format.parse(in.nextLine());
+				Date mailTimestamp = format.parse(mail.timestamp);
+				if (mailTimestamp.after(lastAccessedTimestamp)) {
+					filtered.add(mailEntry);
 				}
-				
-				Path lastAccessedFile = Paths.get(FrameIO.DEAD_DROPS_PATH).resolve(UserSettings.UserName.get() + "+" + sender).resolve(name + ".last-accessed");
-				if (!lastAccessedFile.toFile().exists()) {
-					lastAccessedFile = Paths.get(FrameIO.DEAD_DROPS_PATH).resolve(sender + "+" + UserSettings.UserName.get()).resolve(name + ".last-accessed");
-				}
-				SimpleDateFormat format = new SimpleDateFormat("ddMMMyyyy[HH:mm]");
-				MailEntry mailEntry = new MailEntry(mail.timestamp, sender, receiverDecrypted, message, message2, options);
-				try (Scanner in = new Scanner(lastAccessedFile.toFile())) {
-					Date lastAccessedTimestamp = format.parse(in.nextLine());
-					Date mailTimestamp = format.parse(mail.timestamp);
-					if (mailTimestamp.after(lastAccessedTimestamp)) {
-						filtered.add(mailEntry);
-					}
-				} catch (FileNotFoundException e) {
-					// It may not have been created yet, then err on the safe side and add it in.
-					filtered.add(mailEntry);
-				} catch (ParseException e) {
-					// If we fail to parse, then err on the safe side and add it in.
-					filtered.add(mailEntry);
-				}			
-				
-			}
-		}
-		
-		return filtered;
+			} catch (FileNotFoundException e) {
+				// It may not have been created yet, then err on the safe side and add it in.
+				filtered.add(mailEntry);
+			} catch (ParseException e) {
+				// If we fail to parse, then err on the safe side and add it in.
+				filtered.add(mailEntry);
+			}			
+			
+		}
+	}
+	
+	private static boolean isEncryptedOneOffMessage(MailEntry mail) {
+		return mail.sender.charAt(0) == '=';
 	}
 	
@@ -281,5 +331,5 @@
 	 */
 	public static class MailEntry {
-		public String timestamp;;
+		public String timestamp;
 		public String sender;
 		public String receiver;
@@ -287,5 +337,5 @@
 		public String message2;
 		public Map<String, String> options;
-		public MailEntry subEntry;
+		public Path deadDropSource;
 		
 		public MailEntry(String timestamp, String sender, String rec, String message, String message2, Map<String, String> options) {
Index: trunk/src/org/expeditee/auth/gui/MailBay.java
===================================================================
--- trunk/src/org/expeditee/auth/gui/MailBay.java	(revision 1361)
+++ trunk/src/org/expeditee/auth/gui/MailBay.java	(revision 1362)
@@ -152,5 +152,4 @@
 	}
 	
-
 	public static void clear() {
 		getPreviewMessages().clear();
@@ -298,6 +297,10 @@
 			int i = items.size();
 			for (String content: options.keySet()) {
+				String[] split = content.split(":::");
 				String action = options.get(content);
-				Text t = new Text(content);
+				Text t = new Text(split[0]);
+				for (int o = 1; o < split.length; o++) {
+					t.addToData(split[o]);
+				}
 				int y = MESSAGE_OFFSET_Y + (_previewMessages.size() + i) * SPACING;
 				t.setPosition(OFFSET_X, y);
