Index: /trunk/src/org/expeditee/encryption/io/EncryptedExpReader.java
===================================================================
--- /trunk/src/org/expeditee/encryption/io/EncryptedExpReader.java	(revision 1412)
+++ /trunk/src/org/expeditee/encryption/io/EncryptedExpReader.java	(revision 1413)
@@ -26,5 +26,4 @@
 import org.expeditee.encryption.items.surrogates.EncryptionDetail;
 import org.expeditee.encryption.items.surrogates.Label;
-import org.expeditee.encryption.items.surrogates.Surrogate;
 import org.expeditee.encryption.items.surrogates.Label.LabelResult;
 import org.expeditee.gui.Frame;
@@ -37,4 +36,5 @@
 
 public class EncryptedExpReader extends ExpReader implements CryptographyConstants {
+	
 	private static final String ENCRYPTED_EXP_FLAG = "EncryptedExp";
 	private static final String labelProfile = "Profile";
@@ -43,8 +43,4 @@
 	private boolean accessDenied = false;
 
-	public EncryptedExpReader(String frameName) {
-		super(frameName);
-	}
-
 	public static boolean isEncryptedExpediteeFile(final String path) throws IOException {
 		final BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"));
@@ -52,4 +48,8 @@
 		in.close();
 		return firstLine.startsWith(ENCRYPTED_EXP_FLAG);
+	}
+	
+	public EncryptedExpReader(String frameName) {
+		super(frameName);
 	}
 	
@@ -132,10 +132,14 @@
 				continue;
 			}
+			
 			String tag = getTagEnc(next);
-			if (tag.equals("S")) {
+			if (next.startsWith("S ")) {
 				currentItem = newItem(next);
 				_linePoints.put(currentItem.getID(), currentItem);
 				newFrame.addItem(currentItem);
 				currentItem.setEncryptionDetailForTag(tag + "", EncryptionDetail.UnencryptedOnSave);
+			} else if (next.startsWith("SurrogateFor")) {
+				int parentID = Integer.parseInt(next.split(" ")[1]);
+				newFrame.getItemWithID(parentID).addToSurrogates(currentItem);
 			} else if (currentItem != null && actionShouldBeDelayed(tag.charAt(0))) { 
 				delayedActions.add(new DelayedAction(currentItem, next));
@@ -147,6 +151,6 @@
 		}
 		
-		if (next.equals("Z...")) {
-			next = readTheSurrogateItems(newFrame, delayedActions);
+		if (next.equals(EncryptedExpWriter.SURROGATE_TERMINATOR)) {
+			next = readTheItems(newFrame, delayedActions);
 		}
 		
@@ -159,4 +163,8 @@
 		String tag = getTagEnc(line);
 		String value = getValue(line);
+		
+		if (item.isSurrogate() && item.isTagInherited(tag)) {
+			return;
+		}
 		
 		// Attempt to decrypt the line if necessary.
@@ -192,49 +200,4 @@
 		}
 	}
-		
-	private String readTheSurrogateItems(Frame newFrame, List<DelayedAction> delayedActions) throws IOException {
-		String next = null;
-		Item currentItem = null;
-		
-		Predicate<String> endOfSection = s -> s.equals("Z") || s.equals("Z...");
-		while (_reader.ready() && !endOfSection.test(next = _reader.readLine())) {
-			if (!isValidLine(next)) {
-				continue;
-			}
-			
-			String tag = getTagEnc(next);
-			if (tag.equals("S") && !next.startsWith("SurrogateFor")) {
-				currentItem = newItem(next);
-				currentItem.setEncryptionDetailForTag(tag + "", EncryptionDetail.UnencryptedOnSave);
-			} else if (next.startsWith("SurrogateFor")) {
-				String id = next.split(" ")[1];
-				Item classic = newFrame.getItemWithID(Integer.parseInt(id));
-				if (id == null) {
-					System.err.println("WARNING: Attempted to create surrogate for classic ID " + 
-							id + " but was no item on frame " + newFrame.getName() + " exists.");
-					continue;
-				}
-				currentItem.setAsSurrogateFor(classic);
-				classic.addToSurrogates(new Surrogate(currentItem));
-			} else if (currentItem != null && actionShouldBeDelayed(getTag(next))) { 
-				delayedActions.add(new DelayedAction(currentItem, next));
-			} else if (currentItem != null) {
-				processBodyLine(currentItem, next);
-			} else {
-				System.err.println("Error while reading in frame (ExpReader): Found body line but no current item to apply it to.");
-			}
-		}
-
-		return next;
-	}
-	
-	protected static String getTagEnc(String line) {
-		char charAtZero = line.charAt(0);
-		if (charAtZero == '_') {
-			return line.split(" ")[0];
-		} else {
-			return charAtZero + "";
-		}
-	}
 	
 	protected static String getValue(String line) {
@@ -247,5 +210,14 @@
 	}
 	
