Index: trunk/src/org/expeditee/auth/Actions.java
===================================================================
--- trunk/src/org/expeditee/auth/Actions.java	(revision 1322)
+++ trunk/src/org/expeditee/auth/Actions.java	(revision 1323)
@@ -452,4 +452,5 @@
 		notifiers.put(Constants.SETTINGS_AUTH, frame -> {
 			AuthenticatorBrowser.CREDENTIALS_FRAME = frame.getNumber();
+			frame.addToData("MultiuserCredentials");
 			Collection<Text> textItems = frame.getTextItems();
 			for (Text t: textItems) {
Index: trunk/src/org/expeditee/auth/EncryptedExpReader.java
===================================================================
--- trunk/src/org/expeditee/auth/EncryptedExpReader.java	(revision 1322)
+++ trunk/src/org/expeditee/auth/EncryptedExpReader.java	(revision 1323)
@@ -25,6 +25,4 @@
 import org.expeditee.settings.identity.secrets.KeyList;
 import org.ngikm.cryptography.CryptographyConstants;
-
-import sun.reflect.generics.reflectiveObjects.NotImplementedException;
 
 public class EncryptedExpReader extends ExpReader implements CryptographyConstants {
@@ -123,7 +121,10 @@
 					return readLine();
 				} else {
-					// TODO: resolve encryption label, what does this mean?
 					personalKey = resolveLabel(label);
-					return readLine();
+					if (personalKey == null) {
+						return null;
+					} else {
+						return readLine();
+					}
 				}
 			}
@@ -146,99 +147,7 @@
 		
 		private SecretKeySpec resolveLabel(String label) {
-			throw new NotImplementedException();
+			byte[] keyBytes = EncryptedExpWriter.resolveKeyFromLabel(label, "");
+			return new SecretKeySpec(keyBytes, SymmetricAlgorithm);
 		}
 	}
-	
-//	private class EncryptedProfileLineReader extends BufferedReader {
-//
-//		public EncryptedProfileLineReader(final Reader in) {
-//			super(in);
-//		}
-//		
-//		@Override
-//		/**
-//		 * Reads a line from an encrypted exp file that uses profile encryption (single key; personal key)
-//		 * Returns that line to process, null if the currently logged in users personal key is not the appropriate one (access denied).
-//		 */
-//		public String readLine() throws IOException {
-//			// read encrypted line
-//			final String line = super.readLine();
-//			
-//			if (line.isEmpty()) { return ""; }
-//			if (line.startsWith(ENCRYPTED_EXP_FLAG)) {
-//				// record/overwrite previous personal key then ignore this line by recursing
-//				final Text text = KeyList.PersonalKey.get();
-//				final byte[] keyBytes = Base64.getDecoder().decode(text.getData().get(0));
-//				personalKey = new SecretKeySpec(keyBytes, SymmetricAlgorithm);
-//				return readLine();
-//			}
-//			
-//			// decrypt line and return result
-//			final byte[] toDecrypt = Base64.getDecoder().decode(line);
-//			final byte[] decrypted = DecryptSymmetric(toDecrypt, personalKey);
-//			if (decrypted == null) {
-//				accessDenied = true;
-//				return null; // access denied
-//			} else {
-//				final String decryptedLine = new String(decrypted);
-//				if (decryptedLine.startsWith("Z")) { return decryptedLine.trim(); }
-//				else { return decryptedLine; }
-//			}
-//		}	
-//	}
-//	
-//	private class EncryptedLineReader extends BufferedReader {
-//		
-//		public EncryptedLineReader(final Reader in) {
-//			super(in);
-//		}
-//		
-//		@Override
-//		/**
-//		 * Reads a line from an encrypted exp file that uses (potentially multiple) labeled keys
-//		 * Returns that line to process, null if the ...
-//		 */
-//		public String readLine() throws IOException {
-//			// read encrypted line
-//			final String line = super.readLine();
-//			
-//			if (line.isEmpty()) { return ""; }
-//			if (line.startsWith(ENCRYPTED_EXP_FLAG)) {
-//				// resolve labels to secret keys
-//				final List<String> labels = Arrays.asList(line.split(" ")).stream().skip(1).collect(Collectors.toList());
-//				final ThrowingFunction<String, SecretKey, Exception> worker = new ThrowingFunction<String, SecretKey, Exception>() {
-//					@Override
-//					public SecretKey applyThrows(final String label) throws Exception {
-//						return Authenticator.getInstance().getSecretKey(label, System.getProperty("password"));
-//					}
-//				};
-//				multiKey = labels.stream().map(l -> {
-//					try {
-//						return worker.apply(l);
-//					} catch (final Exception e) {
-//						return null;
-//					}
-//				}).collect(Collectors.toList());
-//				
-//				// confirm you have all the keys necessary for decryption
-//				if (multiKey.contains(null)) {
-//					return null;
-//				}
-//				
-//				// move onto the next line
-//				return readLine();
-//			}
-//			
-//			// decrypt line and return result
-//			final byte[] toDecrypt = Base64.getDecoder().decode(line);
-//			byte[] decryptedBytes = null;
-//			for (final SecretKey key: multiKey) {
-//				decryptedBytes = DecryptSymmetric(toDecrypt, key);
-//				if (decryptedBytes == null) { return null; }
-//			}
-//			final String decrypted = new String(decryptedBytes);
-//			if (decrypted.startsWith("Z")) { return decrypted.trim(); }
-//			else { return decrypted; }
-//		}
-//	}
 }
