Index: trunk/src/org/expeditee/encryption/Actions.java
===================================================================
--- trunk/src/org/expeditee/encryption/Actions.java	(revision 1429)
+++ trunk/src/org/expeditee/encryption/Actions.java	(revision 1430)
@@ -23,4 +23,5 @@
 import org.expeditee.gui.Frame;
 import org.expeditee.gui.FrameIO;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.items.Item;
 import org.expeditee.items.Text;
@@ -31,6 +32,20 @@
 public class Actions implements CryptographyConstants {
 	
-	public static void TestSurrogate(Item primary) {
-		System.out.println("Test surrogates: ");
+	public static void SetSurrogateFor(Text surrogate, Text action) {
+		Frame frame = DisplayController.getCurrentFrame();
+		String[] split = action.getText().split(" ");
+		
+		if (split.length >= 2) {
+			int primaryID = Integer.parseInt(split[1]);
+			Item itemWithID = frame.getItemWithID(primaryID);
+			if (itemWithID == null) {
+				MessageBay.displayMessage("No item with ID " + primaryID + " exists on this frame.");
+				return;
+			} else {
+				itemWithID.addToSurrogates(surrogate);
+			}
+		} else {
+			MessageBay.displayMessage("Usage: SetSurrogateFor Int, inject desired surrogate.");
+		}
 	}
 	
Index: trunk/src/org/expeditee/encryption/io/EncryptedExpWriter.java
===================================================================
--- trunk/src/org/expeditee/encryption/io/EncryptedExpWriter.java	(revision 1429)
+++ trunk/src/org/expeditee/encryption/io/EncryptedExpWriter.java	(revision 1430)
@@ -194,8 +194,8 @@
 		Function<Item, Boolean> isTagInherited = surrogate -> surrogate.isTagInherited(tag + "");
 		BinaryOperator<Boolean> trueExists = (a, b) -> a || b;
-		boolean surrogatesInherit = surrogateItems.stream().map(isTagInherited).collect(Collectors.reducing(trueExists)).get();
+		boolean surrogatesInherit = surrogateItems.stream().map(isTagInherited).collect(Collectors.reducing(trueExists)).orElseGet(() -> false);
 		boolean userHasKey = Label.getLabel(toWrite.getEncryptionLabel()) == LabelResult.SuccessResolveLabelToKey;
 		
-		// If we have no surrogates that inherit this property from us, and we have the label required to encrypt it, then we should entry it.
+		// If we have no surrogates that inherit this property from us, and we have the label required to encrypt it, then we should encrypt it.
 		if (!surrogatesInherit && userHasKey) {
 			EncryptionDetail reencryptOnSave = new EncryptionDetail(EncryptionDetail.Type.ReencryptOnSave);
Index: trunk/src/org/expeditee/encryption/items/surrogates/Label.java
===================================================================
--- trunk/src/org/expeditee/encryption/items/surrogates/Label.java	(revision 1429)
+++ trunk/src/org/expeditee/encryption/items/surrogates/Label.java	(revision 1430)
@@ -54,9 +54,11 @@
 
 	public static List<String> getAccessibleLabelsNames(ItemsList itemsList) {
+		// TODO make copy of itemsList in here and then adjust callers so they do not need to make copy.
+		// Alternatively, filter instead of removeIf
 		Text[] userLabels = KeyList.UserLabels.get();
 		Stream<String> accessibleUserWideLabels = Arrays.asList(userLabels).stream().map(label -> label.getText());
 		
-		Predicate<Item> isLabelWithoutEncryptionLabel = item -> item.getEncryptionLabel() == null || item.getEncryptionLabel().isEmpty();
-		itemsList.removeIf(isLabelWithoutEncryptionLabel);
+		Predicate<Item> isItemWithoutEncryptionLabel = item -> item.getEncryptionLabel() == null || item.getEncryptionLabel().isEmpty();
+		itemsList.removeIf(isItemWithoutEncryptionLabel);
 		Stream<String> accessibleFrameLocalLabels = itemsList.underlying().stream().map(item -> item.getEncryptionLabel()).distinct();
 		
Index: trunk/src/org/expeditee/gui/AttributeUtils.java
===================================================================
--- trunk/src/org/expeditee/gui/AttributeUtils.java	(revision 1429)
+++ trunk/src/org/expeditee/gui/AttributeUtils.java	(revision 1430)
@@ -308,4 +308,6 @@
 			_Attrib.put("EncryptionLabel", 		Item.class.getMethod("getEncryptionLabel"), 
 												Item.class.getMethod("setEncryptionLabel", pString));
+			_Attrib.put("ID", 					Item.class.getMethod("getID"), 
+												Item.class.getMethod("setIDFail", pInt));
 			
 			// Text Items
Index: trunk/src/org/expeditee/gui/DisplayController.java
===================================================================
--- trunk/src/org/expeditee/gui/DisplayController.java	(revision 1429)
+++ trunk/src/org/expeditee/gui/DisplayController.java	(revision 1430)
@@ -1235,4 +1235,14 @@
 		
 		Label.progressSurrogateMode();
+		Frame currentFrame = DisplayController.getCurrentFrame();
+		ItemsList primaryBody = currentFrame.getPrimaryBody();
+		ItemsList primaryBodyCopy = new ItemsList(primaryBody);
+		List<String> accessibleLabelsNames = Label.getAccessibleLabelsNames(primaryBodyCopy);
+		StringBuilder sb = new StringBuilder("Surrogate Mode currently accepts labels: ");
+		for (String acceessibleLabel: accessibleLabelsNames) {
+			sb.append(acceessibleLabel + ", ");
+		}
+		String message = sb.substring(0, sb.length() - 2);
+		MessageBay.displayMessage(message);
 		
 		getCurrentFrame().parse();
Index: trunk/src/org/expeditee/gui/Frame.java
===================================================================
--- trunk/src/org/expeditee/gui/Frame.java	(revision 1429)
+++ trunk/src/org/expeditee/gui/Frame.java	(revision 1430)
@@ -31,4 +31,5 @@
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.Stack;
 import java.util.stream.Collectors;
@@ -1020,4 +1021,6 @@
 		if (item.isSurrogate()) {
 			removeItem(item, recalculate, _surrogateItemsBody);
+			Set<Item> primariesSurrogates = item.getPrimary().getSurrogates();
+			primariesSurrogates.remove(item);
 		} else {
 			removeItem(item, recalculate, _primaryItemsBody);
Index: trunk/src/org/expeditee/items/Item.java
===================================================================
--- trunk/src/org/expeditee/items/Item.java	(revision 1429)
+++ trunk/src/org/expeditee/items/Item.java	(revision 1430)
@@ -1043,6 +1043,5 @@
 	 * TODO: What does it mean to have a negative ID# (as used in TDFC)? cts16
 	 */
-	public int getID()
-	{
+	public int getID() {
 		return _id;
 	}
@@ -2219,4 +2218,16 @@
 		}
 	}
+	
+	/**
+	 * Function called when a user attempts to set the ID of a Item.  Simply provides
+	 * feedback to the user telling them that they are not allowed to do this.  This
+	 * function is provided so that users are able to get the ID of a item when 
+	 * extracting properties.  See {@link org.expeditee.gui.AttributeUtils}.
+	 * 
+	 * @param newID The requested new ID that will be ignored.
+	 */
+	public void setIDFail(int newID) {
+		MessageBay.displayMessage("A user cannot change the ID of an item.");
+	}
 
 	/**
@@ -4156,4 +4167,5 @@
 
 	public void addToSurrogates(Item surrogate) {
+		this.getParent().removeItem(surrogate);
 		this.surrogateItems.add(surrogate);
 		surrogate.setAsSurrogateFor(this);
@@ -4162,5 +4174,4 @@
 		EncryptionDetail reencryptOnSave = new EncryptionDetail(EncryptionDetail.Type.ReencryptOnSave);
 		EncryptionDetail unencryptedOnSave = new EncryptionDetail(EncryptionDetail.Type.UnencryptedOnSave);
-		EncryptionDetail inheritanceCheckOnSave = new EncryptionDetail(EncryptionDetail.Type.InheritanceCheckOnSave);
 		
 		for (Character tag: DefaultFrameWriter.getItemCharTags().keySet()) {
@@ -4179,5 +4190,5 @@
 		
 		for (String tag: DefaultFrameWriter.getItemStrTags().keySet()) {
-			primaryPropertyEncryption.put(tag, inheritanceCheckOnSave.clone());
+			primaryPropertyEncryption.put(tag, unencryptedOnSave.clone());
 			surrogate.surrogatePropertyInheritance.put(tag + "", true);
 		}
@@ -4231,4 +4242,7 @@
 	 */
 	protected boolean subjectToInheritanceCheckOnSave(String tag) {
+		if (tag.equals(DefaultFrameWriter.TYPE_AND_ID_STR)) {
+			return false;
+		}
 		Item primary = getPrimary();
 		if (primary == null) return false;
