Index: trunk/src/org/expeditee/auth/Actions.java
===================================================================
--- trunk/src/org/expeditee/auth/Actions.java	(revision 1505)
+++ trunk/src/org/expeditee/auth/Actions.java	(revision 1506)
@@ -71,12 +71,4 @@
 		MessageBay.displayMessage("Test message sent.");
 	}
-		
-	public static void CheckMailTest() {
-		List<Mail.MailEntry> mail = MailBay.getMailClient().checkMail();
-		for (Mail.MailEntry entry: mail) {
-			MessageBay.displayMessage(entry.toString());
-		}
-		MessageBay.displayMessage(mail.size() + " new mail since last run.");
-	}
 	
 	public static void SendTestOneOffMessage(String recipient) {
Index: trunk/src/org/expeditee/encryption/io/EncryptedExpWriter.java
===================================================================
--- trunk/src/org/expeditee/encryption/io/EncryptedExpWriter.java	(revision 1505)
+++ trunk/src/org/expeditee/encryption/io/EncryptedExpWriter.java	(revision 1506)
@@ -52,5 +52,5 @@
 	public EncryptedExpWriter(String encryptionLabel) {
 		label = encryptionLabel;
-		if (label.equals(labelNone)) {
+		if (label.equals(getLabelNone())) {
 			return;
 		}
@@ -122,5 +122,5 @@
 		
 		String toWrite;
-		if (key == null && label.equals(labelNone)) {
+		if (key == null && label.equals(getLabelNone())) {
 			toWrite = line + nl;
 		} else {
@@ -276,3 +276,10 @@
 		}
 	}
+
+	/**
+	 * @return the labelnone
+	 */
+	public static String getLabelNone() {
+		return labelNone;
+	}
 }
Index: trunk/src/org/expeditee/gui/AttributeUtils.java
===================================================================
--- trunk/src/org/expeditee/gui/AttributeUtils.java	(revision 1505)
+++ trunk/src/org/expeditee/gui/AttributeUtils.java	(revision 1506)
@@ -204,12 +204,14 @@
 			
 			// Encryption Frame attributes
-			_FrameAttrib.put("FrameEncryptionLabel", 		Frame.class.getMethod("getFrameEncryptionLabel"), 
-															Frame.class.getMethod("setFrameEncryptionLabel", pString));
-			_FrameAttrib.put("EncryptionFramePermission", 	Frame.class.getMethod("getFrameEncryptionPermission"), 
-															Frame.class.getMethod("setFrameEncryptionPermission", pEncPermission));
-			_FrameAttrib.put("HomogeneousEncryptionLabel", 	Frame.class.getMethod("getHomogeneousEncryptionLabel"), 
-															Frame.class.getMethod("setHomogeneousEncryptionLabel", pString));
-			_FrameAttrib.put("EncryptionPermission", 		Frame.class.getMethod("getEncryptionPermission"), 
-															Frame.class.getMethod("setEncryptionPermission", pEncPermission));
+			_FrameAttrib.put("FrameEncryptionLabel", 			Frame.class.getMethod("getFrameEncryptionLabel"), 
+																Frame.class.getMethod("setFrameEncryptionLabel", pString));
+			_FrameAttrib.put("EncryptionFramePermission", 		Frame.class.getMethod("getFrameEncryptionPermission"), 
+																Frame.class.getMethod("setFrameEncryptionPermission", pEncPermission));
+			_FrameAttrib.put("HomogeneousEncryptionLabel", 		Frame.class.getMethod("getHomogeneousEncryptionLabel"), 
+																Frame.class.getMethod("setHomogeneousEncryptionLabel", pString));
+			_FrameAttrib.put("EncryptionPermission", 			Frame.class.getMethod("getEncryptionPermission"), 
+																Frame.class.getMethod("setEncryptionPermission", pEncPermission));
+			_FrameAttrib.put("HetrogeneousEncryptionLabels", 	Frame.class.getMethod("getHetrogeneousFrameOwnerLabels"), 
+																Frame.class.getMethod("addToHetrogeneousFrameOwnerLabels", pString));
 			
 			// aliases for Standard frame attribute settings
@@ -220,4 +222,5 @@
 			// aliases for Encryption frame attribute settings
 			_FrameAttrib.alias("encframelabel",	"FrameEncryptionLabel");
+			_FrameAttrib.alias("EncryptionFrameLabel", "FrameEncryptionLabel");
 			_FrameAttrib.alias("encframeperm",	"EncryptionFramePermission");
 			_FrameAttrib.alias("homoenclabel", 	"HomogeneousEncryptionLabel");
Index: trunk/src/org/expeditee/gui/Frame.java
===================================================================
--- trunk/src/org/expeditee/gui/Frame.java	(revision 1505)
+++ trunk/src/org/expeditee/gui/Frame.java	(revision 1506)
@@ -47,5 +47,7 @@
 import org.expeditee.core.Image;
 import org.expeditee.core.bounds.PolygonBounds;
+import org.expeditee.encryption.io.EncryptedExpWriter;
 import org.expeditee.encryption.items.EncryptionPermissionTriple;
+import org.expeditee.encryption.items.UserAppliedEncryptionPermission;
 import org.expeditee.encryption.items.surrogates.Label;
 import org.expeditee.encryption.items.surrogates.Label.LabelInfo;
@@ -195,6 +197,6 @@
 
 	private String _encryptionLabel;
-	
 	private String _homogeneousEncryptionLabel;
+	private List<String> _hetrogeneousEncryptionLabels = new ArrayList<String>();	
 	
 	private String _groupFrameName;
@@ -3007,4 +3009,36 @@
 	
 	public void setFrameEncryptionLabel(String label) {
+		if (label == null) {
+			_encryptionLabel = null;
+			return;
+		}
+		
+		String errorMessage = "You do not have sufficient permissions to set the encryption label to " + label + " on frame " + getName();
+		UserAppliedEncryptionPermission p = getFrameEncryptionPermission().getPermission(this.getOwner(), this.getGroupMembers());
+		String homogeneousEncryptionLabel = getHomogeneousEncryptionLabel();
+		if (homogeneousEncryptionLabel == null) { homogeneousEncryptionLabel = getFrameEncryptionLabel(); }
+		if (homogeneousEncryptionLabel == null) { homogeneousEncryptionLabel = EncryptedExpWriter.getLabelNone(); } 
+		
+		List<String> hetrogeneousFrameOwnerLabels = getHetrogeneousFrameOwnerLabels();
+		
+		switch (p) {
+		case none:
+			MessageBay.displayMessage(errorMessage);
+			return;
+		case homogeneous: 
+			if (!homogeneousEncryptionLabel.equals(label)) {
+				MessageBay.displayMessage(errorMessage);
+				return;
+			}
+			break;
+		case hetrogeneous_owner:
+			if (!homogeneousEncryptionLabel.equals(label) && !hetrogeneousFrameOwnerLabels.contains(label)) {
+				MessageBay.displayMessage(errorMessage);
+				return;
+			}
+			break;
+		case hetrogeneous: break;
+		}
+		
 		LabelInfo labelResult = Label.getLabel(label);
 		boolean isProfileOrNone = label.equals("Profile") || label.equals("None");
@@ -3018,6 +3052,14 @@
 		_encryptionLabel = label;
 	}
+
+	public boolean hasEncryptionPermissionOrHigher(UserAppliedEncryptionPermission permissionLevel) {
+		UserAppliedEncryptionPermission p = getFrameEncryptionPermission().getPermission(this.getOwner(), this.getGroupMembers());
+		return p.ordinal() >= permissionLevel.ordinal();
+	}
 	
 	public EncryptionPermissionTriple getFrameEncryptionPermission() {
+		if (_frameEncryptionPermission == null) {
+			_frameEncryptionPermission = EncryptionPermissionTriple.convertString("300");
+		}
 		return _frameEncryptionPermission;
 	}
@@ -3029,4 +3071,27 @@
 	public String getHomogeneousEncryptionLabel() {
 		return _homogeneousEncryptionLabel;
+	}
+	
+	public List<String> getHetrogeneousFrameOwnerLabels() {
+		if (_hetrogeneousEncryptionLabels == null) {
+			_hetrogeneousEncryptionLabels = new ArrayList<String>();
+		}
+		return _hetrogeneousEncryptionLabels;
+	}
+	
+	public void addToHetrogeneousFrameOwnerLabels(String label) {
+		if (!UserSettings.UserName.get().equals(this.getOwner())) {
+			MessageBay.displayMessage("Only the owner of a frame is able to add hetrogeneous owner encryption labels.");
+			return;
+		}
+		
+		if (_hetrogeneousEncryptionLabels == null) {
+			_hetrogeneousEncryptionLabels = new ArrayList<String>();
+		}
+		if (_hetrogeneousEncryptionLabels.contains(label)) {
+			_hetrogeneousEncryptionLabels.remove(label);
+		} else {
+			_hetrogeneousEncryptionLabels.add(label);
+		}
 	}
 	
@@ -3036,6 +3101,5 @@
 		if (!isProfileOrNone && !labelResult.is(LabelResult.SuccessResolveLabelToKey)) {
 			MessageBay.displayMessage(labelResult.toString());
-			this._homogeneousEncryptionLabel = null;
-			return;
+			MessageBay.displayMessage("You will not be able to set the FrameEncryptionLabel to the Homogeneous Label.");
 		}
 		
Index: trunk/src/org/expeditee/io/Conversion.java
===================================================================
--- trunk/src/org/expeditee/io/Conversion.java	(revision 1505)
+++ trunk/src/org/expeditee/io/Conversion.java	(revision 1506)
@@ -650,5 +650,5 @@
 		}
 
-		if ((method.getReturnType().isEnum()) || (name.equals("getPermission")) || (name.equals("getEncryptionPermission"))) {
+		if ((method.getReturnType().isEnum()) || (name.equals("getPermission")) || (name.equals("getFrameEncryptionPermission"))) {
 			try {
 				return output.getClass().getMethod("getCode", new Class[] {})
Index: trunk/src/org/expeditee/io/DefaultFrameReader.java
===================================================================
--- trunk/src/org/expeditee/io/DefaultFrameReader.java	(revision 1505)
+++ trunk/src/org/expeditee/io/DefaultFrameReader.java	(revision 1506)
@@ -104,4 +104,5 @@
 			_FrameTags.put('k', Frame.class.getMethod("setHomogeneousEncryptionLabel", pString));
 			_FrameTags.put('e', Frame.class.getMethod("setEncryptionPermission", pEncPermission));
+			_FrameTags.put('a', Frame.class.getMethod("addToHetrogeneousFrameOwnerLabels", pString));
 
 			// Note: As of 26/11/18 there are no unused letter item tags.  Use other characters.
Index: trunk/src/org/expeditee/io/DefaultFrameWriter.java
===================================================================
--- trunk/src/org/expeditee/io/DefaultFrameWriter.java	(revision 1505)
+++ trunk/src/org/expeditee/io/DefaultFrameWriter.java	(revision 1506)
@@ -198,4 +198,5 @@
 			_FrameTags.put('k', Frame.class.getMethod("getHomogeneousEncryptionLabel"));
 			_FrameTags.put('e', Frame.class.getMethod("getEncryptionPermission"));
+			_FrameTags.put('a', Frame.class.getMethod("getHetrogeneousFrameOwnerLabels"));
 			
 			// Note: As of 26/11/18 there are no unused letter item tags.  Use other characters.