-	protected static boolean isEncryptedLine(String line) {
+	private static String getTagEnc(String line) {
+		char charAtZero = line.charAt(0);
+		if (charAtZero == '_') {
+			return line.split(" ")[0];
+		} else {
+			return charAtZero + "";
+		}
+	}
+		
+	private static boolean isEncryptedLine(String line) {
 		if (line.startsWith("S") || line.startsWith("_el")) {
 			return false;
@@ -278,5 +250,5 @@
 		}
 	}
-	
+
 	private class EncryptedLineReader extends BufferedReader {
 		private boolean noneMode = false;
Index: /trunk/src/org/expeditee/encryption/io/EncryptedExpWriter.java
===================================================================
--- /trunk/src/org/expeditee/encryption/io/EncryptedExpWriter.java	(revision 1412)
+++ /trunk/src/org/expeditee/encryption/io/EncryptedExpWriter.java	(revision 1413)
@@ -6,11 +6,11 @@
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Base64;
 import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Set;
-import java.util.function.Consumer;
+import java.util.function.BinaryOperator;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import javax.crypto.BadPaddingException;
@@ -24,5 +24,4 @@
 import org.expeditee.encryption.items.surrogates.EncryptionDetail;
 import org.expeditee.encryption.items.surrogates.Label;
-import org.expeditee.encryption.items.surrogates.Surrogate;
 import org.expeditee.encryption.items.surrogates.Label.LabelResult;
 import org.expeditee.gui.Frame;
@@ -76,24 +75,4 @@
 	
 	@Override
-	public void outputFrame(Frame frame) throws IOException {
-		if (_writer == null) { return; }
-		
-		preOutputFrame();
-		writeHeader(frame);
-		
-		// write item
-		writeItemData(frame);
-		writeTerminator();
-		
-		// write lines and constraints
-		writeLineData();
-		writeTerminator();
-		writeConstraintData();
-		writeTerminator();
-		
-		writeLine(SessionStats.getFrameEventList(frame));
-	}
-	
-	@Override
 	protected void preOutputFrame() {
 		try {
@@ -107,4 +86,24 @@
 	
 	@Override
+	public void outputFrame(Frame frame) throws IOException {
+		if (_writer == null) { return; }
+		
+		preOutputFrame();
+		writeHeader(frame);
+		
+		// write item
+		writeItemData(frame);
+		writeTerminator();
+		
+		// write lines and constraints
+		writeLineData();
+		writeTerminator();
+		writeConstraintData();
+		writeTerminator();
+		
+		writeLine(SessionStats.getFrameEventList(frame));
+	}
+	
+	@Override
 	protected void writeLine(String line) throws IOException {
 		// do not write empty lines
@@ -125,28 +124,18 @@
 	}
 	
-	@Override
-	protected void writeLineData() throws IOException {
-		super.writeLineData();
-		
-		writeSurrogateLineData();
-	}
-	
-	@Override
 	protected void writeClass(Item toWrite) throws IOException {
 		LinkedHashMap<Character,Method> itemTags = new LinkedHashMap<Character, Method>(getItemTags());
 		LinkedHashMap<String,Method> itemTagsExt = new LinkedHashMap<String, Method>(getItemTagsExt());
 		
-		// Perform final update on surrogates to ensure inheritance works.
-		Set<Surrogate> surrogates = toWrite.getSurrogates();
-		for (Surrogate s: surrogates) {
-			s.toString();
-		}
-		
 		writeTag(toWrite, new Object[] {}, itemTags, 'S');
 		writeTag(toWrite, new Object[] {}, itemTagsExt, "_el");
 		
+		if (toWrite.isSurrogate()) {
+			writeLine("SurrogateFor " + toWrite.getClassic().getID());
+		}
+		
 		itemTags.remove('S');
 		itemTagsExt.remove("_el");
-		
+				
 		writeTags(toWrite, new Object[] {}, itemTags);
 		writeTags(toWrite, new Object[] {}, itemTagsExt);
@@ -155,42 +144,21 @@
 	@Override
 	protected <T> void writeTag(Item toWrite, Object[] param, LinkedHashMap<T, Method> tags, T tag) {
+		if (toWrite.isSurrogate() && toWrite.isTagInherited(tag + "")) {
+			return;
+		}
 		EncryptionDetail encryptionDetail = toWrite.getEncryptionDetailForTag(tag + "");
-		switch (encryptionDetail) {
+				
+		switch(encryptionDetail) {
 		case UnencryptedOnSave:
-			super.writeTag(toWrite, param, tags, tag);
+			writeTagUnencryptedOnSave(toWrite, param, tags, tag);
+			break;
+		case InheritanceCheckOnSave:
+			writeTagInheritanceCheckOnSave(toWrite, tags, tag);
 			break;
 		case ReencryptOnSave:
-			Method toRun = tags.get(tag);
-			Class<?> declarer = toRun.getDeclaringClass();
-			LabelResult res = Label.resolveKey(toWrite.getEncryptionLabel());
-			if (declarer.isAssignableFrom(toWrite.getClass()) && res == LabelResult.SuccessResolveLabelToKey) {
-				SecretKey key = new SecretKeySpec(res.key, SymmetricAlgorithm);
-				try {
-					Object o = toRun.invoke(toWrite, new Object[] {});
-					o = Conversion.ConvertToExpeditee(toRun, o);
-					if (o != null) {
-						if (o instanceof List) {
-							for (Object line: (List<?>)o) {
-								byte[] encryptedBytes = EncryptSymmetric(line.toString().getBytes(), key);
-								writeLine(tag + "E", Base64.getEncoder().encodeToString(encryptedBytes));
-							}
-						} else {
-							byte[] encryptedBytes = EncryptSymmetric(o.toString().getBytes(), key);
-							writeLine(tag + "E", Base64.getEncoder().encodeToString(encryptedBytes));
-						}
-					}
-				} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
-					e.printStackTrace();
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
+			writeTagReencryptOnSave(toWrite, tags, tag);
 			break;
 		case UseUndecipheredValueOnSave:
-			try {
-				writeLine(tag + "E", encryptionDetail.getUndecipheredValue());
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
+			writeTagUseUndecipheredValueOnSave(toWrite, tags, tag);
 			break;
 		}
@@ -204,55 +172,82 @@
 		}
 		
-		for (final Item i: frame.getBodyItemsWithInsufficientPermissions()) {
+		for (Item i: frame.getBodyItemsWithInsufficientPermissions()) {
 			assert (!(i instanceof Line));
 			writeItem(i);
 		}
 		
-		writeSurrogateItemsData(frame);
-	}
-	
-	private void writeSurrogateItemsData(Frame frame) throws IOException {
-		List<Surrogate> surrogates = new ArrayList<Surrogate>();
-		
-		Consumer<? super Item> store = item -> surrogates.addAll(item.getSurrogates());
-		frame.getItemsToSave().forEach(store);
-		frame.getBodyItemsWithInsufficientPermissions().forEach(store);
-		
+		List<Item> surrogates = frame.getSurrogateItemsToSave();
 		if (!surrogates.isEmpty()) {
-			// If there is some surrogates, write the surrogate 
-			// terminator, then write out the surrogates.
 			writeSurrogateTerminator();
-			
-			for (Surrogate surrogate: surrogates) {
-				String output = surrogate.toString();
-				writeLine(output);
-			}
-		}
-	}
-
-	private void writeSurrogateLineData() throws IOException {
-		List<Surrogate> surrogateLines = new ArrayList<Surrogate>();
-		
-		for(Item lineEnd: _lineEnds) {
-			List<Line> lines = lineEnd.getLines();
-			for (Line line: lines) {
-				surrogateLines.addAll(line.getSurrogates());
-			}
-		}
-		
-		if (!surrogateLines.isEmpty()) {
-			// If there is some surrogates, write the surrogate 
-			// terminator, then write out the surrogates.
-			writeSurrogateTerminator();
-			
-			for (Surrogate surrogate: surrogateLines) {
-				String output = surrogate.toString();
-				writeLine(output);
-			}
-		}
+			for (Item i: surrogates) {
+				assert (!(i instanceof Line));
+				writeItem(i);
+			}
+		}
+	}
+	
+	private <T> void writeTagInheritanceCheckOnSave(Item toWrite, LinkedHashMap<T, Method> tags, T tag) {	
+		List<Item> surrogateItems = toWrite.getSurrogates().stream().collect(Collectors.toList());
+		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();
+		if (surrogatesInherit && 
+				Label.resolveKey(toWrite.getEncryptionLabel()) == LabelResult.SuccessResolveLabelToKey) {
+			toWrite.setEncryptionDetailForTag(tag + "", EncryptionDetail.UnencryptedOnSave);
+			writeTagUnencryptedOnSave(toWrite, new Object[] {}, tags, tag);
+		} else {
+			toWrite.setEncryptionDetailForTag(tag + "", EncryptionDetail.ReencryptOnSave);
+			writeTagReencryptOnSave(toWrite, tags, tag);
+		}
+	}
+	
+	private <T> void writeTagReencryptOnSave(Item toWrite, LinkedHashMap<T, Method> tags, T tag) {
+		Method toRun = tags.get(tag);
+		Class<?> declarer = toRun.getDeclaringClass();
+		LabelResult res = Label.resolveKey(toWrite.getEncryptionLabel());
+		if (declarer.isAssignableFrom(toWrite.getClass()) && res == LabelResult.SuccessResolveLabelToKey) {
+			try {
+				Object o = toRun.invoke(toWrite, new Object[] {});
+				o = Conversion.ConvertToExpeditee(toRun, o);
+				if (o == null) {
+					return;
+				}
+				if (o instanceof List) {
+					for (Object line: (List<?>) o) {
+						writeLineEnc(tag, line, res.key);
+					}
+				} else {
+					writeLineEnc(tag, o, res.key);
+				}
+			} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	private <T> void writeTagUseUndecipheredValueOnSave(Item toWrite, LinkedHashMap<T, Method> tags, T tag) {
+		EncryptionDetail encryptionDetail = toWrite.getEncryptionDetailForTag(tag + "");
+		try {
+			writeLine(tag + "E", encryptionDetail.getUndecipheredValue());
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private <T> void writeTagUnencryptedOnSave(Item toWrite, Object[] param, LinkedHashMap<T, Method> tags, T tag) {
+		super.writeTag(toWrite, param, tags, tag);
 	}
 	
 	private void writeSurrogateTerminator() throws IOException {
 		writeLine(SURROGATE_TERMINATOR + nl);
+	}
+	
+	private <T> void writeLineEnc(T tag, Object line, byte[] keyBytes) throws IOException {
+		SecretKey key = new SecretKeySpec(keyBytes, SymmetricAlgorithm);
+		byte[] lineEncryptedBytes = EncryptSymmetric(line.toString().getBytes(), key);
+		line = Base64.getEncoder().encodeToString(lineEncryptedBytes);
+		writeLine(tag + "E", line.toString());
 	}
 	
@@ -271,4 +266,4 @@
 			return null;
 		}
-	}	
+	}
 }
Index: /trunk/src/org/expeditee/encryption/items/surrogates/EncryptionDetail.java
===================================================================
--- /trunk/src/org/expeditee/encryption/items/surrogates/EncryptionDetail.java	(revision 1412)
+++ /trunk/src/org/expeditee/encryption/items/surrogates/EncryptionDetail.java	(revision 1413)
@@ -2,5 +2,18 @@
 
 public enum EncryptionDetail {
-	UnencryptedOnSave, ReencryptOnSave, UseUndecipheredValueOnSave;
+	// If the property needs to be unencrypted due to inheritance then do not try to encrypt it.
+	UnencryptedOnSave,
+	
+	// If the property is not inherited by any surrogates then we can try to encrypt it.  
+	// If we do not have key then default to UnencryptedOnSave.
+	ReencryptOnSave,
+	
+	// If the property is no longer inherited by at least one surrogate then this value is present.  
+	// If it turns out there is no longer any surrogates who inherit the value then this value can be replaced with ReencryptOnSave.
+	// Otherwise, this value must be replaced with UnencryptedOnSave.
+	InheritanceCheckOnSave,
+	
+	// If we could not decrypt the value on load then EncryptionDetail.getUndecipheredValue() can be used to get the value for saving.
+	UseUndecipheredValueOnSave;
 	
 	private String undecipheredValue = null;
Index: /trunk/src/org/expeditee/encryption/items/surrogates/Label.java
===================================================================
--- /trunk/src/org/expeditee/encryption/items/surrogates/Label.java	(revision 1412)
+++ /trunk/src/org/expeditee/encryption/items/surrogates/Label.java	(revision 1413)
@@ -1,10 +1,17 @@
 package org.expeditee.encryption.items.surrogates;
 
+import java.util.ArrayList;
 import java.util.Base64;
 import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.expeditee.auth.AuthenticatorBrowser;
+import org.expeditee.gui.DisplayController;
 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;
 import org.expeditee.settings.UserSettings;
@@ -12,5 +19,19 @@
 public class Label {
 	
+	private static List<LabelResult> labelCache = new ArrayList<LabelResult>();
+	private static List<String> forbiddenLabels = new ArrayList<String>();
+	
 	public static LabelResult resolveKey(String label) {
+		
+		if (forbiddenLabels.contains(label)) {
+			return LabelResult.ErrorUnableToFindLabel;
+		}
+		
+		LabelResult fromCache = getFromCache(label);
+		if (fromCache != null) {
+			return fromCache;
+		}
+
+		
 		String credentialsFrameName = UserSettings.ProfileName.get() + 
 				AuthenticatorBrowser.CREDENTIALS_FRAME;
@@ -44,4 +65,6 @@
 				LabelResult res = LabelResult.SuccessResolveLabelToKey;
 				res.key = Base64.getDecoder().decode(data);
+				res.name = label;
+				labelCache.add(res);
 				return res;
 			} catch (IllegalArgumentException e) {
@@ -50,4 +73,36 @@
 		}
 	}
+	
+	public static void progressSurrogateMode() {
+		Collection<Item> allItems = DisplayController.getCurrentFrame().getAllItems();
+		allItems.removeIf(item -> item.getEncryptionLabel() == null);
+		MessageBay.displayMessage("Encryption labels found on items on current frame: ");
+		Set<String> allLabels = allItems.stream().map(i -> i.getEncryptionLabel()).collect(Collectors.toSet());
+		StringBuilder sb = new StringBuilder();
+		for (String label: allLabels) {
+			sb.append(label + ",");
+		}
+		MessageBay.displayMessage(sb.deleteCharAt(sb.length() - 1).toString());
+	}
+	
+	public static void resetSurrogateMode() {
+		// TODO Auto-generated method stub
+		
+	}
+	
+	private static LabelResult getFromCache(String label) {
+		List<LabelResult> cacheCanditates = labelCache.stream().filter(labelResult -> labelResult.name.equals(label)).collect(Collectors.toList());
+		if (!cacheCanditates.isEmpty()) {
+			return cacheCanditates.get(0);
+		} else {
+			return null;
+		}
+	}
+	
+//	private static List<List<String>> permutation(List<String> strings, List<List<String>> acc) {
+//		for (int i = 0; i < strings.size(); i++) {
+//			
+//		}
+//	}
 	
 	public enum LabelResult {
@@ -58,4 +113,5 @@
 		
 		public byte[] key;
+		public String name;
 		
 		@Override
Index: unk/src/org/expeditee/encryption/items/surrogates/Surrogate.java
===================================================================
--- /trunk/src/org/expeditee/encryption/items/surrogates/Surrogate.java	(revision 1412)
+++ 	(revision )
@@ -1,198 +1,0 @@
-package org.expeditee.encryption.items.surrogates;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-
-import org.expeditee.io.Conversion;
-import org.expeditee.io.DefaultFrameWriter;
-import org.expeditee.items.Item;
-import org.expeditee.items.Line;
-import org.expeditee.items.Text;
-
-public class Surrogate {
-	
-	private static List<Surrogate> surrogateCache = new ArrayList<Surrogate>();
-	
-	private static Map<String, Boolean> propertyInheritanceDefault = new HashMap<String, Boolean>();
-	
-	{
-		for (Character tag: DefaultFrameWriter.getItemTags().keySet()) {
-			if (tag == 'T') {
-				propertyInheritanceDefault.put(tag + "", false);
-			} else {
-				propertyInheritanceDefault.put(tag + "", true);
-			}
-		}
-		
-		for (String tag: DefaultFrameWriter.getItemTagsExt().keySet()) {
-			propertyInheritanceDefault.put(tag, true);
-		}
-	}
-	
-	private Item surrogateItem = null;
-	private Map<String, Boolean> propertyInheritance;
-		
-	public Surrogate(Item surrogateItem) {
-		this.surrogateItem = surrogateItem;
-		this.propertyInheritance = new HashMap<String, Boolean>(propertyInheritanceDefault);
-		surrogateCache.add(this);
-	}
-	
-	public String toString() {
-		String nl = System.getProperty("line.separator");
-		List<String> lines = toStringList();
-		return lines.stream().map(l -> l + nl).reduce("", (acc, l) -> acc + l);
-	}
-	
-	public List<String> toStringList() {
-		List<String> lines = new ArrayList<String>();
-		Map<Character,Method> itemTags = new LinkedHashMap<Character, Method>(DefaultFrameWriter.getItemTags());
-		Map<String,Method> itemTagsExt = new LinkedHashMap<String, Method>(DefaultFrameWriter.getItemTagsExt());
-		
-		try {
-			Method methodS = itemTags.get('S');
-			Object o = methodS.invoke(surrogateItem);
-			o = Conversion.ConvertToExpeditee(methodS, o);
-			lines.add("S " + o);
-			lines.add("SurrogateFor " + surrogateItem.getClassic().getID());
-		} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
-			e.printStackTrace();
-		}
-		itemTags.remove('S');
-		itemTagsExt.remove("_el");
-		
-		
-		for(Character itemTag: itemTags.keySet()) {
-			boolean propertyIsInherited = isPropertyIsInherited(itemTag + "");
-			if (propertyIsInherited) {
-				surrogateItem.getClassic().setEncryptionDetailForTag(itemTag + "", EncryptionDetail.UnencryptedOnSave);
-				continue;
-			}
-			
-			Object value = null;
-			if (itemTag == 'T') {
-				value = "REDACTED";
-			} else {
-				try {
-					Method method = itemTags.get(itemTag);
-					Object o = method.invoke(surrogateItem);
-					value = Conversion.ConvertToExpeditee(method, o); 
-				} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
-					e.printStackTrace();
-				}
-			}
-			lines.add(itemTag + " " + value);
-		}
-		for (String itemTag: itemTagsExt.keySet()) {
-			boolean propertyIsInherited = isPropertyIsInherited(itemTag);
-			if (propertyIsInherited) {
-				continue;
-			}
-			try {
-				Method method = itemTagsExt.get(itemTag);
-				Object o = method.invoke(surrogateItem);
-				o = Conversion.ConvertToExpeditee(method, o);
-				lines.add(itemTag + " " + o);
-			} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
-				e.printStackTrace();
-			}
-		}
-		
-		return lines;
-	}
-	
-	public Item getSurrogateItem() {
-		return surrogateItem;
-	}
-	
-	public boolean isPropertyIsInherited(String tag) {
-		if (this.propertyInheritance.containsKey(tag)) {
-			return this.propertyInheritance.get(tag);
-		} else {
-			return false;
-		}
-	}
-	
-	public void setPropertyIsInherited(String tag, boolean value) {
-		this.propertyInheritance.put(tag, value);
-	}
-	
-	public static Surrogate of(Item surrogate) {
-		Optional<Surrogate> s = surrogateCache.stream().filter(si -> si.getSurrogateItem() == surrogate).findAny();
-		if (s.isPresent()) {
-			return s.get();
-		} else {
-			return null;
-		}
-	}
-	
-	public static Surrogate forItem(Item item) {		
-		Item surrogateItem = item.copy();
-		surrogateItem.setID(item.getParent().getNextItemID());
-		surrogateItem.setAsSurrogateFor(item);
-		
-		if (item.isLineEnd()) {
-			handleLineEnd(surrogateItem);
-		}
-		
-		if (surrogateItem instanceof Text && !surrogateItem.isAnnotation()) {
-			surrogateItem.setText("REDACTED");
-		}
-		
-		Surrogate surrogate = new Surrogate(surrogateItem);
-		item.addToSurrogates(surrogate);
-		return surrogate;
-	}
-	
-	private static Surrogate forItem(Line line) {
-		Item startItem = line.getStartItem();
-		Item endItem = line.getEndItem();
-		
-		if (!startItem.isSurrogate()) {
-			Set<Surrogate> surrogates = startItem.getSurrogates();
-			surrogates.removeIf(surrogate -> !surrogate.surrogateItem.isLineEnd());
-			if (surrogates.isEmpty()) {
-				Surrogate surrogate = Surrogate.forItem(startItem);
-				startItem.addToSurrogates(surrogate);
-				startItem = surrogate.surrogateItem;
-			} else {
-				startItem = surrogates.stream().findFirst().get().surrogateItem;
-			}
-		}
-		
-		if (!endItem.isSurrogate()) {
-			Set<Surrogate> surrogates = endItem.getSurrogates();
-			surrogates.removeIf(surrogate -> !surrogate.surrogateItem.isLineEnd());
-			if (endItem.getSurrogates().isEmpty()) {
-				Surrogate surrogate = Surrogate.forItem(endItem);
-				endItem.addToSurrogates(surrogate);
-				endItem = surrogate.surrogateItem;
-			} else {
-				endItem = endItem.getSurrogates().stream().findFirst().get().surrogateItem;
-			}
-		}
-		
-		Line ret = new Line(startItem, endItem, line.getParent().getNextItemID());
-		ret.setAsSurrogateFor(line);
-		Surrogate surrogate = new Surrogate(ret);
-		line.addToSurrogates(surrogate);
-		return surrogate;
-	}
-		
-	private static void handleLineEnd(Item lineEndSurrogate) {
-		Item lineEndClassic = lineEndSurrogate.getClassic();
-		List<Item> lines = new ArrayList<Item>(lineEndClassic.getLines());
-		lines.removeIf(line -> !line.getSurrogates().isEmpty());
-		
-		for(Item line: lines) {
-			Surrogate.forItem((Line) line);
-		}		
-	}
-}
Index: /trunk/src/org/expeditee/gio/gesture/ExpediteeKBMGestureTranslator.java
===================================================================
--- /trunk/src/org/expeditee/gio/gesture/ExpediteeKBMGestureTranslator.java	(revision 1412)
+++ /trunk/src/org/expeditee/gio/gesture/ExpediteeKBMGestureTranslator.java	(revision 1413)
@@ -698,5 +698,10 @@
 				
 				// Return the gesture
-				return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.TOGGLE_XRAY_MODE), null);
+				if (kbmTranslator.isKeyDown(Key.SHIFT)) {
+					UndoGestureData data = new UndoGestureData(kbmTranslator.isKeyDown(Key.CTRL));
+					return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.TOGGLE_SURROGATE_MODE), data);
+				} else {
+					return Gesture.single(StandardGestureActions.getInstance().gestureType(StandardGestureType.TOGGLE_XRAY_MODE), null);
+				}
 			}
 		});
