Index: trunk/src/org/expeditee/auth/AuthenticatorBrowser.java
===================================================================
--- trunk/src/org/expeditee/auth/AuthenticatorBrowser.java	(revision 1351)
+++ trunk/src/org/expeditee/auth/AuthenticatorBrowser.java	(revision 1352)
@@ -72,4 +72,5 @@
 	// The frame number of the frame containing the current authenticated users public key.
 	public static int CREDENTIALS_FRAME = -1;
+	public static int PASSWORD_RECOVERY_FRAME = -1;
 	public static final String ADMINACCOUNT = "authadmin";
 	public static final String PROFILEENCRYPTIONLABEL = "Profile";
Index: trunk/src/org/expeditee/auth/account/Create.java
===================================================================
--- trunk/src/org/expeditee/auth/account/Create.java	(revision 1351)
+++ trunk/src/org/expeditee/auth/account/Create.java	(revision 1352)
@@ -2,5 +2,4 @@
 
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.FileWriter;
 import java.io.IOException;
@@ -55,6 +54,5 @@
 	 * @param userdata Should contain username, password and email.
 	 */
-	public static void createAccount(Map<AuthenticationTag, String> userdata) throws InvalidFramesetNameException, ExistingFramesetException, 
-		KeyStoreException, NoSuchAlgorithmException, CertificateException, FileNotFoundException, ClassNotFoundException, IOException, SQLException {			
+	public static CreateResult createAccount(Map<AuthenticationTag, String> userdata) {			
 		// Track progress
 		String message = "Creating new user account...";
@@ -68,32 +66,21 @@
 		
 		Progress progressBar = MessageBay.displayProgress(message);
-		try {
-			progressBar.UpdateMessage(message + "Generating Keys.", progress += step);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		DisplayController.refreshBayArea();
+		progress = progress(message + "Generating Keys.", progress, step, progressBar);
 
 		// Generate keys
 		//	Personal key
-		Random rand = new SecureRandom();
-		byte[] keyBytes = new byte[16];
-		rand.nextBytes(keyBytes);
-		SecretKey key = new SecretKeySpec(keyBytes, SymmetricAlgorithm);
-		AuthenticatorBrowser.getInstance().putKey(username, password, key);
-		String personalKey = Base64.getEncoder().encodeToString(key.getEncoded());
+		String personalKey = generatePersonalKey(username, password);
+		if (personalKey == null) {
+			return CreateResult.ErrorSymmetricKey;
+		}
 		//	Public and private keys
-		KeyPairGenerator keyGen = KeyPairGenerator.getInstance(AsymmetricAlgorithm);
-		keyGen.initialize(1024);
-		KeyPair keyPair = keyGen.generateKeyPair();
-		String publicKey = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded());
-		String privateKey = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded());
-		
-		try {
-			progressBar.UpdateMessage(message + "Creating Profile Frameset.", progress += step);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		DisplayController.refreshBayArea();
+		String[] keys = generateAsymmetricKeys();
+		if (keys == null) {
+			return CreateResult.ErrorAsymmetricKeys;
+		} 
+		String privateKey = keys[0];
+		String publicKey = keys[1];
+		
+		progress = progress(message + "Creating Profile Frameset.", progress, step, progressBar);
 		
 		// Update in memory settings
@@ -103,4 +90,114 @@
 		UserSettings.setupDefaultFolders();
 				
+		Frame profile;
+		try {
+			profile = createNewProfile(username, email, personalKey, privateKey, publicKey);
+		} catch (InvalidFramesetNameException | ExistingFramesetException e) {
+			return CreateResult.ErrorNewProfile;
+		}
+		
+		if (AuthenticatorBrowser.CREDENTIALS_FRAME == -1) {
+			return CreateResult.ErrorCredentialsFrame;
+		}
+		
+		progress = progress(message + "Establishing user credentials.", progress, step, progressBar);
+				
+		// Create credentials
+		boolean success = setupCredentialsFrame(username, profile);
+		if (!success) {
+			return CreateResult.ErrorIODuringCredentialsFrameSetup;
+		}
+
+		progress = progress(message + "Creating Individual Space.", progress, step, progressBar);
+		
+		// Copy private resources to personal area
+		Path personalResources = createPersonalArea(username);
+
+		progress = progress(message + "Creating Space For Dead Drops.", progress, step, progressBar);
+		
+		createDeaddropsArea(personalResources);
+		
+		System.err.println("**** Hardwired call in Apollo's AuthioPathManager");
+		AudioPathManager.activateAndScanAudioDir(); // ****
+		
+		progress = progress(message + "Done.", progress, step, progressBar);
+		
+		return CreateResult.SuccessCreateAccount;
+	}
+	
+	public static CreateResult createAlternativeAccess(Map<AuthenticationTag, String> userdata) {
+		String username = userdata.get(AuthenticationTag.Username);
+		FrameIO.CreateFrame(username, null, "default1");
+		return null;
+	}
+		
+	public enum CreateResult {
+		SuccessCreateAccount ("Account created."), 
+		SuccessAlternativeAccount ("Alternative access to account established."), 
+		ErrorSymmetricKey ("An error occured while trying to generate your personal key."),
+		ErrorAsymmetricKeys ("An error occured while trying to generate asymmetric keys."),
+		ErrorNewProfile ("An error occured while creating the profile frames."),
+		ErrorCredentialsFrame ("Unable to establish credentials frame for new profile frame."), 
+		ErrorIODuringCredentialsFrameSetup ("An error occured during the setup of the new users credentials frame.");
+		
+		private String message = null;
+		
+		private CreateResult(String message) {
+			this.message = message;
+		}
+		
+		public String toString() {
+			return message;
+		}
+	}
+	
+	private static int progress(String message, int progress, int step, Progress progressBar) {
+		try {
+			progressBar.UpdateMessage(message, progress += step);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		DisplayController.refreshBayArea();
+		return progress;
+	}
+
+	private static void createDeaddropsArea(Path personalResources) {
+		File deadDropsDir = new File(personalResources.resolve("deaddrops").toAbsolutePath().toString());
+		deadDropsDir.mkdir();
+	}
+
+	private static Path createPersonalArea(String username) {
+		Path personalResources = UserSettings.PublicAndPrivateResources ? FrameIO.setupPersonalResources(username) : Paths.get(FrameIO.PARENT_FOLDER);
+		
+		File contactsDir = new File(personalResources.resolve("contacts").toAbsolutePath().toString());
+		contactsDir.mkdir();
+		return personalResources;
+	}
+
+	private static boolean setupCredentialsFrame(String username, Frame profile) {
+		try {
+			File credentialsDir = new File(profile.getFramesetPath() + username + "-credentials");
+			credentialsDir.mkdir();
+			// 	credentials.inf file.
+			String credentialsPath =  credentialsDir.getAbsolutePath() + File.separator + "credentials.inf";
+			File credentialsFile = new File(credentialsPath);
+			credentialsFile.createNewFile();
+			FileWriter out = new FileWriter(credentialsFile);
+			out.write(AuthenticatorBrowser.CREDENTIALS_FRAME + ".exp");
+			out.flush();
+			out.close();
+			//	migrate credentials frame
+			Frame credentialsFrame = FrameIO.LoadFrame(username + AuthenticatorBrowser.CREDENTIALS_FRAME);
+			Path destinationDirectory = Paths.get(credentialsDir.getAbsolutePath());
+			Path destinationFile = destinationDirectory.resolve(AuthenticatorBrowser.CREDENTIALS_FRAME + ExpReader.EXTENTION);
+			FrameIO.migrateFrame(credentialsFrame, destinationFile);
+			return true;
+		} catch (IOException e) {
+			return false;
+		}
+	}
+
+	private static Frame createNewProfile(String username, String email, String personalKey, String privateKey,
+			String publicKey) throws InvalidFramesetNameException, ExistingFramesetException {
 		// Establish the initial settings for the created user.
 		Map<String, Setting> initialSettings = new HashMap<String, Setting>();
@@ -116,5 +213,5 @@
 		initialSettings.put("org.expeditee.gui.folders.FolderSettings.AudioDirs", FolderSettings.AudioDirs);
 		
-		// Record the credentials frame number
+		// Record the credentials frame number and password colleagues frame
 		Map<String, Consumer<Frame>> notifiers = new HashMap<String, Consumer<Frame>>();
 		notifiers.put("settings.identity", frame -> {
@@ -129,4 +226,8 @@
 			}
 		});
+		notifiers.put("settings.identity.passwordrecovery", frame -> { 
+			AuthenticatorBrowser.PASSWORD_RECOVERY_FRAME = frame.getNumber();
+		});
+		
 		
 		// Create users profile
@@ -143,5 +244,6 @@
 			f.getAllItems().stream().forEach(item -> item.setOwner(username));
 			f.setChanged(true);
-			if (f.getNumber() != AuthenticatorBrowser.CREDENTIALS_FRAME) {
+			if (f.getNumber() != AuthenticatorBrowser.CREDENTIALS_FRAME && 
+					f.getNumber() != AuthenticatorBrowser.PASSWORD_RECOVERY_FRAME) {
 				f.setEncryptionLabel(AuthenticatorBrowser.PROFILEENCRYPTIONLABEL);
 			}
@@ -159,68 +261,35 @@
 			KeyList.PersonalKey.setSetting(backupPersonalKey);
 		}
-		
-		if (AuthenticatorBrowser.CREDENTIALS_FRAME == -1) {
-			System.err.println("authActions::Unable to establish credentials frame for new profile frame.  Account creation failed.");
-			return;
-		}
-		
-		try {
-			progressBar.UpdateMessage(message + "Establishing user credentials.", progress += step);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		DisplayController.refreshBayArea();
-				
-		// Create credentials
-		File credentialsDir = new File(profile.getFramesetPath() + username + "-credentials");
-		credentialsDir.mkdir();
-		// 	credentials.inf file.
-		String credentialsPath =  credentialsDir.getAbsolutePath() + File.separator + "credentials.inf";
-		File credentialsFile = new File(credentialsPath);
-		credentialsFile.createNewFile();
-		FileWriter out = new FileWriter(credentialsFile);
-		out.write(AuthenticatorBrowser.CREDENTIALS_FRAME + ".exp");
-		out.flush();
-		out.close();
-		//	migrate credentials frame
-		Frame credentialsFrame = FrameIO.LoadFrame(username + AuthenticatorBrowser.CREDENTIALS_FRAME);
-		Path destinationDirectory = Paths.get(credentialsDir.getAbsolutePath());
-		Path destinationFile = destinationDirectory.resolve(AuthenticatorBrowser.CREDENTIALS_FRAME + ExpReader.EXTENTION);
-		FrameIO.migrateFrame(credentialsFrame, destinationFile);
-
-		try {
-			progressBar.UpdateMessage(message + "Creating Individual Space.", progress += step);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		DisplayController.refreshBayArea();
-		
-		// Copy private resources to personal area
-		Path personalResources = UserSettings.PublicAndPrivateResources ? FrameIO.setupPersonalResources(username) : Paths.get(FrameIO.PARENT_FOLDER);
-		
-		File contactsDir = new File(personalResources.resolve("contacts").toAbsolutePath().toString());
-		contactsDir.mkdir();
-
-		try {
-			progressBar.UpdateMessage(message + "Creating Space For Dead Drops.", progress += step);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		DisplayController.refreshBayArea();
-		
-		File deadDropsDir = new File(personalResources.resolve("deaddrops").toAbsolutePath().toString());
-		deadDropsDir.mkdir();
-		
-		System.err.println("**** Hardwired call in Apollo's AuthioPathManager");
-		AudioPathManager.activateAndScanAudioDir(); // ****
-		
-		try {
-			progressBar.UpdateMessage(message + "Done.", 100);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		DisplayController.refreshBayArea();
-	}
-	
+		return profile;
+	}
+	
+	private static String generatePersonalKey(String username, String password) {
+		try {
+			Random rand = new SecureRandom();
+			byte[] keyBytes = new byte[16];
+			rand.nextBytes(keyBytes);
+			SecretKey key = new SecretKeySpec(keyBytes, SymmetricAlgorithm);
+			AuthenticatorBrowser.getInstance().putKey(username, password, key);
+			String personalKey = Base64.getEncoder().encodeToString(key.getEncoded());
+			return personalKey;
+		} catch (KeyStoreException | NoSuchAlgorithmException | CertificateException | ClassNotFoundException
+				| IOException | SQLException e) {
+			return null;
+		}
+	}
+	
+	private static String[] generateAsymmetricKeys() {
+		try {
+			KeyPairGenerator keyGen = KeyPairGenerator.getInstance(AsymmetricAlgorithm);
+			keyGen.initialize(1024);
+			KeyPair keyPair = keyGen.generateKeyPair();
+			String publicKey = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded());
+			String privateKey = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded());
+			return new String[] { privateKey, publicKey };
+		} catch (NoSuchAlgorithmException e) {
+			return null;
+		}
+	}
+		
 	private static TextSetting constructTextSetting(String tooltip, String text, String data) {
 		return new TextSetting(tooltip, text) {
Index: trunk/src/org/expeditee/settings/identity/passwordrecovery/Colleagues.java
===================================================================
--- trunk/src/org/expeditee/settings/identity/passwordrecovery/Colleagues.java	(revision 1352)
+++ trunk/src/org/expeditee/settings/identity/passwordrecovery/Colleagues.java	(revision 1352)
@@ -0,0 +1,11 @@
+package org.expeditee.settings.identity.passwordrecovery;
+
+import org.expeditee.setting.StringSetting;
+
+public class Colleagues {
+	public static final StringSetting Colleague_One = new StringSetting("Your first password recovery colleague.", null);
+	public static final StringSetting Colleague_Two = new StringSetting("Your second password recovery colleague.", null);
+	
+	public static final StringSetting Colleague_One_Email = new StringSetting("Your first password recovery colleagues public facing email.", null);
+	public static final StringSetting Colleague_Two_Email = new StringSetting("Your second password recovery colleagues public facing email.", null);
+}