Index: trunk/src/org/expeditee/auth/EncryptedExpWriter.java
===================================================================
--- trunk/src/org/expeditee/auth/EncryptedExpWriter.java	(revision 1322)
+++ trunk/src/org/expeditee/auth/EncryptedExpWriter.java	(revision 1323)
@@ -6,4 +6,5 @@
 import java.util.Arrays;
 import java.util.Base64;
+import java.util.Collection;
 import java.util.List;
 
@@ -15,6 +16,10 @@
 import javax.crypto.spec.SecretKeySpec;
 
+import org.expeditee.gui.Frame;
+import org.expeditee.gui.FrameIO;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.io.ExpWriter;
 import org.expeditee.items.Text;
+import org.expeditee.settings.UserSettings;
 import org.expeditee.settings.identity.secrets.KeyList;
 import org.ngikm.cryptography.CryptographyConstants;
@@ -36,5 +41,5 @@
 			label = "Profile";
 		} else {
-			byte[] keyBytes = resolveKeyFromLabel(encryptionLabel);
+			byte[] keyBytes = resolveKeyFromLabel(encryptionLabel, _framename);
 			key = new SecretKeySpec(keyBytes, SymmetricAlgorithm);
 			label = encryptionLabel;
@@ -67,6 +72,38 @@
 	}
 	
-	private byte[] resolveKeyFromLabel(String label) {
-		return null;
+	protected static byte[] resolveKeyFromLabel(String label, String framename) {
+		String credentialsFrameName = UserSettings.ProfileName.get() + AuthenticatorBrowser.CREDENTIALS_FRAME;
+		Frame credentialsFrame = FrameIO.LoadFrame(credentialsFrameName);
+		Collection<Text> textItems = credentialsFrame.getTextItems();
+		textItems.removeIf(t -> !t.getText().equals("Secrets"));
+		textItems.removeIf(t -> !t.hasLink());
+		if (textItems.isEmpty()) {
+			MessageBay.errorMessage("Unable to find label " + label + " to encrypt frame " + framename + ".");
+			return null;
+		} else {
+			Text linkToSecretsFrame = textItems.iterator().next();
+			Frame secretsFrame = FrameIO.LoadFrame(linkToSecretsFrame.getParent().getFramesetName() + linkToSecretsFrame.getLink());
+			Collection<Text> labels = secretsFrame.getTextItems();
+			labels.removeIf(lbl -> lbl.getText().equals(label));
+			labels.removeIf(lbl -> lbl.getData() == null || lbl.getData().size() == 0);
+			if (labels.isEmpty()) {
+				MessageBay.errorMessage("Unable to find label " + label + " to encrypt frame " + framename + ".");
+				return null;
+			}
+			
+			Text labelItem = labels.iterator().next();
+			String data = labelItem.getData().get(0);
+			if (data.contains("{")) {
+				MessageBay.errorMessage("You only have a fraction of the required key to access " + framename + ".");
+				return null;
+			} else {
+				try {
+					return Base64.getDecoder().decode(data);
+				} catch (IllegalArgumentException e) {
+					MessageBay.errorMessage("Unable to create key out of data stored in label " + label + ".");
+					return null;
+				}
+			}
+		}
 	}
 	
Index: trunk/src/org/expeditee/io/ExpWriter.java
===================================================================
--- trunk/src/org/expeditee/io/ExpWriter.java	(revision 1322)
+++ trunk/src/org/expeditee/io/ExpWriter.java	(revision 1323)
@@ -51,4 +51,6 @@
 	protected StringBuilder _stringWriter = null;
 
+	protected String _framename;
+
 	private static final char TERMINATOR = 'Z';
 
@@ -59,4 +61,5 @@
 	@Override
 	public void initialise(Frame start, Writer writer) throws IOException {
+		_framename = start.getName();
 		String name = start.getFramesetName().toLowerCase();
 