Index: /trunk/src/org/expeditee/gio/gesture/StandardGestureActions.java
===================================================================
--- /trunk/src/org/expeditee/gio/gesture/StandardGestureActions.java	(revision 1412)
+++ /trunk/src/org/expeditee/gio/gesture/StandardGestureActions.java	(revision 1413)
@@ -123,4 +123,5 @@
 		TOGGLE_ITEMS_MARK, // Show/hide the little circle indicating the item has a link and/or action
 		TOGGLE_XRAY_MODE, // F10
+		TOGGLE_SURROGATE_MODE, // Shift + F10
 		UNDO, 
 		ZOOM
@@ -965,4 +966,15 @@
 			}
 		});
+		
+		setGestureAction(gestureType(StandardGestureType.TOGGLE_SURROGATE_MODE), new GestureAction() {
+			@Override
+			public void exec(Gesture gesture) {
+				if (((UndoGestureData) gesture.getData()).getRedo()) {
+					DisplayController.ResetSurrogateMode();
+				} else {
+					DisplayController.ToggleSurrogateMode();
+				}
+			} 
+		});
 
 	}
Index: /trunk/src/org/expeditee/gui/DisplayController.java
===================================================================
--- /trunk/src/org/expeditee/gui/DisplayController.java	(revision 1412)
+++ /trunk/src/org/expeditee/gui/DisplayController.java	(revision 1413)
@@ -42,4 +42,5 @@
 import org.expeditee.core.bounds.AxisAlignedBoxBounds;
 import org.expeditee.core.bounds.Bounds;
+import org.expeditee.encryption.items.surrogates.Label;
 import org.expeditee.gio.EcosystemManager;
 import org.expeditee.gio.GraphicsManager;
@@ -1228,4 +1229,36 @@
 	}
 	
+	public static void ToggleSurrogateMode() {
+		// Turn off x-ray mode if it is on
+		if (_audienceMode) {
+			ToggleAudienceMode();
+		}
+		
+		Label.progressSurrogateMode();
+		
+		getCurrentFrame().parse();
+		getCurrentFrame().refreshSize();
+		updateTitle();
+		StandardGestureActions.refreshHighlights();
+		StandardGestureActions.updateCursor();
+		requestRefresh(false);
+	}
+	
+	public static void ResetSurrogateMode() {
+		// Turn off x-ray mode if it is on
+		if (_audienceMode) {
+			ToggleAudienceMode();
+		}
+		
+		Label.resetSurrogateMode();
+		
+		getCurrentFrame().parse();
+		getCurrentFrame().refreshSize();
+		updateTitle();
+		StandardGestureActions.refreshHighlights();
+		StandardGestureActions.updateCursor();
+		requestRefresh(false);
+	}
+	
 	/** Whether audience mode is currently on. */
 	public static boolean isAudienceMode()
Index: /trunk/src/org/expeditee/gui/Frame.java
===================================================================
--- /trunk/src/org/expeditee/gui/Frame.java	(revision 1412)
+++ /trunk/src/org/expeditee/gui/Frame.java	(revision 1413)
@@ -2554,6 +2554,5 @@
 	 * @return the list of items to be saved to a text file
 	 */
-	public List<Item> getItemsToSave()
-	{
+	public List<Item> getItemsToSave() {
 		if (!_sorted) {
 			Collections.sort(_body);
@@ -2595,4 +2594,10 @@
 
 		return toSave;
+	}
+	
+	public List<Item> getSurrogateItemsToSave() {
+		List<Item> surrogates = new ArrayList<Item>();
+		_body.forEach(item -> surrogates.addAll(item.getSurrogates()));
+		return surrogates;
 	}
 
Index: /trunk/src/org/expeditee/gui/FrameGraphics.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameGraphics.java	(revision 1412)
+++ /trunk/src/org/expeditee/gui/FrameGraphics.java	(revision 1413)
@@ -32,7 +32,4 @@
 import org.expeditee.core.Image;
 import org.expeditee.core.bounds.PolygonBounds;
-import org.expeditee.encryption.items.surrogates.Label.LabelResult;
-import org.expeditee.encryption.items.surrogates.Label;
-import org.expeditee.encryption.items.surrogates.Surrogate;
 import org.expeditee.gio.EcosystemManager;
 import org.expeditee.gio.input.KBMInputEvent.Key;
@@ -457,15 +454,4 @@
 		if (i == null) {
 			return;
-		}
-		
-		String encryptionLabel = i.getEncryptionLabel();
-		if (encryptionLabel != null && encryptionLabel.length() > 0 && !i.isSurrogate()) {
-			LabelResult result = Label.resolveKey(encryptionLabel);
-			if (result != LabelResult.SuccessResolveLabelToKey) {
-				for(Surrogate s: i.getSurrogates()) {
-					PaintItem(s.getSurrogateItem());
-				}
-				return;
-			}
 		}
 
Index: /trunk/src/org/expeditee/io/DefaultFrameReader.java
===================================================================
--- /trunk/src/org/expeditee/io/DefaultFrameReader.java	(revision 1412)
+++ /trunk/src/org/expeditee/io/DefaultFrameReader.java	(revision 1413)
@@ -99,72 +99,72 @@
 
 			// Note: As of 26/11/18 there are no unused letter item tags.  Use other characters.
-			_ItemTags.put('S', Item.class.getMethod("setID", pInt));
-			_ItemTags.put('s', Item.class.getMethod("setDateCreated", pString));
-			_ItemTags.put('d', Item.class.getMethod("setColor", pColor));
-			_ItemTags.put('G', Item.class.getMethod("setBackgroundColor",
+			_ItemTags.put(DefaultFrameWriter.TYPE_AND_ID, Item.class.getMethod("setID", pInt));
+			_ItemTags.put(DefaultFrameWriter.DATE_CREATED, Item.class.getMethod("setDateCreated", pString));
+			_ItemTags.put(DefaultFrameWriter.COLOR, Item.class.getMethod("setColor", pColor));
+			_ItemTags.put(DefaultFrameWriter.BACKGROUND_COLOR, Item.class.getMethod("setBackgroundColor",
 					pColor));
-			_ItemTags.put('K', Item.class.getMethod("setBorderColor",
+			_ItemTags.put(DefaultFrameWriter.BORDER_COLOR, Item.class.getMethod("setBorderColor",
 					pColor));
 
-			_ItemTags.put('R', Item.class.getMethod("setAnchorLeft", pIntO));
-			_ItemTags.put('H', Item.class.getMethod("setAnchorRight", pIntO));
-			_ItemTags.put('N', Item.class.getMethod("setAnchorTop", pIntO));
-			_ItemTags.put('I', Item.class.getMethod("setAnchorBottom", pIntO));
-
-			_ItemTags.put('P', Item.class.getMethod("setPosition", pPoint));
-			_ItemTags.put('F', Item.class.getMethod("setLink", pString));
-			_ItemTags.put('J', Item.class.getMethod("setFormula", pString));
-			
-			_ItemTags.put('X', Item.class.getMethod("setActions", pList));
-			_ItemTags.put('x', Item.class.getMethod("setActionMark", pBool));
-			_ItemTags.put('U', Item.class.getMethod("setActionCursorEnter",
-					pList));
-			_ItemTags.put('V', Item.class.getMethod("setActionCursorLeave",
-					pList));
-			_ItemTags.put('W', Item.class.getMethod("setActionEnterFrame",
-					pList));
-			_ItemTags.put('Y', Item.class.getMethod("setActionLeaveFrame",
-					pList));
-			_ItemTags.put('D', Item.class.getMethod("addToData", pString));
-			_ItemTags.put('u', Item.class.getMethod("setHighlight", pBool));
-			_ItemTags.put('e', Item.class.getMethod("setFillColor", pColor));
-			_ItemTags.put('E', Item.class.getMethod("setGradientColor", pColor));
-			_ItemTags.put('Q', Item.class.getMethod("setGradientAngle", pDouble));
-			
-			_ItemTags.put('i', Item.class.getMethod("setFillPattern", pString));
-			_ItemTags.put('o', Item.class.getMethod("setOwner", pString));
-			_ItemTags.put('n', Item.class.getMethod("setLinkMark", pBool));
+			_ItemTags.put(DefaultFrameWriter.ANCHOR_LEFT, Item.class.getMethod("setAnchorLeft", pIntO));
+			_ItemTags.put(DefaultFrameWriter.ANCHOR_RIGHT, Item.class.getMethod("setAnchorRight", pIntO));
+			_ItemTags.put(DefaultFrameWriter.ANCHOR_TOP, Item.class.getMethod("setAnchorTop", pIntO));
+			_ItemTags.put(DefaultFrameWriter.ANCHOR_BOTTOM, Item.class.getMethod("setAnchorBottom", pIntO));
+
+			_ItemTags.put(DefaultFrameWriter.POSITION, Item.class.getMethod("setPosition", pPoint));
+			_ItemTags.put(DefaultFrameWriter.LINK, Item.class.getMethod("setLink", pString));
+			_ItemTags.put(DefaultFrameWriter.FORMULA, Item.class.getMethod("setFormula", pString));
+			
+			_ItemTags.put(DefaultFrameWriter.ACTION, Item.class.getMethod("setActions", pList));
+			_ItemTags.put(DefaultFrameWriter.ACTION_MARK, Item.class.getMethod("setActionMark", pBool));
+			_ItemTags.put(DefaultFrameWriter.ACTION_CURSOR_ENTER, Item.class.getMethod("setActionCursorEnter",
+					pList));
+			_ItemTags.put(DefaultFrameWriter.ACTION_CURSOR_LEAVE, Item.class.getMethod("setActionCursorLeave",
+					pList));
+			_ItemTags.put(DefaultFrameWriter.ACTION_ENTER_FRAME, Item.class.getMethod("setActionEnterFrame",
+					pList));
+			_ItemTags.put(DefaultFrameWriter.ACTION_LEAVE_FRAME, Item.class.getMethod("setActionLeaveFrame",
+					pList));
+			_ItemTags.put(DefaultFrameWriter.DATA, Item.class.getMethod("addToData", pString));
+			_ItemTags.put(DefaultFrameWriter.HIGHLIGHT, Item.class.getMethod("setHighlight", pBool));
+			_ItemTags.put(DefaultFrameWriter.FILL_COLOR, Item.class.getMethod("setFillColor", pColor));
+			_ItemTags.put(DefaultFrameWriter.GRADIENT_COLOR, Item.class.getMethod("setGradientColor", pColor));
+			_ItemTags.put(DefaultFrameWriter.GRADIENT_ANGLE, Item.class.getMethod("setGradientAngle", pDouble));
+			
+			_ItemTags.put(DefaultFrameWriter.FILL_PATTERN, Item.class.getMethod("setFillPattern", pString));
+			_ItemTags.put(DefaultFrameWriter.OWNER, Item.class.getMethod("setOwner", pString));
+			_ItemTags.put(DefaultFrameWriter.LINK_MARK, Item.class.getMethod("setLinkMark", pBool));
 			_ItemTags
-					.put('q', Item.class.getMethod("setLinkFrameset", pString));
+					.put(DefaultFrameWriter.LINK_FRAMESET, Item.class.getMethod("setLinkFrameset", pString));
 			_ItemTags
-					.put('y', Item.class.getMethod("setLinkTemplate", pString));
-			_ItemTags.put('g', Item.class.getMethod("setLinePattern", pIntArray));
-
-			_ItemTags.put('j', Item.class.getMethod("setArrow", pArrow));
-
-			_ItemTags.put('v', Dot.class.getMethod("setDotType", pDotType));
-			_ItemTags.put('z', Dot.class.getMethod("setFilled", pBool));
-			
-			_ItemTags.put('f', Text.class.getMethod("setFont", pFont));
-			_ItemTags.put('t', Text.class.getMethod("setSpacing", pFloat));
-			_ItemTags.put('T', Text.class.getMethod("appendLine", pString));
-			_ItemTags.put('a', Text.class.getMethod("setWordSpacing", pInt));
-			_ItemTags.put('b', Text.class.getMethod("setLetterSpacing", pFloat));
-			_ItemTags.put('m', Text.class.getMethod("setInitialSpacing", pFloat));
-			_ItemTags.put('w', Text.class.getMethod("setWidth", pIntO));
-			_ItemTags.put('M', Text.class.getMethod("setMinWidth", pIntO));
-			_ItemTags.put('k', Text.class.getMethod("setJustification", pJustification));
-			_ItemTags.put('r', Text.class.getMethod("setAutoWrap", pBool));
-
-			_ItemTags.put('h', Item.class.getMethod("setThickness", pFloat));
-			_ItemTags.put('l', Item.class.getMethod("setLineIDs", pString));
-			_ItemTags.put('c', Item.class.getMethod("setConstraintIDs", pString));
-			
-			_ItemTags.put('A', Item.class.getMethod("setTooltip", pString));
-			_ItemTags.put('B', Item.class.getMethod("setLinkHistory", pBool));
-			
-			_ItemTags.put('p', Item.class.getMethod("setPermission", pPermission));
-			
-			_ItemTags.put('O', Text.class.getMethod("setMask", pIntO));
+					.put(DefaultFrameWriter.LINK_TEMPLATE, Item.class.getMethod("setLinkTemplate", pString));
+			_ItemTags.put(DefaultFrameWriter.LINE_PATTERN, Item.class.getMethod("setLinePattern", pIntArray));
+
+			_ItemTags.put(DefaultFrameWriter.ARROW, Item.class.getMethod("setArrow", pArrow));
+
+			_ItemTags.put(DefaultFrameWriter.DOT_TYPE, Dot.class.getMethod("setDotType", pDotType));
+			_ItemTags.put(DefaultFrameWriter.FILLED, Dot.class.getMethod("setFilled", pBool));
+			
+			_ItemTags.put(DefaultFrameWriter.FONT, Text.class.getMethod("setFont", pFont));
+			_ItemTags.put(DefaultFrameWriter.SPACING, Text.class.getMethod("setSpacing", pFloat));
+			_ItemTags.put(DefaultFrameWriter.TEXT, Text.class.getMethod("appendLine", pString));
+			_ItemTags.put(DefaultFrameWriter.WORD_SPACING, Text.class.getMethod("setWordSpacing", pInt));
+			_ItemTags.put(DefaultFrameWriter.LETTER_SPACING, Text.class.getMethod("setLetterSpacing", pFloat));
+			_ItemTags.put(DefaultFrameWriter.INITIAL_SPACING, Text.class.getMethod("setInitialSpacing", pFloat));
+			_ItemTags.put(DefaultFrameWriter.WIDTH_TO_SAVE, Text.class.getMethod("setWidth", pIntO));
+			_ItemTags.put(DefaultFrameWriter.MIN_WIDTH_TO_SAVE, Text.class.getMethod("setMinWidth", pIntO));
+			_ItemTags.put(DefaultFrameWriter.JUSTIFICATION, Text.class.getMethod("setJustification", pJustification));
+			_ItemTags.put(DefaultFrameWriter.AUTO_WRAP_TO_SAVE, Text.class.getMethod("setAutoWrap", pBool));
+
+			_ItemTags.put(DefaultFrameWriter.THICKNESS, Item.class.getMethod("setThickness", pFloat));
+			_ItemTags.put(DefaultFrameWriter.LINE_IDS, Item.class.getMethod("setLineIDs", pString));
+			_ItemTags.put(DefaultFrameWriter.CONSTRAINT_IDS, Item.class.getMethod("setConstraintIDs", pString));
+			
+			_ItemTags.put(DefaultFrameWriter.TOOLTIP, Item.class.getMethod("setTooltip", pString));
+			_ItemTags.put(DefaultFrameWriter.LINK_HISTORY, Item.class.getMethod("setLinkHistory", pBool));
+			
+			_ItemTags.put(DefaultFrameWriter.PERMISSION, Item.class.getMethod("setPermission", pPermission));
+			
+			_ItemTags.put(DefaultFrameWriter.MASK, Text.class.getMethod("setMask", pIntO));
 			
 			// Lines and constraints are created differently
@@ -172,18 +172,18 @@
 			_ItemTags.put('C', Constraint.class.getMethod("getID", (Class[]) null));
 			
-			_ItemTags.put('[', Item.class.getMethod("setMagnetizedItemLeft", pInt));
+			_ItemTags.put(DefaultFrameWriter.MAGNETIZED_ITEM_LEFT, Item.class.getMethod("setMagnetizedItemLeft", pInt));
 			_DelayedItemTags.add('[');
-			_ItemTags.put(']', Item.class.getMethod("setMagnetizedItemRight", pInt));
+			_ItemTags.put(DefaultFrameWriter.MAGNETIZED_ITEM_RIGHT, Item.class.getMethod("setMagnetizedItemRight", pInt));
 			_DelayedItemTags.add(']');
-			_ItemTags.put('^', Item.class.getMethod("setMagnetizedItemTop", pInt));
+			_ItemTags.put(DefaultFrameWriter.MAGNETIZED_ITEM_TOP, Item.class.getMethod("setMagnetizedItemTop", pInt));
 			_DelayedItemTags.add('^');
-			_ItemTags.put('/', Item.class.getMethod("setMagnetizedItemBottom", pInt));
+			_ItemTags.put(DefaultFrameWriter.MAGNETIZED_ITEM_BOTTOM, Item.class.getMethod("setMagnetizedItemBottom", pInt));
 			_DelayedItemTags.add('/');
 			
-			_ItemTagsExt.put("_el", Item.class.getMethod("setEncryptionLabelOnLoad", pString));
-			
-			_ItemTagsExt.put("_ph", Text.class.getMethod("setPlaceholder", pString));
-			_ItemTagsExt.put("_sl", Text.class.getMethod("setSingleLineOnly", pBool));
-			_ItemTagsExt.put("_ti", Text.class.getMethod("setTabIndex", pInt));
+			_ItemTagsExt.put(DefaultFrameWriter.ENCRYPTION_LABEL_STR, Item.class.getMethod("setEncryptionLabelOnLoad", pString));
+			
+			_ItemTagsExt.put(DefaultFrameWriter.PLACEHOLDER_STR, Text.class.getMethod("setPlaceholder", pString));
+			_ItemTagsExt.put(DefaultFrameWriter.SINGLE_LINE_ONLY_STR, Text.class.getMethod("setSingleLineOnly", pBool));
+			_ItemTagsExt.put(DefaultFrameWriter.TAB_INDEX_STR, Text.class.getMethod("setTabIndex", pInt));
 		} catch (Exception e) {
 			e.printStackTrace();
Index: /trunk/src/org/expeditee/io/DefaultFrameWriter.java
===================================================================
--- /trunk/src/org/expeditee/io/DefaultFrameWriter.java	(revision 1412)
+++ /trunk/src/org/expeditee/io/DefaultFrameWriter.java	(revision 1413)
@@ -41,62 +41,115 @@
 public abstract class DefaultFrameWriter extends ItemWriter implements
 		FrameWriter {
-
-	public static final String TAB_INDEX = "_ti";
-	public static final String SINGLE_LINE_ONLY = "_sl";
-	public static final String PLACEHOLDER = "_ph";
-	public static final String ENCRYPTION_LABEL = "_el";
-	public static final char MAGNETIZED_ITEM_BOTTOM = '/';
-	public static final char MAGNETIZED_ITEM_TOP = '^';
-	public static final char MAGNETIZED_ITEM_RIGHT = ']';
-	public static final char MAGNETIZED_ITEM_LEFT = '[';
-	public static final char PERMISSION = 'p';
-	public static final char LINK_HISTORY = 'B';
-	public static final char TOOLTIP = 'A';
-	public static final char CONSTRAINT_IDS = 'c';
-	public static final char LINE_IDS = 'l';
-	public static final char THICKNESS = 'h';
-	public static final char AUTO_WRAP_TO_SAVE = 'r';
-	public static final char JUSTIFICATION = 'k';
-	public static final char MIN_WIDTH_TO_SAVE = 'M';
-	public static final char WIDTH_TO_SAVE = 'w';
-	public static final char INITIAL_SPACING = 'm';
-	public static final char LETTER_SPACING = 'b';
-	public static final char WORD_SPACING = 'a';
-	public static final char FORMULA = 'J';
-	public static final char MASK = 'O';
-	public static final char SPACING = 't';
-	public static final char FONT = 'f';
-	public static final char FILLED = 'z';
-	public static final char DOT_TYPE = 'v';
-	public static final char ARROW = 'j';
-	public static final char LINE_PATTERN = 'g';
-	public static final char LINK_TEMPLATE = 'y';
-	public static final char LINK_FRAMESET = 'q';
-	public static final char LINK_MARK = 'n';
-	public static final char OWNER = 'o';
-	public static final char FILL_PATTERN = 'i';
-	public static final char ANCHOR_BOTTOM = 'I';
-	public static final char ANCHOR_TOP = 'N';
-	public static final char ANCHOR_RIGHT = 'H';
-	public static final char ANCHOR_LEFT = 'R';
-	public static final char GRADIENT_ANGLE = 'Q';
-	public static final char GRADIENT_COLOR = 'E';
-	public static final char FILL_COLOR = 'e';
-	public static final char HIGHLIGHT = 'u';
-	public static final char DATA = 'D';
-	public static final char ACTION_LEAVE_FRAME = 'Y';
-	public static final char ACTION_ENTER_FRAME = 'W';
-	public static final char ACTION_CURSOR_LEAVE = 'V';
-	public static final char ACTION_CURSOR_ENTER = 'U';
-	public static final char ACTION_MARK = 'x';
-	public static final char ACTION = 'X';
-	public static final char LINK = 'F';
-	public static final char TEXT = 'T';
-	public static final char POSITION = 'P';
-	public static final char BORDER_COLOR = 'K';
-	public static final char BACKGROUND_COLOR = 'G';
-	public static final char COLOR = 'd';
-	public static final char DATE_CREATED = 's';
-	public static final char TYPE_AND_ID = 'S';
+	protected static final char MAGNETIZED_ITEM_BOTTOM = '/';
+	protected static final char MAGNETIZED_ITEM_TOP = '^';
+	protected static final char MAGNETIZED_ITEM_RIGHT = ']';
+	protected static final char MAGNETIZED_ITEM_LEFT = '[';
+	protected static final char PERMISSION = 'p';
+	protected static final char LINK_HISTORY = 'B';
+	protected static final char TOOLTIP = 'A';
+	protected static final char CONSTRAINT_IDS = 'c';
+	protected static final char LINE_IDS = 'l';
+	protected static final char THICKNESS = 'h';
+	protected static final char AUTO_WRAP_TO_SAVE = 'r';
+	protected static final char JUSTIFICATION = 'k';
+	protected static final char MIN_WIDTH_TO_SAVE = 'M';
+	protected static final char WIDTH_TO_SAVE = 'w';
+	protected static final char INITIAL_SPACING = 'm';
+	protected static final char LETTER_SPACING = 'b';
+	protected static final char WORD_SPACING = 'a';
+	protected static final char FORMULA = 'J';
+	protected static final char MASK = 'O';
+	protected static final char SPACING = 't';
+	protected static final char FONT = 'f';
+	protected static final char FILLED = 'z';
+	protected static final char DOT_TYPE = 'v';
+	protected static final char ARROW = 'j';
+	protected static final char LINE_PATTERN = 'g';
+	protected static final char LINK_TEMPLATE = 'y';
+	protected static final char LINK_FRAMESET = 'q';
+	protected static final char LINK_MARK = 'n';
+	protected static final char OWNER = 'o';
+	protected static final char FILL_PATTERN = 'i';
+	protected static final char ANCHOR_BOTTOM = 'I';
+	protected static final char ANCHOR_TOP = 'N';
+	protected static final char ANCHOR_RIGHT = 'H';
+	protected static final char ANCHOR_LEFT = 'R';
+	protected static final char GRADIENT_ANGLE = 'Q';
+	protected static final char GRADIENT_COLOR = 'E';
+	protected static final char FILL_COLOR = 'e';
+	protected static final char HIGHLIGHT = 'u';
+	protected static final char DATA = 'D';
+	protected static final char ACTION_LEAVE_FRAME = 'Y';
+	protected static final char ACTION_ENTER_FRAME = 'W';
+	protected static final char ACTION_CURSOR_LEAVE = 'V';
+	protected static final char ACTION_CURSOR_ENTER = 'U';
+	protected static final char ACTION_MARK = 'x';
+	protected static final char ACTION = 'X';
+	protected static final char LINK = 'F';
+	protected static final char TEXT = 'T';
+	protected static final char POSITION = 'P';
+	protected static final char BORDER_COLOR = 'K';
+	protected static final char BACKGROUND_COLOR = 'G';
+	protected static final char COLOR = 'd';
+	protected static final char DATE_CREATED = 's';
+	protected static final char TYPE_AND_ID = 'S';
+	
+	public static final String TAB_INDEX_STR = "_ti";
+	public static final String SINGLE_LINE_ONLY_STR = "_sl";
+	public static final String PLACEHOLDER_STR = "_ph";
+	public static final String ENCRYPTION_LABEL_STR = "_el";
+	public static final String MAGNETIZED_ITEM_BOTTOM_STR = MAGNETIZED_ITEM_BOTTOM + "";
+	public static final String MAGNETIZED_ITEM_TOP_STR = MAGNETIZED_ITEM_TOP + "";
+	public static final String MAGNETIZED_ITEM_RIGHT_STR = MAGNETIZED_ITEM_RIGHT + "";
+	public static final String MAGNETIZED_ITEM_LEFT_STR = MAGNETIZED_ITEM_LEFT + "";
+	public static final String PERMISSION_STR = PERMISSION + "";
+	public static final String LINK_HISTORY_STR = LINK_HISTORY + "";
+	public static final String TOOLTIP_STR = TOOLTIP + "";
+	public static final String CONSTRAINT_IDS_STR = CONSTRAINT_IDS + "";
+	public static final String LINE_IDS_STR = LINE_IDS + "";
+	public static final String THICKNESS_STR = THICKNESS + "";
+	public static final String AUTO_WRAP_TO_SAVE_STR = AUTO_WRAP_TO_SAVE + "";
+	public static final String JUSTIFICATION_STR = JUSTIFICATION + "";
+	public static final String MIN_WIDTH_TO_SAVE_STR = MIN_WIDTH_TO_SAVE + "";
+	public static final String WIDTH_TO_SAVE_STR = WIDTH_TO_SAVE + "";
+	public static final String INITIAL_SPACING_STR = INITIAL_SPACING + "";
+	public static final String LETTER_SPACING_STR = LETTER_SPACING + "";
+	public static final String WORD_SPACING_STR = WORD_SPACING + "";
+	public static final String FORMULA_STR = FORMULA + "";
+	public static final String MASK_STR = MASK + "";
+	public static final String SPACING_STR = SPACING + "";
+	public static final String FONT_STR = FONT + "";
+	public static final String FILLED_STR = FILLED + "";
+	public static final String DOT_TYPE_STR = DOT_TYPE + "";
+	public static final String ARROW_STR = ARROW + "";
+	public static final String LINE_PATTERN_STR = LINE_PATTERN + "";
+	public static final String LINK_TEMPLATE_STR = LINK_TEMPLATE + "";
+	public static final String LINK_FRAMESET_STR = LINK_FRAMESET + "";
+	public static final String LINK_MARK_STR = LINK_MARK + "";
+	public static final String OWNER_STR = OWNER + "";
+	public static final String FILL_PATTERN_STR = FILL_PATTERN + "";
+	public static final String ANCHOR_BOTTOM_STR = ANCHOR_BOTTOM + "";
+	public static final String ANCHOR_TOP_STR = ANCHOR_TOP + "";
+	public static final String ANCHOR_RIGHT_STR = ANCHOR_RIGHT + "";
+	public static final String ANCHOR_LEFT_STR = ANCHOR_LEFT + "";
+	public static final String GRADIENT_ANGLE_STR = GRADIENT_ANGLE + "";
+	public static final String GRADIENT_COLOR_STR = GRADIENT_COLOR + "";
+	public static final String FILL_COLOR_STR = FILL_COLOR + "";
+	public static final String HIGHLIGHT_STR = HIGHLIGHT + "";
+	public static final String DATA_STR = DATA + "";
+	public static final String ACTION_LEAVE_FRAME_STR = ACTION_LEAVE_FRAME + "";
+	public static final String ACTION_ENTER_FRAME_STR = ACTION_ENTER_FRAME + "";
+	public static final String ACTION_CURSOR_LEAVE_STR = ACTION_CURSOR_LEAVE + "";
+	public static final String ACTION_CURSOR_ENTER_STR = ACTION_CURSOR_ENTER + "";
+	public static final String ACTION_MARK_STR = ACTION_MARK + "";
+	public static final String ACTION_STR = ACTION + "";
+	public static final String LINK_STR = LINK + "";
+	public static final String TEXT_STR = TEXT + "";
+	public static final String POSITION_STR = POSITION + "";
+	public static final String BORDER_COLOR_STR = BORDER_COLOR + "";
+	public static final String BACKGROUND_COLOR_STR = BACKGROUND_COLOR + "";
+	public static final String COLOR_STR = COLOR + "";
+	public static final String DATE_CREATED_STR = DATE_CREATED + "";
+	public static final String TYPE_AND_ID_STR = TYPE_AND_ID + "";
 
 	protected String _filename = null;
@@ -113,19 +166,11 @@
 
 	// keep track of methods that are put on the same line
-	private static LinkedHashMap<Character, Method> _ItemTags = null;
+	private static LinkedHashMap<Character, Method> _ItemTags = new LinkedHashMap<Character, Method>();
 	// IMPORTANT: keys in _ItemTagsExt must start with underscore as their first character 
-	private static LinkedHashMap<String, Method> _ItemTagsExt = null;
-
-	protected static LinkedHashMap<Character, Method> _FrameTags = null;
-
-	public DefaultFrameWriter() {
-		
-		if (_ItemTags != null && _FrameTags != null)
-			return;
-
-		_ItemTags = new LinkedHashMap<Character, Method>();
-		_ItemTagsExt = new LinkedHashMap<String, Method>();
-		_FrameTags = new LinkedHashMap<Character, Method>();
-
+	private static LinkedHashMap<String, Method> _ItemTagsExt = new LinkedHashMap<String, Method>();
+
+	protected static LinkedHashMap<Character, Method> _FrameTags = new LinkedHashMap<Character, Method>();
+	
+	{
 		try {
 			_FrameTags.put('V', Frame.class.getMethod("getVersion"));
@@ -213,12 +258,17 @@
 			_ItemTags.put(DefaultFrameWriter.MAGNETIZED_ITEM_BOTTOM, Item.class.getMethod("getMagnetizedItemBottom"));
 			
-			_ItemTagsExt.put(DefaultFrameWriter.ENCRYPTION_LABEL, Item.class.getMethod("getEncryptionLabel"));
-			
-			_ItemTagsExt.put(DefaultFrameWriter.PLACEHOLDER, Text.class.getMethod("getPlaceholder"));
-			_ItemTagsExt.put(DefaultFrameWriter.SINGLE_LINE_ONLY, Text.class.getMethod("isSingleLineOnly"));
-			_ItemTagsExt.put(DefaultFrameWriter.TAB_INDEX, Text.class.getMethod("getTabIndex"));
+			_ItemTagsExt.put(DefaultFrameWriter.ENCRYPTION_LABEL_STR, Item.class.getMethod("getEncryptionLabel"));
+			
+			_ItemTagsExt.put(DefaultFrameWriter.PLACEHOLDER_STR, Text.class.getMethod("getPlaceholder"));
+			_ItemTagsExt.put(DefaultFrameWriter.SINGLE_LINE_ONLY_STR, Text.class.getMethod("isSingleLineOnly"));
+			_ItemTagsExt.put(DefaultFrameWriter.TAB_INDEX_STR, Text.class.getMethod("getTabIndex"));
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
+	}
+
+	public DefaultFrameWriter() {
+		
+
 	}
 
Index: /trunk/src/org/expeditee/items/Item.java
===================================================================
--- /trunk/src/org/expeditee/items/Item.java	(revision 1412)
+++ /trunk/src/org/expeditee/items/Item.java	(revision 1413)
@@ -48,5 +48,5 @@
 import org.expeditee.core.bounds.PolygonBounds;
 import org.expeditee.encryption.items.surrogates.EncryptionDetail;
-import org.expeditee.encryption.items.surrogates.Surrogate;
+//import org.expeditee.encryption.items.surrogates.Surrogate;
 import org.expeditee.gio.EcosystemManager;
 import org.expeditee.gio.GraphicsManager;
@@ -319,6 +319,25 @@
 
 	private Item surrogateFor = null;
-	private Set<Surrogate> surrogateItems = new HashSet<Surrogate>();
-	private Map<String, EncryptionDetail> propertyEncryption = new HashMap<String, EncryptionDetail>();
+	private Set<Item> surrogateItems = new HashSet<Item>();
+	private static Map<String, EncryptionDetail> classicPropertyEncryptionDefault = new HashMap<String, EncryptionDetail>();
+	private static Map<String, Boolean> surrogatePropertyInheritanceDefault = new HashMap<String, Boolean>();
+	protected Map<String, EncryptionDetail> classicPropertyEncryption = new HashMap<String, EncryptionDetail>(classicPropertyEncryptionDefault);
+	protected Map<String, Boolean> surrogatePropertyInheritance = new HashMap<String, Boolean>(surrogatePropertyInheritanceDefault);
+	
+	{
+		for(Character tag: DefaultFrameWriter.getItemTags().keySet()) {
+			if (tag == 'T' || tag == 'S') {
+				surrogatePropertyInheritanceDefault.put(tag + "", false);
+			} else {
+				surrogatePropertyInheritanceDefault.put(tag + "", true);
+			}
+			classicPropertyEncryptionDefault.put(tag + "", EncryptionDetail.UnencryptedOnSave);
+		}
+		
+		for(String tag: DefaultFrameWriter.getItemTagsExt().keySet()) {
+			surrogatePropertyInheritanceDefault.put(tag, true);
+			classicPropertyEncryptionDefault.put(tag, EncryptionDetail.UnencryptedOnSave);
+		}
+	}
 	
 	/** Just calls source.duplicateOnto(dest). */
@@ -415,10 +434,15 @@
 		_type = type;
 		invalidateAll();
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.DOT_TYPE_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.DOT_TYPE_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.DOT_TYPE_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
 	public DotType getDotType() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.DOT_TYPE + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.DOT_TYPE_STR)) {
 			return this.getClassic().getDotType();
 		} else {
@@ -428,15 +452,20 @@
 
 	
-	public void setFilled(boolean filled)
-	{
+	public void setFilled(boolean filled) {
 		invalidateAll();
 		_filled = filled;
 		invalidateAll();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.FILLED_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.DOT_TYPE_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.FILLED_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
 	public boolean getFilled() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.FILLED + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.FILLED_STR)) {
 			return this.getClassic().getFilled();
 		} else {
@@ -450,6 +479,5 @@
 	 * @param gradientAngle The new angle of colour change.
 	 */
-	public void setGradientAngle(double gradientAngle)
-	{
+	public void setGradientAngle(double gradientAngle) {
 		_gradientAngle = gradientAngle;
 
@@ -461,4 +489,12 @@
 		invalidateCommonTrait(ItemAppearence.GradientColor);
 		invalidateFill();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.GRADIENT_ANGLE_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.DOT_TYPE_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.GRADIENT_ANGLE_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -469,7 +505,5 @@
 	 */
 	public double getGradientAngle() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.GRADIENT_ANGLE + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.GRADIENT_ANGLE_STR)) {
 			return this.getClassic().getGradientAngle();
 		} else {
@@ -528,10 +562,16 @@
 			this.getParent().moveItemToBodyHiddenDueToPermission(this);
 		}
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.PERMISSION_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.DOT_TYPE_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.PERMISSION_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 	
 	public PermissionTriple getPermission() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.PERMISSION + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.PERMISSION_STR)) {
 			return this.getClassic().getPermission();
 		} else {
@@ -683,7 +723,5 @@
 	 */
 	public List<String> getAction()	{
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.ACTION + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.ACTION_STR)) {
 			return this.getClassic().getAction();
 		} else {
@@ -693,60 +731,48 @@
 
 	public List<String> getData() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.DATA + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.DATA_STR)) {
 			return this.getClassic().getData();
 		} else {
-			return _data.getData();
+			return  _data.getData();
 		}
 	}
 
 	public List<String> getActionCursorEnter() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.ACTION_CURSOR_ENTER + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.ACTION_CURSOR_ENTER_STR)) {
 			return this.getClassic().getActionCursorEnter();
 		} else {
-			return _actionCursorEnter;
+			return  _actionCursorEnter;
 		}
 	}
 
 	public List<String> getActionCursorLeave() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.ACTION_CURSOR_LEAVE + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.ACTION_CURSOR_LEAVE_STR)) {
 			return this.getClassic().getActionCursorLeave();
 		} else {
-			return _actionCursorLeave;
+			return  _actionCursorLeave;
 		}
 	}
 
 	public List<String> getActionEnterFrame() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.ACTION_ENTER_FRAME + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.ACTION_ENTER_FRAME_STR)) {
 			return this.getClassic().getActionEnterFrame();
 		} else {
-			return _actionEnterFrame;
+			return  _actionEnterFrame;
 		}
 	}
 
 	public List<String> getActionLeaveFrame() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.ACTION_LEAVE_FRAME + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.ACTION_LEAVE_FRAME_STR)) {
 			return this.getClassic().getActionLeaveFrame();
 		} else {
-			return _actionLeaveFrame;
+			return  _actionLeaveFrame;
 		}
 	}
 
 	public boolean getActionMark() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.ACTION_MARK + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.ACTION_MARK_STR)) {
 			return this.getClassic().getActionMark();
 		} else {
-			return _actionMark;
+			return  _actionMark;
 		}
 	}
@@ -770,7 +796,5 @@
 
 	public String getArrow() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.ARROW + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.ARROW_STR)) {
 			return this.getClassic().getArrow();
 		} else {
@@ -807,20 +831,16 @@
 	
 	public Colour getBackgroundColor() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.BACKGROUND_COLOR + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.BACKGROUND_COLOR_STR)) {
 			return this.getClassic().getBackgroundColor();
 		} else {
-			return _backgroundColour;
+			return  _backgroundColour;
 		}
 	}
 
 	public Colour getBorderColor() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.TYPE_AND_ID + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.BORDER_COLOR_STR)) {
 			return this.getClassic().getBorderColor();
 		} else {
-			return _colorBorder;
+			return  _colorBorder;
 		}
 	}
@@ -896,10 +916,8 @@
 
 	public Colour getColor() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.COLOR + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.COLOR_STR)) {
 			return this.getClassic().getColor();
 		} else {
-			return _foregroundColour;
+			return  _foregroundColour;
 		}
 	}
@@ -915,7 +933,5 @@
 
 	public String getConstraintIDs() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.CONSTRAINT_IDS + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.CONSTRAINT_IDS_STR)) {
 			return this.getClassic().getConstraintIDs();
 		} else {
@@ -954,30 +970,24 @@
 
 	public String getDateCreated() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.DATE_CREATED + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.DATE_CREATED_STR)) {
 			return this.getClassic().getDateCreated();
 		} else {
-			return _creationDate;
+			return  _creationDate;
 		}
 	}
 
 	public Colour getFillColor() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.FILL_COLOR + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.FILL_COLOR_STR)) {
 			return this.getClassic().getFillColor();
 		} else {
-			return _fillColour;
+			return  _fillColour;
 		}
 	}
 
 	public String getFillPattern() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.FILL_PATTERN + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.FILL_PATTERN_STR)) {
 			return this.getClassic().getFillPattern();
 		} else {
-			return _fillPattern;
+			return  _fillPattern;
 		}
 	}
@@ -997,10 +1007,8 @@
 	 */
 	public boolean getHighlight() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.HIGHLIGHT + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.HIGHLIGHT_STR)) {
 			return this.getClassic().getHighlight();
 		} else {
-			return _highlight;
+			return  _highlight;
 		}
 	}
@@ -1031,7 +1039,5 @@
 	 */
 	public String getLineIDs() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.LINE_IDS + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.LINE_IDS_STR)) {
 			return this.getClassic().getLineIDs();
 		} else {
@@ -1050,10 +1056,8 @@
 
 	public int[] getLinePattern() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.LINE_PATTERN + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.LINE_PATTERN_STR)) {
 			return this.getClassic().getLinePattern();
 		} else {
-			return _linePattern;
+			return  _linePattern;
 		}
 	}
@@ -1078,20 +1082,16 @@
 	 */
 	public String getLink()	{
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.LINK + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.LINK_STR)) {
 			return this.getClassic().getLink();
 		} else {
-			return _link;
+			return  _link;
 		}
 	}
 
 	public String getFormula() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.FORMULA + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.FORMULA_STR)) {
 			return this.getClassic().getFormula();
 		} else {
-			return _formula;
+			return  _formula;
 		}
 	}
@@ -1107,7 +1107,14 @@
 	}
 
-	public void setFormula(String formula)
-	{
+	public void setFormula(String formula) {
 		_formula = formula;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.FORMULA_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.FORMULA_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.FORMULA_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -1119,37 +1126,26 @@
 
 	public String getLinkFrameset()	{
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.LINK_FRAMESET + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.LINK_FRAMESET_STR)) {
 			return this.getClassic().getLinkFrameset();
 		} else {
-			return _link_frameset;
+			return  _link_frameset;
 		}
 	}
 
 	public boolean getLinkMark() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.LINK_MARK + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.LINK_MARK_STR)) {
 			return this.getClassic().getLinkMark();
 		} else {
-			return _linkMark;
+			return  _linkMark;
 		}
 	}
 
 	public String getLinkTemplate()	{
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.LINK_TEMPLATE + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.LINK_TEMPLATE_STR)) {
 			return this.getClassic().getLinkTemplate();
 		} else {
-			return _link_template;
-		}
-	}
-
-	// public int getMaxWidth()
-	// {
-	// return _maxWidth;
-	// }
+			return  _link_template;
+		}
+	}
 
 	public Point getOffset()
@@ -1159,10 +1155,8 @@
 
 	public String getOwner() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.OWNER + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.OWNER_STR)) {
 			return this.getClassic().getOwner();
 		} else {
-			return _owner;
+			return  _owner;
 		}
 	}
@@ -1281,7 +1275,5 @@
 	/** Gets the position of this item. */
 	public final Point getPosition() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.POSITION + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.POSITION_STR)) {
 			return this.getClassic().getPosition();
 		} else {
@@ -1313,7 +1305,5 @@
 
 	public String getTypeAndID() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.TYPE_AND_ID + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.TYPE_AND_ID_STR)) {
 			return this.getClassic().getTypeAndID();
 		} else {
@@ -1323,7 +1313,5 @@
 
 	public Integer getWidthToSave()	{
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.WIDTH_TO_SAVE + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.WIDTH_TO_SAVE_STR)) {
 			return this.getClassic().getWidthToSave();
 		} else {
@@ -1333,7 +1321,5 @@
 	
 	public Integer getMinWidthToSave() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.MIN_WIDTH_TO_SAVE + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.MIN_WIDTH_TO_SAVE_STR)) {
 			return this.getClassic().getMinWidthToSave();
 		} else {
@@ -1362,7 +1348,5 @@
 	 */
 	public int getX() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.POSITION + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.POSITION_STR)) {
 			return this.getClassic().getX();
 		} else {
@@ -1377,7 +1361,5 @@
 	 */
 	public int getY() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.POSITION + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.POSITION_STR)) {
 			return this.getClassic().getY();
 		} else {
@@ -1532,15 +1514,20 @@
 	}
 	
-	public void setTooltip(final String tooltip)
-	{
+	public void setTooltip(final String tooltip) {
 		if(tooltip != null && tooltip.trim().length() > 0) {
 			_tooltip.addTooltip(tooltip, this);
 		}
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.TOOLTIP_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.TOOLTIP_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.TOOLTIP_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 	
 	public List<String> getTooltip() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.TOOLTIP + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.TOOLTIP_STR)) {
 			return this.getClassic().getTooltip();
 		} else {
@@ -1824,6 +1811,5 @@
 	 *            The lines of code to associate with this Item
 	 */
-	public void setActions(List<String> actions)
-	{
+	public void setActions(List<String> actions) {
 		if (actions == null || actions.size() == 0) {
 			invalidateCommonTrait(ItemAppearence.LinkChanged);
@@ -1836,4 +1822,12 @@
 		invalidateBounds();
 		invalidateCommonTrait(ItemAppearence.LinkChanged);
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ACTION_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ACTION_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ACTION_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -1848,4 +1842,12 @@
 	public void addToData(String dataItem) {
 		_data.addToData(dataItem);
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.DATA_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.DATA_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.DATA_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 	
@@ -1856,24 +1858,63 @@
 	public void setActionCursorEnter(List<String> enter) {
 		_actionCursorEnter = enter;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ACTION_CURSOR_ENTER_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ACTION_CURSOR_ENTER_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ACTION_CURSOR_ENTER_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
 	public void setActionCursorLeave(List<String> leave) {
 		_actionCursorLeave = leave;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ACTION_CURSOR_LEAVE_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ACTION_CURSOR_LEAVE_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ACTION_CURSOR_LEAVE_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
 	public void setActionEnterFrame(List<String> enter) {
 		_actionEnterFrame = enter;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ACTION_ENTER_FRAME_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ACTION_ENTER_FRAME_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ACTION_ENTER_FRAME_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
 	public void setActionLeaveFrame(List<String> leave) {
 		_actionLeaveFrame = leave;
-	}
-
-	public void setActionMark(boolean val)
-	{
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ACTION_LEAVE_FRAME_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ACTION_LEAVE_FRAME_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ACTION_LEAVE_FRAME_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
+	}
+
+	public void setActionMark(boolean val) {
 		if (!val) invalidateCommonTrait(ItemAppearence.LinkChanged);
 		invalidateBounds();
 		_actionMark = val;
 		if (val) invalidateCommonTrait(ItemAppearence.LinkChanged);
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ACTION_MARK_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ACTION_MARK_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ACTION_MARK_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -1901,4 +1942,12 @@
 		_arrowheadNibPerc = nib_perc;
 		updateArrowPolygon();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ARROW_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ARROW_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ARROW_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -1931,4 +1980,12 @@
 			invalidateCommonTrait(ItemAppearence.BackgroundColorChanged);
 		}
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.BACKGROUND_COLOR_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.BACKGROUND_COLOR_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.BACKGROUND_COLOR_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -1937,4 +1994,12 @@
 			_colorBorder = c;
 			invalidateCommonTrait(ItemAppearence.BorderColorChanged);
+		}
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.BORDER_COLOR_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.BORDER_COLOR_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.BORDER_COLOR_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
 		}
 	}
@@ -1970,4 +2035,11 @@
 
 	public void setConstraintIDs(String IDs) {
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.CONSTRAINT_IDS_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.CONSTRAINT_IDS_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.CONSTRAINT_IDS_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -1991,4 +2063,12 @@
 	public void setDateCreated(String date) {
 		_creationDate = date;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.DATE_CREATED_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.DATE_CREATED_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.DATE_CREATED_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -2006,8 +2086,15 @@
 		invalidateCommonTrait(ItemAppearence.FillColor);
 		invalidateFill();
-	}
-
-	public void setGradientColor(Colour c)
-	{
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.FILL_COLOR_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.FILL_COLOR_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.FILL_COLOR_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
+	}
+
+	public void setGradientColor(Colour c) {
 		_gradientColour = c;
 
@@ -2020,10 +2107,16 @@
 		invalidateCommonTrait(ItemAppearence.GradientColor);
 		invalidateFill();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.GRADIENT_COLOR_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.GRADIENT_COLOR_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.GRADIENT_COLOR_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
 	public Colour getGradientColor() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.GRADIENT_COLOR + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.GRADIENT_COLOR_STR)) {
 			return this.getClassic().getGradientColor();
 		} else {
@@ -2036,4 +2129,12 @@
 		invalidateCommonTrait(ItemAppearence.FillPattern);
 		invalidateFill();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.FILL_PATTERN_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.FILL_PATTERN_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.FILL_PATTERN_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -2050,4 +2151,12 @@
 	public void setHighlight(boolean val) {
 		_highlight = val;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.HIGHLIGHT_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.HIGHLIGHT_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.HIGHLIGHT_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -2061,4 +2170,12 @@
 	public void setID(int newID) {
 		_id = newID;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.TYPE_AND_ID_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.TYPE_AND_ID_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.TYPE_AND_ID_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -2070,4 +2187,11 @@
 	 */
 	public void setLineIDs(String lineID) {
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.LINE_IDS_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.LINE_IDS_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.LINE_IDS_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -2077,4 +2201,12 @@
 		for (Line line : getLines())
 			line.setLinePattern(pattern);
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.LINE_PATTERN_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.LINE_PATTERN_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.LINE_PATTERN_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -2094,6 +2226,5 @@
 	 *            The name of the Frame to link this item to.
 	 */
-	public void setLink(String frameName)
-	{
+	public void setLink(String frameName) {
 		if (frameName == null) invalidateCommonTrait(ItemAppearence.LinkChanged);
 
@@ -2110,14 +2241,28 @@
 
 		invalidateCommonTrait(ItemAppearence.LinkChanged);
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.LINK_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.LINK_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.LINK_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 	
 	public void setLinkHistory(boolean value) {
 		_linkHistory = value;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.LINK_HISTORY_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.LINK_HISTORY_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.LINK_HISTORY_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 	
 	public boolean getLinkHistory() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.LINK_HISTORY + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.LINK_HISTORY_STR)) {
 			return this.getClassic().getLinkHistory();
 		} else {
@@ -2134,16 +2279,30 @@
 		}
 		// TODO make this throw exceptions etc...
-	}
-
-	public void setLinkMark(boolean val)
-	{
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.LINK_FRAMESET_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.LINK_FRAMESET_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.LINK_FRAMESET_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
+	}
+
+	public void setLinkMark(boolean val) {
 		if (!val) invalidateCommonTrait(ItemAppearence.LinkChanged);
 		invalidateBounds();
 		_linkMark = val;
 		if (val) invalidateCommonTrait(ItemAppearence.LinkChanged);
-	}
-
-	public void setLinkTemplate(String template)
-	{
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.LINK_MARK_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.LINK_MARK_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.LINK_MARK_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
+	}
+
+	public void setLinkTemplate(String template) {
 		if (FrameIO.isValidLink(template)) {
 			_link_template = template;
@@ -2152,4 +2311,12 @@
 		}
 		// TODO make this throw exceptions etc...
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.LINK_TEMPLATE_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.LINK_TEMPLATE_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.LINK_TEMPLATE_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -2178,4 +2345,12 @@
 	public void setOwner(String own) {
 		_owner = own;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.OWNER_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.OWNER_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.OWNER_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -2258,6 +2433,5 @@
 	 *            The new Y coordinate
 	 */
-	public void setPosition(float x, float y)
-	{
+	public void setPosition(float x, float y) {
 		float deltaX = x - _x;
 		float deltaY = y - _y;
@@ -2363,4 +2537,11 @@
 		invalidateCommonTraitForAll(ItemAppearence.PostMoved);
 
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.POSITION_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.POSITION_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.POSITION_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -2399,4 +2580,12 @@
 	public final void setThickness(float thick) {
 		setThickness(thick, true);
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.THICKNESS_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.THICKNESS_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.THICKNESS_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -2451,7 +2640,5 @@
 	 */
 	public float getThickness()	{
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.THICKNESS + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.THICKNESS_STR)) {
 			return this.getClassic().getThickness();
 		} else {
@@ -2505,4 +2692,12 @@
 	public void setX(float newX) {
 		setPosition(newX, getY());
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.POSITION_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.POSITION_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.POSITION_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -2515,4 +2710,12 @@
 	public void setY(float newY) {
 		setPosition(getX(), newY);
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.POSITION_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.POSITION_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.POSITION_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -3313,6 +3516,5 @@
 	}
 
-	public void setAnchorLeft(Integer anchor)
-	{
+	public void setAnchorLeft(Integer anchor) {
 		this._anchoring.setLeftAnchor(anchor);
 		if (anchor != null) {
@@ -3320,8 +3522,15 @@
 		    setX(anchor);
 		}
-	}
-
-	public void setAnchorRight(Integer anchor)
-	{
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ANCHOR_LEFT_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ANCHOR_LEFT_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ANCHOR_LEFT_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
+	}
+
+	public void setAnchorRight(Integer anchor) {
 		this._anchoring.setRightAnchor(anchor);
 		if (anchor != null) {
@@ -3329,8 +3538,15 @@
 			setX(DisplayController.getFramePaintArea().getMaxX() - anchor - getBoundsWidth());
 		}
-	}
-
-	public void setAnchorTop(Integer anchor)
-	{
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ANCHOR_RIGHT_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ANCHOR_RIGHT_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ANCHOR_RIGHT_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
+	}
+
+	public void setAnchorTop(Integer anchor) {
 		this._anchoring.setTopAnchor(anchor);
 		if (anchor != null) {
@@ -3338,9 +3554,16 @@
 			setY(anchor);
 		}
-	}
-
-
-	public void setAnchorBottom(Integer anchor)
-	{
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ANCHOR_TOP_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ANCHOR_TOP_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ANCHOR_TOP_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
+	}
+
+
+	public void setAnchorBottom(Integer anchor) {
 		this._anchoring.setBottomAnchor(anchor);
 		if (anchor != null) {
@@ -3348,4 +3571,12 @@
 			setY(DisplayController.getFramePaintArea().getMaxY() - anchor);
 		}
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ANCHOR_BOTTOM_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ANCHOR_BOTTOM_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ANCHOR_BOTTOM_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -3364,7 +3595,5 @@
 
 	public Integer getAnchorLeft() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.ANCHOR_LEFT + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.ANCHOR_LEFT_STR)) {
 			return this.getClassic().getAnchorLeft();
 		} else {
@@ -3374,7 +3603,5 @@
 
 	public Integer getAnchorRight() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.ANCHOR_RIGHT + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.ANCHOR_RIGHT_STR)) {
 			return this.getClassic().getAnchorRight();
 		} else {
@@ -3384,7 +3611,5 @@
 
 	public Integer getAnchorTop() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.ANCHOR_TOP + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.ANCHOR_TOP_STR)) {
 			return this.getClassic().getAnchorTop();
 		} else {
@@ -3394,7 +3619,5 @@
 
 	public Integer getAnchorBottom() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.ANCHOR_BOTTOM + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.ANCHOR_BOTTOM_STR)) {
 			return this.getClassic().getAnchorBottom();
 		} else {
@@ -3404,7 +3627,5 @@
 
 	public String getText() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.TEXT + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.TEXT_STR)) {
 			return this.getClassic().getText();
 		} else {
@@ -3646,7 +3867,5 @@
 	
 	public int getMagnetizedItemLeft() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.MAGNETIZED_ITEM_LEFT + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.MAGNETIZED_ITEM_LEFT_STR)) {
 			return this.getClassic().getMagnetizedItemLeft();
 		} else {
@@ -3662,10 +3881,16 @@
 	public void setMagnetizedItemLeft(final int id) {
 		setMagnetizedItemLeft(this.getParent().getItemWithID(id));
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.MAGNETIZED_ITEM_LEFT_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.MAGNETIZED_ITEM_LEFT_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.MAGNETIZED_ITEM_LEFT_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 	
 	public int getMagnetizedItemRight() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.MAGNETIZED_ITEM_RIGHT + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.MAGNETIZED_ITEM_RIGHT_STR)) {
 			return this.getClassic().getMagnetizedItemRight();
 		} else {
@@ -3681,10 +3906,16 @@
 	public void setMagnetizedItemRight(final int id) {
 		setMagnetizedItemRight(this.getParent().getItemWithID(id));
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.MAGNETIZED_ITEM_RIGHT_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.MAGNETIZED_ITEM_RIGHT_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.MAGNETIZED_ITEM_RIGHT_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 	
 	public int getMagnetizedItemTop() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.MAGNETIZED_ITEM_TOP + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.MAGNETIZED_ITEM_TOP_STR)) {
 			return this.getClassic().getMagnetizedItemTop();
 		} else {
@@ -3700,10 +3931,16 @@
 	public void setMagnetizedItemTop(final int id) {
 		setMagnetizedItemTop(this.getParent().getItemWithID(id));
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.MAGNETIZED_ITEM_TOP_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.MAGNETIZED_ITEM_TOP_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.MAGNETIZED_ITEM_TOP_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 	
 	public int getMagnetizedItemBottom() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.MAGNETIZED_ITEM_BOTTOM + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.MAGNETIZED_ITEM_BOTTOM_STR)) {
 			return this.getClassic().getMagnetizedItemBottom();
 		} else {
@@ -3719,10 +3956,16 @@
 	public void setMagnetizedItemBottom(final int id) {
 		setMagnetizedItemBottom(this.getParent().getItemWithID(id));
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.MAGNETIZED_ITEM_BOTTOM_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.MAGNETIZED_ITEM_BOTTOM_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.MAGNETIZED_ITEM_BOTTOM_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 	
 	public String getEncryptionLabel() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.ENCRYPTION_LABEL + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.ENCRYPTION_LABEL_STR)) {
 			return this.getClassic().getEncryptionLabel();
 		} else {
@@ -3734,13 +3977,24 @@
 		this._encryptionLabel = label;
 		if (this.getSurrogates().isEmpty()) {
-			Surrogate surrogate = Surrogate.forItem(this);
-			this.addToSurrogates(surrogate);
-		}
+			Item copy = this.copy();
+			if (copy instanceof Text) {	copy.setText("Encrypted"); }
+			this.addToSurrogates(copy);
+		}
+		
+		
 		
 		for (Character tag: DefaultFrameWriter.getItemTags().keySet()) {
 			if (tag == 'S') {
-				propertyEncryption.put(tag + "", EncryptionDetail.UnencryptedOnSave);
+				classicPropertyEncryption.put(tag + "", EncryptionDetail.UnencryptedOnSave);
 			} else {
-				propertyEncryption.put(tag + "", EncryptionDetail.ReencryptOnSave);
+				classicPropertyEncryption.put(tag + "", EncryptionDetail.ReencryptOnSave);
+			}
+			
+			for (Item surrogate: this.getSurrogates()) {
+				if (tag == 'T') {
+					surrogate.surrogatePropertyInheritance.put(tag + "", false);
+				} else {
+					surrogate.surrogatePropertyInheritance.put(tag + "", true);
+				}
 			}
 		}
@@ -3748,9 +4002,21 @@
 		for (String tag: DefaultFrameWriter.getItemTagsExt().keySet()) {
 			if (tag == "_el") {
-				propertyEncryption.put(tag, EncryptionDetail.UnencryptedOnSave);
+				classicPropertyEncryption.put(tag, EncryptionDetail.UnencryptedOnSave);
 			} else {
-				propertyEncryption.put(tag, EncryptionDetail.ReencryptOnSave);
-			}
-		}
+				classicPropertyEncryption.put(tag, EncryptionDetail.ReencryptOnSave);
+			}
+			
+			for (Item surrogate: this.getSurrogates()) {
+				surrogate.surrogatePropertyInheritance.put(tag + "", true);
+			}
+		}
+		
+/*		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ENCRYPTION_LABEL_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ENCRYPTION_LABEL_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ENCRYPTION_LABEL_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}*/
 	}
 	
@@ -3760,7 +4026,7 @@
 		for (Character tag: DefaultFrameWriter.getItemTags().keySet()) {
 			if (tag == 'S') {
-				propertyEncryption.put(tag + "", EncryptionDetail.UnencryptedOnSave);
+				classicPropertyEncryption.put(tag + "", EncryptionDetail.UnencryptedOnSave);
 			} else {
-				propertyEncryption.put(tag + "", EncryptionDetail.ReencryptOnSave);
+				classicPropertyEncryption.put(tag + "", EncryptionDetail.ReencryptOnSave);
 			}
 		}
@@ -3768,7 +4034,7 @@
 		for (String tag: DefaultFrameWriter.getItemTagsExt().keySet()) {
 			if (tag == "_el") {
-				propertyEncryption.put(tag, EncryptionDetail.UnencryptedOnSave);
+				classicPropertyEncryption.put(tag, EncryptionDetail.UnencryptedOnSave);
 			} else {
-				propertyEncryption.put(tag, EncryptionDetail.ReencryptOnSave);
+				classicPropertyEncryption.put(tag, EncryptionDetail.ReencryptOnSave);
 			}
 		}
@@ -3826,14 +4092,15 @@
 	}
 
-	public Set<Surrogate> getSurrogates() {
+	public Set<Item> getSurrogates() {
 		return surrogateItems;
 	}
 		
-	public void setAsSurrogateFor(Item classic) {
+	private void setAsSurrogateFor(Item classic) {
 		this.surrogateFor = classic;
 	}
 
-	public void addToSurrogates(Surrogate surrogate) {
+	public void addToSurrogates(Item surrogate) {
 		this.surrogateItems.add(surrogate);
+		surrogate.setAsSurrogateFor(this);
 	}
 	
@@ -3847,5 +4114,5 @@
 	
 	public EncryptionDetail getEncryptionDetailForTag(String tag) {
-		EncryptionDetail encryptionDetail = propertyEncryption.get(tag);
+		EncryptionDetail encryptionDetail = classicPropertyEncryption.get(tag);
 		
 		if (encryptionDetail == null) {
@@ -3857,5 +4124,20 @@
 	
 	public void setEncryptionDetailForTag(String tag, EncryptionDetail encryptionDetail) {
-		propertyEncryption.put(tag, encryptionDetail);
+		classicPropertyEncryption.put(tag, encryptionDetail);
+	}
+	
+	public boolean isTagInherited(String tag) {
+		return surrogatePropertyInheritance.get(tag);
+	}
+	
+
+	/**
+	 * If when setting a property, we find that the classic has a undeciphered value, when we must containue using that undeciphered value
+	 * when eventually saving.
+	 * @return
+	 */
+	protected boolean subjectToInheritanceCheckOnSave(String tag) {
+		if (getClassic() == null) return false;
+		return getClassic().classicPropertyEncryption.get(tag) != EncryptionDetail.UseUndecipheredValueOnSave;
 	}
 }
Index: /trunk/src/org/expeditee/items/Text.java
===================================================================
--- /trunk/src/org/expeditee/items/Text.java	(revision 1412)
+++ /trunk/src/org/expeditee/items/Text.java	(revision 1413)
@@ -41,5 +41,5 @@
 import org.expeditee.core.bounds.AxisAlignedBoxBounds;
 import org.expeditee.core.bounds.PolygonBounds;
-import org.expeditee.encryption.items.surrogates.Surrogate;
+import org.expeditee.encryption.items.surrogates.EncryptionDetail;
 import org.expeditee.gio.EcosystemManager;
 import org.expeditee.gio.GraphicsManager;
@@ -404,4 +404,12 @@
 		rebuild(true);
 		invalidateAll();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.WIDTH_TO_SAVE_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.WIDTH_TO_SAVE_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.WIDTH_TO_SAVE_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -419,4 +427,12 @@
 		rebuild(true);
 		invalidateAll();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.MIN_WIDTH_TO_SAVE_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.MIN_WIDTH_TO_SAVE_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.MIN_WIDTH_TO_SAVE_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -434,9 +450,9 @@
 	@Override
 	public Integer getWidth() {
-		if (_width == null || _width <= 0) {
-			return null;
-		}
-
-		return _width;
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.WIDTH_TO_SAVE_STR)) {
+			return this.getClassic().getWidth();
+		} else {
+			return _width;
+		}
 	}
 
@@ -450,8 +466,9 @@
 
 	public Integer getMinWidth() {
-		if (_minWidth == null || _minWidth <= 0) {
-			return null;
-		}
-		return _minWidth;
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.MIN_WIDTH_TO_SAVE_STR)) {
+			return this.getClassic().getMinWidth();
+		} else {
+			return _minWidth;
+		}
 	}
 
@@ -465,8 +482,9 @@
 	@Override
 	public Colour getHighlightColor() {
-		if (_highlightColour.equals(getPaintBackgroundColor())) {
-			return ALTERNATE_HIGHLIGHT;
-		}
-		return _highlightColour;
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.HIGHLIGHT_STR)) {
+			return this.getClassic().getHighlightColor();
+		} else {
+			return _highlightColour;
+		}
 	}
 
@@ -490,4 +508,12 @@
 		rebuild(true);
 		invalidateAll();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.JUSTIFICATION_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.JUSTIFICATION_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.JUSTIFICATION_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -501,7 +527,5 @@
 	 */
 	public Justification getJustification() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.JUSTIFICATION + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.JUSTIFICATION_STR)) {
 			return ((Text) this.getClassic()).getJustification();
 		} else {
@@ -665,4 +689,12 @@
 
 		rebuild(true);
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.TEXT_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.TEXT_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.TEXT_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -1295,4 +1327,12 @@
 
 		invalidateAll();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.FONT_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.FONT_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.FONT_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -1303,7 +1343,5 @@
 	 */
 	public Font getFont() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.FONT + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.FONT_STR)) {
 			return ((Text) this.getClassic()).getFont();
 		} else {
@@ -1469,5 +1507,9 @@
 	@Override
 	public String getText() {
-		return _text.toString();
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.TEXT_STR)) {
+			return this.getClassic().getText();
+		} else {
+			return _text.toString();
+		}
 	}
 
@@ -1507,4 +1549,12 @@
 		_spacing = spacing;
 		invalidateBounds();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.SPACING_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.SPACING_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.SPACING_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -1515,7 +1565,5 @@
 	 */
 	public float getSpacing() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.SPACING + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.SPACING_STR)) {
 			return ((Text) this.getClassic()).getSpacing();
 		} else {
@@ -1542,10 +1590,16 @@
 	public void setWordSpacing(int spacing) {
 		_word_spacing = spacing;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.WORD_SPACING_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.WORD_SPACING_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.WORD_SPACING_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
 	public int getWordSpacing() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.WORD_SPACING + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.WORD_SPACING_STR)) {
 			return ((Text) this.getClassic()).getWordSpacing();
 		} else {
@@ -1567,4 +1621,12 @@
 		currentFont.setSpacing(spacing);
 		// setFont(currentFont);
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.LETTER_SPACING_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.LETTER_SPACING_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.LETTER_SPACING_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -1574,7 +1636,5 @@
 	 */
 	public float getLetterSpacing() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.LETTER_SPACING + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.LETTER_SPACING_STR)) {
 			return ((Text) this.getClassic()).getLetterSpacing();
 		} else {
@@ -1585,10 +1645,16 @@
 	public void setInitialSpacing(float spacing) {
 		_initial_spacing = spacing;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.INITIAL_SPACING_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.INITIAL_SPACING_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.INITIAL_SPACING_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
 	public float getInitialSpacing() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.INITIAL_SPACING + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.INITIAL_SPACING_STR)) {
 			return ((Text) this.getClassic()).getInitialSpacing();
 		} else {
@@ -2795,4 +2861,12 @@
 		invalidateCommonTrait(ItemAppearence.PostMoved);
 		invalidateFill();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ANCHOR_LEFT_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ANCHOR_LEFT_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ANCHOR_LEFT_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -2821,4 +2895,12 @@
 		invalidateCommonTrait(ItemAppearence.PostMoved);
 		invalidateFill();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ANCHOR_RIGHT_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ANCHOR_RIGHT_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ANCHOR_RIGHT_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -2854,4 +2936,12 @@
 		invalidateCommonTrait(ItemAppearence.PostMoved);
 		invalidateFill();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ANCHOR_TOP_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ANCHOR_TOP_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ANCHOR_TOP_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -2892,4 +2982,12 @@
 		invalidateCommonTrait(ItemAppearence.PostMoved);
 		invalidateFill();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ANCHOR_BOTTOM_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ANCHOR_BOTTOM_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.ANCHOR_BOTTOM_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -3047,7 +3145,5 @@
 
 	public boolean getAutoWrap() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.AUTO_WRAP_TO_SAVE + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.AUTO_WRAP_TO_SAVE_STR)) {
 			return ((Text) this.getClassic()).getAutoWrap();
 		} else {
@@ -3059,5 +3155,5 @@
 	// normally
 	public String getAutoWrapToSave() {
-		if (!_autoWrap) {
+		if (!getAutoWrap()) {
 			return null;
 		}
@@ -3067,4 +3163,12 @@
 	public void setAutoWrap(boolean autoWrap) {
 		_autoWrap = autoWrap;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.AUTO_WRAP_TO_SAVE_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.AUTO_WRAP_TO_SAVE_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.AUTO_WRAP_TO_SAVE_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -3189,26 +3293,25 @@
 
 	public Integer getMask() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.MASK + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.MASK_STR)) {
 			return ((Text) this.getClassic()).getMask();
 		} else {
-			if (_mask == null) {
-				return null;
-			} else {
-				return _mask;
-			}
-		}
-
+			return _mask;
+		}
 	}
 
 	public void setMask(final Integer c) {
 		_mask = c;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.MASK_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.MASK_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.MASK_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 	
 	public String getPlaceholder() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.PLACEHOLDER + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.PLACEHOLDER_STR)) {
 			return ((Text) this.getClassic()).getPlaceholder();
 		} else {
@@ -3222,4 +3325,12 @@
 	public void setPlaceholder(String _placeholder) {
 		this._placeholder = new StringBuffer(_placeholder);
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.PLACEHOLDER_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.PLACEHOLDER_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.PLACEHOLDER_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 
@@ -3235,7 +3346,5 @@
 
 	public boolean isSingleLineOnly() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.SINGLE_LINE_ONLY + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.SINGLE_LINE_ONLY_STR)) {
 			return ((Text) this.getClassic()).isSingleLineOnly();
 		} else {
@@ -3246,10 +3355,16 @@
 	public void setSingleLineOnly(boolean _singleLine) {
 		this._singleLine = _singleLine;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.SINGLE_LINE_ONLY_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.SINGLE_LINE_ONLY_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.SINGLE_LINE_ONLY_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 	
 	public int getTabIndex() {
-		Surrogate surrogate = Surrogate.of(this);
-		if (surrogate != null && 
-				surrogate.isPropertyIsInherited(DefaultFrameWriter.TAB_INDEX + "")) {
+		if (isSurrogate() && surrogatePropertyInheritance.get(DefaultFrameWriter.TAB_INDEX_STR)) {
 			return ((Text) this.getClassic()).getTabIndex();
 		} else {
@@ -3260,4 +3375,12 @@
 	public void setTabIndex(int index) {
 		this._tabIndex = index;
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.TAB_INDEX_STR, false);
+			Item classic = getClassic();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.TAB_INDEX_STR)) {
+				classic.classicPropertyEncryption.put(DefaultFrameWriter.TAB_INDEX_STR, EncryptionDetail.InheritanceCheckOnSave);
+			}
+		}
 	}
 	
