Index: /trunk/src/org/expeditee/actions/Actions.java
===================================================================
--- /trunk/src/org/expeditee/actions/Actions.java	(revision 120)
+++ /trunk/src/org/expeditee/actions/Actions.java	(revision 121)
@@ -19,7 +19,7 @@
 import org.expeditee.gui.DisplayIO;
 import org.expeditee.gui.Frame;
-import org.expeditee.gui.FrameGraphics;
 import org.expeditee.gui.FrameIO;
 import org.expeditee.gui.FrameUtils;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.io.Conversion;
 import org.expeditee.io.Logger;
@@ -315,5 +315,5 @@
 		// check for protection on frame
 		if (ItemUtils.ContainsTag(source.getItems(), "@No" + mname)) {
-			FrameGraphics.DisplayMessage("Frame is protected by @No" + mname
+			MessageBay.displayMessage("Frame is protected by @No" + mname
 					+ " tag.");
 			return;
@@ -365,8 +365,8 @@
 		}
 		if (possibles.size() > 0) {
-			FrameGraphics.ErrorMessage("Incorrect parameters for " + mname);
+			MessageBay.errorMessage("Incorrect parameters for " + mname);
 		} else {
 			assert (false);
-			FrameGraphics.ErrorMessage(mname + " action not found");
+			MessageBay.errorMessage(mname + " action not found");
 		}
 	}
@@ -431,5 +431,5 @@
 			// if there is no constructor, return
 			if (con == null) {
-				FrameGraphics.DisplayMessage(INVALID_PARAMETERS_ERROR
+				MessageBay.displayMessage(INVALID_PARAMETERS_ERROR
 						+ nameWithCorrectCase);
 				// System.out.println("Constructor not found...");
@@ -445,5 +445,5 @@
 			// check for errors during initialisation
 			if (!_Agent.initialise(source)) {
-				FrameGraphics.ErrorMessage("Error initialising agent: "
+				MessageBay.errorMessage("Error initialising agent: "
 						+ nameWithCorrectCase);
 				return;
@@ -461,8 +461,8 @@
 
 		} catch (ClassNotFoundException cnf) {
-			FrameGraphics.ErrorMessage(nameWithCorrectCase
+			MessageBay.errorMessage(nameWithCorrectCase
 					+ "' is not an action or agent.");
 		} catch (Exception e) {
-			FrameGraphics.ErrorMessage("Error creating Agent: '"
+			MessageBay.errorMessage("Error creating Agent: '"
 					+ nameWithCorrectCase + "'");
 			System.out.println("Agent set to Null.");
@@ -494,5 +494,5 @@
 	public static void stopAgent() {
 		if (_Agent != null && _Agent.isRunning()) {
-			FrameGraphics.ErrorMessage("Stopping Agent...");
+			MessageBay.errorMessage("Stopping Agent...");
 			_Agent.stop();
 		}
Index: /trunk/src/org/expeditee/actions/IDE.java
===================================================================
--- /trunk/src/org/expeditee/actions/IDE.java	(revision 120)
+++ /trunk/src/org/expeditee/actions/IDE.java	(revision 121)
@@ -8,5 +8,5 @@
 import org.expeditee.gui.DisplayIO;
 import org.expeditee.gui.Frame;
-import org.expeditee.gui.FrameGraphics;
+import org.expeditee.gui.MessageBay;
 
 public class IDE {
@@ -23,10 +23,10 @@
 			try {
 				Runtime.getRuntime().exec("javac -d expeditee/bin " + fileName);
-				FrameGraphics.DisplayMessage("Compiled " + fileName, Color.darkGray);
+				MessageBay.displayMessage("Compiled " + fileName, Color.darkGray);
 			} catch (Exception e) {
-				FrameGraphics.ErrorMessage("Could not compile class!");
+				MessageBay.errorMessage("Could not compile class!");
 			}
 		} else {
-			FrameGraphics.ErrorMessage("Could not initialise agent!");
+			MessageBay.errorMessage("Could not initialise agent!");
 		}
 	}
@@ -50,11 +50,11 @@
 			String message = "";
 			while ((message = stdInput.readLine()) != null) {
-				FrameGraphics.DisplayMessage(message);
+				MessageBay.displayMessage(message);
 			}
 			while ((message = stdError.readLine()) != null) {
-				FrameGraphics.ErrorMessage(message);
+				MessageBay.errorMessage(message);
 			}
 		} catch (Exception e) {
-			FrameGraphics.ErrorMessage("Could not run class!");
+			MessageBay.errorMessage("Could not run class!");
 		}
 	}
Index: /trunk/src/org/expeditee/actions/Misc.java
===================================================================
--- /trunk/src/org/expeditee/actions/Misc.java	(revision 120)
+++ /trunk/src/org/expeditee/actions/Misc.java	(revision 121)
@@ -20,4 +20,5 @@
 import org.expeditee.gui.FrameIO;
 import org.expeditee.gui.FrameMouseActions;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.gui.TimeKeeper;
 import org.expeditee.items.Item;
@@ -55,5 +56,5 @@
 	public static void Restore() {
 		FrameIO.Reload();
-		// FrameGraphics.DisplayMessage("Restoration complete.");
+		// MessageBay.displayMessage("Restoration complete.");
 	}
 
@@ -144,5 +145,5 @@
 				DisplayIO.Back();
 				FrameGraphics.Repaint();
-				FrameGraphics.DisplayMessage(deletedFrame + " deleted");
+				MessageBay.displayMessage(deletedFrame + " deleted");
 				return;
 			}
@@ -156,5 +157,5 @@
 			e.printStackTrace();
 		}
-		FrameGraphics.ErrorMessage(errorMessage);
+		MessageBay.errorMessage(errorMessage);
 	}
 
@@ -249,9 +250,9 @@
 	public static void GetCometStats(Frame frame) {
 		TimeKeeper timer = new TimeKeeper();
-		FrameGraphics.DisplayMessage("Computing comet stats...");
+		MessageBay.displayMessage("Computing comet stats...");
 
 		CometStats cometStats = new CometStats(frame);
 		attachStatsToCursor(cometStats.toString());
-		FrameGraphics.OverwriteMessage("Comet stats time: "
+		MessageBay.overwriteMessage("Comet stats time: "
 				+ timer.getElapsedStringSeconds());
 	}
@@ -259,9 +260,9 @@
 	public static void GetTreeStats(Frame frame) {
 		TimeKeeper timer = new TimeKeeper();
-		FrameGraphics.DisplayMessage("Computing tree stats...");
+		MessageBay.displayMessage("Computing tree stats...");
 
 		TreeStats treeStats = new TreeStats(frame);
 		attachStatsToCursor(treeStats.toString());
-		FrameGraphics.OverwriteMessage("Tree stats time: "
+		MessageBay.overwriteMessage("Tree stats time: "
 				+ timer.getElapsedStringSeconds());
 	}
@@ -473,12 +474,12 @@
 			String frameName = ImageFrame(loaded, format, path);
 			if (frameName != null)
-				FrameGraphics.DisplayMessage("Frame successfully saved to "
+				MessageBay.displayMessage("Frame successfully saved to "
 						+ path + frameName);
 			else
-				FrameGraphics.ErrorMessage("Could not find image writer for "
+				MessageBay.errorMessage("Could not find image writer for "
 						+ format + " format");
 			// if the frame was not loaded successfully, alert the user
 		} else
-			FrameGraphics.DisplayMessage("Frame '" + framename
+			MessageBay.displayMessage("Frame '" + framename
 					+ "' could not be found.");
 	}
@@ -491,9 +492,9 @@
 	 */
 	public static void MessageLn(String message) {
-		FrameGraphics.DisplayMessage(message);
+		MessageBay.displayMessage(message);
 	}
 
 	public static void MessageLn2(String message, String message2) {
-		FrameGraphics.DisplayMessage(message + " " + message2);
+		MessageBay.displayMessage(message + " " + message2);
 	}
 
@@ -502,12 +503,12 @@
 			// TODO is there a built in method which will do this faster?
 
-			FrameGraphics.DisplayMessage("Copying file " + existingFile
+			MessageBay.displayMessage("Copying file " + existingFile
 					+ " to " + newFileName + "...");
 			FrameIO.copyFile(existingFile, newFileName);
-			FrameGraphics.DisplayMessage("File copied successfully");
+			MessageBay.displayMessage("File copied successfully");
 		} catch (FileNotFoundException e) {
-			FrameGraphics.DisplayMessage("Error opening file: " + existingFile);
+			MessageBay.displayMessage("Error opening file: " + existingFile);
 		} catch (Exception e) {
-			FrameGraphics.DisplayMessage("File could not be copied");
+			MessageBay.displayMessage("File could not be copied");
 		}
 	}
@@ -561,11 +562,11 @@
 			float aveTimeB = timeB * 1000F / repsPerTest / tests;
 			// Display Results
-			FrameGraphics.DisplayMessage("Average Execution Time");
-			FrameGraphics.DisplayMessage(methodNameA + ": "
+			MessageBay.displayMessage("Average Execution Time");
+			MessageBay.displayMessage(methodNameA + ": "
 					+ TimeKeeper.Formatter.format(aveTimeA) + "us");
-			FrameGraphics.DisplayMessage(methodNameB + ": "
+			MessageBay.displayMessage(methodNameB + ": "
 					+ TimeKeeper.Formatter.format(aveTimeB) + "us");
 		} catch (Exception e) {
-			FrameGraphics.ErrorMessage(e.getClass().getSimpleName() + ": "
+			MessageBay.errorMessage(e.getClass().getSimpleName() + ": "
 					+ e.getMessage());
 		}
@@ -634,6 +635,6 @@
 		// the item must link to a frame
 		if (current.getLink() == null) {
-			FrameGraphics
-					.DisplayMessage("Cannot get item from child - this item has no link");
+			MessageBay
+					.displayMessage("Cannot get item from child - this item has no link");
 			return null;
 		}
@@ -643,5 +644,5 @@
 		// if the frame could not be loaded
 		if (child == null) {
-			FrameGraphics.ErrorMessage("Could not load child frame.");
+			MessageBay.errorMessage("Could not load child frame.");
 			return null;
 		}
@@ -663,5 +664,5 @@
 		// if no item was found
 		if (item == null) {
-			FrameGraphics.DisplayMessage("No item found to copy");
+			MessageBay.displayMessage("No item found to copy");
 			return null;
 		}
Index: /trunk/src/org/expeditee/actions/NavigationActions.java
===================================================================
--- /trunk/src/org/expeditee/actions/NavigationActions.java	(revision 120)
+++ /trunk/src/org/expeditee/actions/NavigationActions.java	(revision 121)
@@ -5,7 +5,7 @@
 import org.expeditee.gui.DisplayIO;
 import org.expeditee.gui.Frame;
-import org.expeditee.gui.FrameGraphics;
 import org.expeditee.gui.FrameIO;
 import org.expeditee.gui.FrameUtils;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.items.Item;
 
@@ -143,5 +143,5 @@
 		// if there is no parent frame (i.e. the user is on the home frame) //
 		if (back == null) { // No frame was on the Backup stack
-			FrameGraphics.DisplayMessage("No Parent Frame Found.");
+			MessageBay.displayMessage("No Parent Frame Found.");
 			_LastItemUsed = null; // ByRob: what is reason for setting
 			// this to null, who is going to use it????
@@ -200,5 +200,5 @@
 		} // ByRob: End of For
 
-		FrameGraphics.DisplayMessage("No more child frames found.");
+		MessageBay.displayMessage("No more child frames found.");
 	}
 
Index: /trunk/src/org/expeditee/actions/Simple.java
===================================================================
--- /trunk/src/org/expeditee/actions/Simple.java	(revision 120)
+++ /trunk/src/org/expeditee/actions/Simple.java	(revision 121)
@@ -27,4 +27,6 @@
 import org.expeditee.gui.FrameMouseActions;
 import org.expeditee.gui.FrameUtils;
+import org.expeditee.gui.FreeItems;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.io.Conversion;
 import org.expeditee.items.Dot;
@@ -144,5 +146,5 @@
 		newSimpleTest.getTitleItem().setActions(actions);
 		FrameUtils.DisplayFrame(newSimpleTest, true);
-		FrameGraphics.DisplayMessage("New test created");
+		MessageBay.displayMessage("New test created");
 	}
 
@@ -206,5 +208,5 @@
 
 		FrameIO.SaveFrame(DisplayIO.getCurrentFrame(), false);
-		FrameGraphics.DisplayMessage("Starting test suite: " + _frameset,
+		MessageBay.displayMessage("Starting test suite: " + _frameset,
 				Color.CYAN);
 
@@ -257,5 +259,5 @@
 				if (passed) {
 					if (_verbose)
-						FrameGraphics.DisplayMessage("Test passed: "
+						MessageBay.displayMessage("Test passed: "
 								+ title.toString(), Item.GREEN);
 					testsPassed++;
@@ -263,5 +265,5 @@
 					testsFailed++;
 					// Print out the reason for failed tests
-					FrameGraphics.LinkedErrorMessage(errorMessage);
+					MessageBay.linkedErrorMessage(errorMessage);
 					if (Simple._stop) {
 						Simple._stop = false;
@@ -275,12 +277,12 @@
 		assert (_programsRunning == 0);
 		// Report the number of test passed and failed
-		FrameGraphics.DisplayMessage("Total tests: "
+		MessageBay.displayMessage("Total tests: "
 				+ (testsPassed + testsFailed), Color.CYAN);
 		if (testsPassed > 0)
-			FrameGraphics.DisplayMessage("Passed: " + testsPassed, Item.GREEN);
+			MessageBay.displayMessage("Passed: " + testsPassed, Item.GREEN);
 		if (testsFailed > 0)
-			FrameGraphics.DisplayMessage("Failed: " + testsFailed, Color.RED);
+			MessageBay.displayMessage("Failed: " + testsFailed, Color.RED);
 		// Remove items from the cursor...
-		Frame.FreeItems.clear();
+		FreeItems.getInstance().clear();
 
 		return testsFailed == 0;
@@ -1437,10 +1439,10 @@
 					.getValue();
 			try {
-				FrameGraphics.DisplayMessage(((Text) message).copy());
+				MessageBay.displayMessage(((Text) message).copy());
 			} catch (NullPointerException e) {
-				FrameGraphics.DisplayMessage("null");
+				MessageBay.displayMessage("null");
 			} catch (ClassCastException e) {
 				// Just ignore not text items!
-				FrameGraphics.DisplayMessage(message.toString());
+				MessageBay.displayMessage(message.toString());
 			} catch (Exception e) {
 				// Just ignore other errors
@@ -1455,7 +1457,7 @@
 
 			if (tokens[0].equals("errorln") || tokens[0].equals("errorline"))
-				FrameGraphics.ErrorMessage(message);
+				MessageBay.errorMessage(message);
 			else
-				FrameGraphics.DisplayMessageAlways(message);
+				MessageBay.displayMessageAlways(message);
 		} else if (tokens[0].equals("typeatrate")) {
 			assertMinParametreCount(tokens, 1);
@@ -1488,5 +1490,5 @@
 			try {
 				Process p = Runtime.getRuntime().exec(command);
-				FrameGraphics.DisplayMessage(command, Color.darkGray);
+				MessageBay.displayMessage(command, Color.darkGray);
 
 				BufferedReader stdInput = new BufferedReader(
@@ -1496,8 +1498,8 @@
 				String message = "";
 				while ((message = stdInput.readLine()) != null) {
-					FrameGraphics.DisplayMessage(message);
+					MessageBay.displayMessage(message);
 				}
 				while ((message = stdError.readLine()) != null) {
-					FrameGraphics.ErrorMessage(message);
+					MessageBay.errorMessage(message);
 				}
 			} catch (Exception e) {
@@ -1758,9 +1760,9 @@
 				success = FrameIO.DeleteFrame(frame);
 				if (!success && _verbose)
-					FrameGraphics.WarningMessage(errorMessage);
+					MessageBay.warningMessage(errorMessage);
 			} catch (Exception e) {
 				// If an exception is thrown then success is false
 				if (_verbose) {
-					FrameGraphics.WarningMessage(errorMessage
+					MessageBay.warningMessage(errorMessage
 							+ (e.getMessage() != null ? ". " + e.getMessage()
 									: ""));
@@ -1777,5 +1779,5 @@
 			boolean success = FrameIO.DeleteFrameset(framesetName);
 			if (!success && _verbose) {
-				FrameGraphics.WarningMessage("Error deleting " + framesetName);
+				MessageBay.warningMessage("Error deleting " + framesetName);
 			}
 			if (tokens.length > 2) {
@@ -1800,5 +1802,5 @@
 					copiedFrameset);
 			if (!success && _verbose)
-				FrameGraphics.WarningMessage("Error copying " + framesetToCopy);
+				MessageBay.warningMessage("Error copying " + framesetToCopy);
 			if (tokens.length > 3) {
 				context.getPrimitives().setValue(tokens[3],
@@ -1829,5 +1831,5 @@
 			boolean success = fileContents != null;
 			if (!success && _verbose)
-				FrameGraphics.WarningMessage("Error copying "
+				MessageBay.warningMessage("Error copying "
 						+ frameToCopy.getName());
 			if (tokens.length > 4) {
@@ -2026,6 +2028,6 @@
 					if (freeMemory < DisplayTree.GARBAGE_COLLECTION_THRESHOLD) {
 						runtime.gc();
-						FrameGraphics
-								.DisplayMessage("Force Garbage Collection!");
+						MessageBay
+								.displayMessage("Force Garbage Collection!");
 					}
 				}
@@ -2128,5 +2130,5 @@
 				success = false;
 				if (_verbose)
-					FrameGraphics.WarningMessage("Error parsing " + frameName);
+					MessageBay.warningMessage("Error parsing " + frameName);
 			}
 			// assertPrimitiveType(tokens[2], 2);
@@ -2299,5 +2301,5 @@
 			// DisplayIO.setCursorPosition(finalX, finalY);
 			FrameMouseActions.anchor(item);
-			Frame.FreeItems.clear();
+			FreeItems.getInstance().clear();
 			FrameGraphics.Repaint();
 			// FrameMouseActions.updateCursor();
@@ -2591,5 +2593,5 @@
 		_programsRunning++;
 		AgentStats.reset();
-		FrameGraphics.DisplayMessage("Running SimpleProgram...", Color.BLUE);
+		MessageBay.displayMessage("Running SimpleProgram...", Color.BLUE);
 	}
 
Index: /trunk/src/org/expeditee/agents/CopyTree.java
===================================================================
--- /trunk/src/org/expeditee/agents/CopyTree.java	(revision 120)
+++ /trunk/src/org/expeditee/agents/CopyTree.java	(revision 121)
@@ -5,7 +5,7 @@
 
 import org.expeditee.gui.Frame;
-import org.expeditee.gui.FrameGraphics;
 import org.expeditee.gui.FrameIO;
 import org.expeditee.gui.FrameUtils;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.items.Item;
 
@@ -49,5 +49,5 @@
 			processFrame(zero);
 		} catch (ExistingFramesetException efe) {
-			FrameGraphics.ErrorMessage("A frameset called " + _nameTo
+			MessageBay.errorMessage("A frameset called " + _nameTo
 					+ " already exists.");
 			return false;
Index: /trunk/src/org/expeditee/agents/DefaultAgent.java
===================================================================
--- /trunk/src/org/expeditee/agents/DefaultAgent.java	(revision 120)
+++ /trunk/src/org/expeditee/agents/DefaultAgent.java	(revision 121)
@@ -2,5 +2,5 @@
 
 import org.expeditee.gui.Frame;
-import org.expeditee.gui.FrameGraphics;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.gui.TimeKeeper;
 import org.expeditee.stats.SessionStats;
@@ -93,5 +93,5 @@
 		// init is now called by Actions.java
 		/*
-		 * if(!initialise(_start)){ FrameGraphics.ErrorMessage("Error
+		 * if(!initialise(_start)){ MessageBay.errorMessage("Error
 		 * initialising agent."); _running = false; return; }
 		 */
@@ -135,9 +135,9 @@
 	 */
 	protected void message(String message) {
-		FrameGraphics.DisplayMessageAlways(message);
+		MessageBay.displayMessageAlways(message);
 	}
 
 	protected void overwriteMessage(String message) {
-		FrameGraphics.OverwriteMessage(message);
+		MessageBay.overwriteMessage(message);
 	}
 
Index: /trunk/src/org/expeditee/agents/DisplayComet.java
===================================================================
--- /trunk/src/org/expeditee/agents/DisplayComet.java	(revision 120)
+++ /trunk/src/org/expeditee/agents/DisplayComet.java	(revision 121)
@@ -7,6 +7,6 @@
 import org.expeditee.gui.DisplayIO;
 import org.expeditee.gui.Frame;
-import org.expeditee.gui.FrameGraphics;
 import org.expeditee.gui.FrameIO;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.items.Item;
 import org.expeditee.items.ItemUtils;
@@ -45,5 +45,5 @@
 				if (link != null && !seen.contains(linkLowerCase)) {
 					oldFrame = FrameIO.LoadFrame(linkLowerCase);
-					FrameGraphics.OverwriteMessage("Loading frames: " + link);
+					MessageBay.overwriteMessage("Loading frames: " + link);
 				}
 			}
Index: /trunk/src/org/expeditee/agents/DisplayTree.java
===================================================================
--- /trunk/src/org/expeditee/agents/DisplayTree.java	(revision 120)
+++ /trunk/src/org/expeditee/agents/DisplayTree.java	(revision 121)
@@ -3,5 +3,5 @@
 import org.expeditee.gui.DisplayIO;
 import org.expeditee.gui.Frame;
-import org.expeditee.gui.FrameGraphics;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.items.Item;
 import org.expeditee.items.ItemUtils;
@@ -55,5 +55,5 @@
 		if (freeMemory < GARBAGE_COLLECTION_THRESHOLD) {
 			_runtime.gc();
-			FrameGraphics.DisplayMessage("Force Garbage Collection!");
+			MessageBay.displayMessage("Force Garbage Collection!");
 		}
 
Index: /trunk/src/org/expeditee/agents/SwitchyardTree.java
===================================================================
--- /trunk/src/org/expeditee/agents/SwitchyardTree.java	(revision 120)
+++ /trunk/src/org/expeditee/agents/SwitchyardTree.java	(revision 121)
@@ -12,5 +12,5 @@
 	@Override
 	protected Frame process(Frame frame) {
-		//FrameGraphics.DisplayMessage("Running switchyard tree...");
+		//MessageBay.displayMessage("Running switchyard tree...");
 
 		for (Text textItem : frame.getBodyTextItems(false)) {
Index: /trunk/src/org/expeditee/agents/WriteTree.java
===================================================================
--- /trunk/src/org/expeditee/agents/WriteTree.java	(revision 120)
+++ /trunk/src/org/expeditee/agents/WriteTree.java	(revision 121)
@@ -6,5 +6,5 @@
 import org.expeditee.actions.Actions;
 import org.expeditee.gui.Frame;
-import org.expeditee.gui.FrameGraphics;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.io.FrameWriter;
 import org.expeditee.io.Logger;
@@ -88,5 +88,5 @@
 				// check that o is a valid treewriter
 				if (!(o instanceof TreeWriter)) {
-					FrameGraphics.WarningMessage(_format.toUpperCase()
+					MessageBay.warningMessage(_format.toUpperCase()
 							+ " format cannot be used to write trees.");
 					return false;
@@ -101,5 +101,5 @@
 			} else {
 				if (!(o instanceof FrameWriter) && !(o instanceof TreeWriter)) {
-					FrameGraphics.WarningMessage(_format.toUpperCase()
+					MessageBay.warningMessage(_format.toUpperCase()
 							+ " format cannot be used to write frames.");
 					return false;
@@ -115,6 +115,6 @@
 
 		} catch (ClassNotFoundException e) {
-			FrameGraphics
-					.WarningMessage("The agent does not exist or has incorrect parametres.");
+			MessageBay
+					.warningMessage("The agent does not exist or has incorrect parametres.");
 			return false;
 		} catch (Exception e) {
@@ -141,5 +141,5 @@
 			//System.out.println("Caught");
 			Logger.Log(e);
-			FrameGraphics.ErrorMessage("IOException in WriteTree: "
+			MessageBay.errorMessage("IOException in WriteTree: "
 					+ e.getMessage());
 			e.printStackTrace();
Index: /trunk/src/org/expeditee/gui/AttributeUtils.java
===================================================================
--- /trunk/src/org/expeditee/gui/AttributeUtils.java	(revision 120)
+++ /trunk/src/org/expeditee/gui/AttributeUtils.java	(revision 121)
@@ -476,5 +476,5 @@
 						// Display an error message if its not in our list of
 						// attributes to ignore when copying
-						FrameGraphics.WarningMessage("Attribute: '"
+						MessageBay.warningMessage("Attribute: '"
 								+ getAttribute(v.toString())
 								+ "' does not exist.");
@@ -484,5 +484,5 @@
 								.getParameterTypes())
 							types += c.getSimpleName() + " ";
-						FrameGraphics.WarningMessage("Wrong arguments for: '"
+						MessageBay.warningMessage("Wrong arguments for: '"
 								+ getAttribute(v.toString()) + "' expecting "
 								+ types.trim() + " found '"
@@ -576,5 +576,5 @@
 					e.printStackTrace();
 				} catch (InvocationTargetException e) {
-					FrameGraphics.DisplayMessage(toSet.getClass()
+					MessageBay.displayMessage(toSet.getClass()
 							.getSimpleName()
 							+ " type does not support that attribute.");
Index: /trunk/src/org/expeditee/gui/Browser.java
===================================================================
--- /trunk/src/org/expeditee/gui/Browser.java	(revision 120)
+++ /trunk/src/org/expeditee/gui/Browser.java	(revision 121)
@@ -15,4 +15,5 @@
 
 import javax.swing.JFrame;
+import javax.swing.RepaintManager;
 
 import org.expeditee.AbsoluteLayout;
@@ -48,7 +49,7 @@
 	 */
 	public static void main(String[] args) {
-		//FrameGraphics.SupressMessages(true);
+		//MessageBay.supressMessages(true);
 		_theBrowser = new Browser();
-		//FrameGraphics.SupressMessages(false);
+		//MessageBay.supressMessages(false);
 		// Why do we want to ignore repaint?
 		// _theBrowser.setIgnoreRepaint(true);
@@ -114,4 +115,9 @@
 		addComponentListener(this);
 		pack();
+		
+		// Expeditee handles its own repainting of AWT/Swing components
+		RepaintManager.setCurrentManager(ExpediteeRepaintManager.getInstance());
+		
+		
 		try {
 			Collection<String> warningMessages = Actions.Init();
@@ -129,6 +135,6 @@
 			//Must be loaded after setupGraphics if images are on the frame
 			//Turn off XRay mode and load the first frame
+			FrameUtils.loadFirstFrame(profile);
 			FrameGraphics.setMode(FrameGraphics.MODE_NORMAL, false);
-			FrameUtils.loadFirstFrame(profile);
 			DisplayIO.UpdateTitle();
 			
@@ -136,5 +142,5 @@
 			//It used to crash the program trying to print error messages up the top
 			for (String message : warningMessages)
-				FrameGraphics.WarningMessage(message);
+				MessageBay.warningMessage(message);
 
 			FrameKeyboardActions keyboardListner = new FrameKeyboardActions();
@@ -142,5 +148,5 @@
 			this.addKeyListener(keyboardListner);
 			
-			//FrameKeyboardActions.Refresh();
+			FrameKeyboardActions.Refresh();
 			//setVisible(true);
 		} catch (Exception e) {
@@ -150,5 +156,5 @@
 	}
 
-	Graphics2D g;
+	public Graphics2D g;
 
 	private void setupGraphics() {
@@ -170,5 +176,5 @@
 		// then moved back into view
 		super.paint(g);
-		FrameGraphics.Repaint();
+		FrameGraphics.ForceRepaint();
 		// System.out.println("Paint " + count++);
 	}
@@ -181,5 +187,5 @@
 		setupGraphics();
 		FrameIO.RefreshCasheImages();
-		FrameGraphics.Repaint();
+		FrameGraphics.ForceRepaint();
 	}
 
Index: /trunk/src/org/expeditee/gui/DisplayIO.java
===================================================================
--- /trunk/src/org/expeditee/gui/DisplayIO.java	(revision 120)
+++ /trunk/src/org/expeditee/gui/DisplayIO.java	(revision 121)
@@ -10,4 +10,5 @@
 import java.awt.geom.Point2D;
 import java.awt.image.MemoryImageSource;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedList;
@@ -205,5 +206,5 @@
 
 		if (Frame.itemAttachedToCursor()) {
-			List<Item> toMove = Frame.FreeItems;
+			List<Item> toMove = FreeItems.getInstance();
 			for (Item move : toMove) {
 				move.setPosition(move.getX() + deltax, move.getY() + deltay);
@@ -333,5 +334,5 @@
 		if (frame == null)
 			return;
-
+		
 		if (_TwinFrames) {
 			if (_CurrentFrames[0] == null) {
@@ -348,5 +349,5 @@
 		if (frame == getCurrentFrame()) {
 			FrameGraphics.Repaint();
-			FrameGraphics.DisplayMessage(frame.getName()
+			MessageBay.displayMessage(frame.getName()
 					+ " is already the current frame.");
 			return;
@@ -355,4 +356,19 @@
 		}
 
+		
+		// Invalidate free items
+		if (!FreeItems.getInstance().isEmpty() && getCurrentFrame() != null) {
+	
+			// Empty free items temporarily so that the old frames buffer is repainted
+			// without the free items.
+			ArrayList<? extends Item> tmp = (ArrayList<? extends Item>)FreeItems.getInstance().clone();
+			FreeItems.getInstance().clear(); // NOTE: This will invalidate all the cleared free items
+			FrameGraphics.refresh(true);
+			FreeItems.getInstance().addAll(tmp);
+			
+			
+		}
+		
+		
 		if (_TwinFrames) {
 			// if the same frame is being shown in both sides, load a fresh
@@ -379,5 +395,5 @@
 			_CurrentFrames[getCurrentSide()] = frame;
 
-			// BROOK : TODO...
+			// BROOK : TODO... overlays and loadable widgets
 			for (Item i : _CurrentFrames[getCurrentSide()].getItems()) {
 				i.onParentStateChanged(new ItemParentStateChangedEvent(
@@ -469,5 +485,5 @@
 		}
 
-		FrameGraphics.Repaint();
+		FrameGraphics.refresh(false);
 	}
 
@@ -573,11 +589,11 @@
 		// there must be a frame to go back to
 		if (_VisitedFrames[side].size() < 1) {
-			FrameGraphics
-					.DisplayMessageOnce("You are already on the home frame");
+			MessageBay
+					.displayMessageOnce("You are already on the home frame");
 			return;
 		}
 
 		if (!FrameUtils.LeavingFrame(getCurrentFrame())) {
-			FrameGraphics.DisplayMessage("Back operation cancelled");
+			MessageBay.displayMessage("Back operation cancelled");
 			return;
 		}
Index: /trunk/src/org/expeditee/gui/Frame.java
===================================================================
--- /trunk/src/org/expeditee/gui/Frame.java	(revision 120)
+++ /trunk/src/org/expeditee/gui/Frame.java	(revision 121)
@@ -24,4 +24,5 @@
 import org.expeditee.items.InteractiveWidget;
 import org.expeditee.items.Item;
+import org.expeditee.items.ItemAppearence;
 import org.expeditee.items.ItemParentStateChangedEvent;
 import org.expeditee.items.ItemUtils;
@@ -99,6 +100,4 @@
 	// Note: Needs to be able to be iterated through (for painting)
 	private List<Item> _body = new ArrayList<Item>();
-
-	public static List<Item> FreeItems = new ArrayList<Item>();
 
 	// for drawing purposes
@@ -660,4 +659,5 @@
 		_body.add(item);
 		item.setParent(this);
+		item.invalidateCommonTrait(ItemAppearence.Added);
 
 		// If the item is a line end and has constraints with items already
@@ -717,5 +717,7 @@
 					_iWidgets.remove(((WidgetCorner) item).getWidgetSource());
 				}
-			}
+				item.invalidateCommonTrait(ItemAppearence.Removed);
+			}
+			
 		}
 	}
@@ -862,5 +864,8 @@
 		_background = back;
 		change();
-		// FrameGraphics.Repaint();
+		
+		if (this == DisplayIO.getCurrentFrame()) {
+			FrameGraphics.refresh(false);
+		}
 	}
 
@@ -1012,4 +1017,6 @@
 					toAdd.permission));
 			_vectorItems.add(i);
+			i.invalidateAll();
+			i.invalidateFill();
 		}
 		return true;
@@ -1097,5 +1104,11 @@
 	public void clearVectors() {
 		_vectors.clear();
+		
+		for (Item i : _vectorItems) { // TODO: Rethink where this should live
+			i.invalidateAll();
+			i.invalidateFill();
+		}
 		_vectorItems.clear();
+		
 	}
 
@@ -1104,8 +1117,11 @@
 			return false;
 		for (Item i : toRemove.Frame.getVectorItems()) {
+			i.invalidateAll();
+			i.invalidateFill();
 			_overlayItems.remove(i);
 			i.onParentStateChanged(new ItemParentStateChangedEvent(this,
 					ItemParentStateChangedEvent.EVENT_TYPE_REMOVED_VIA_OVERLAY,
 					toRemove.permission));
+			
 		}
 		return true;
@@ -1142,5 +1158,5 @@
 		}
 	}
-
+	
 	public void addAllOverlays(Collection<Overlay> overlays) {
 		for (Overlay o : overlays) {
@@ -1396,19 +1412,19 @@
 
 	public static boolean rubberbandingLine() {
-		return FreeItems.size() == 2
-				&& (FreeItems.get(0) instanceof Line || FreeItems.get(1) instanceof Line);
+		return FreeItems.getInstance().size() == 2
+				&& (FreeItems.getInstance().get(0) instanceof Line || FreeItems.getInstance().get(1) instanceof Line);
 	}
 
 	public static boolean itemAttachedToCursor() {
-		return FreeItems.size() > 0;
+		return FreeItems.getInstance().size() > 0;
 	}
 
 	public static boolean textItemAttachedToCursor() {
-		return itemAttachedToCursor() && FreeItems.get(0) instanceof Text;
+		return itemAttachedToCursor() && FreeItems.getInstance().get(0) instanceof Text;
 	}
 
 	public static Item getItemAttachedToCursor() {
 		if (itemAttachedToCursor())
-			return FreeItems.get(0);
+			return FreeItems.getInstance().get(0);
 
 		return null;
Index: /trunk/src/org/expeditee/gui/FrameGraphics.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameGraphics.java	(revision 120)
+++ /trunk/src/org/expeditee/gui/FrameGraphics.java	(revision 121)
@@ -5,5 +5,5 @@
 import java.awt.Container;
 import java.awt.Dimension;
-import java.awt.Font;
+import java.awt.EventQueue;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
@@ -11,7 +11,8 @@
 import java.awt.Image;
 import java.awt.Point;
+import java.awt.Rectangle;
 import java.awt.RenderingHints;
+import java.awt.geom.Area;
 import java.awt.image.BufferedImage;
-import java.awt.image.VolatileImage;
 import java.util.Collection;
 import java.util.Collections;
@@ -21,8 +22,8 @@
 import java.util.List;
 
+import javax.swing.JComponent;
 import javax.swing.JPopupMenu;
 import javax.swing.SwingUtilities;
 
-import org.expeditee.actions.Misc;
 import org.expeditee.items.Circle;
 import org.expeditee.items.InteractiveWidget;
@@ -30,14 +31,8 @@
 import org.expeditee.items.ItemUtils;
 import org.expeditee.items.Line;
-import org.expeditee.items.Text;
 import org.expeditee.items.WidgetEdge;
 import org.expeditee.items.XRayable;
 
 public class FrameGraphics {
-	public static final int MESSAGE_BUFFER_HEIGHT = 100;
-
-	private static final int MESSAGE_LINK_Y_OFFSET = 100;
-
-	private static final int MESSAGE_LINK_X = 50;
 
 	// the graphics used to paint with
@@ -47,16 +42,4 @@
 	private static Dimension _MaxSize;
 
-	// messages shown in the message window
-	public static Text[] Messages = new Text[4];
-
-	// buffer of the message window
-	private static VolatileImage _MessageBuffer = null;
-
-	// font used for the messages
-	private static Font _MessageFont = Font.decode("Serif-Plain-16");
-
-	// the number of messages currently shown (used for scrolling up)
-	private static int _MessageCount = 0;
-
 	// modes
 	public static final int MODE_NORMAL = 0;
@@ -65,22 +48,12 @@
 
 	public static final int MODE_XRAY = 2;
-
-	public static final Color ERROR_COLOR = Color.red;
 
 	// Start in XRay mode so that errors arnt thrown when parsing the profile
 	// frame if it has images on it
 	private static int _Mode = MODE_XRAY;
-
-	// if true, error messages are not shown to the user
-	private static boolean _SupressMessages = false;
-
-	public static String MESSAGES_FRAMESET_NAME = "Messages";
-
-	// The link to the message frameset
-	public static Item MessageLink = new Text(-2, "@" + MESSAGES_FRAMESET_NAME,
-			Color.black, Color.white);
-
-	// creator for creating the message frames
-	private static FrameCreator _creator;
+	
+	private FrameGraphics() {
+		// util constructor
+	}
 
 	/**
@@ -104,7 +77,7 @@
 		FrameUtils.Parse(current);
 		DisplayIO.UpdateTitle();
-		setMaxSize(new Dimension(_MaxSize.width, _MessageBuffer.getHeight()
+		setMaxSize(new Dimension(_MaxSize.width, MessageBay.getMessageBufferHeight()
 				+ _MaxSize.height));
-		Repaint();
+		refresh(false);
 	}
 
@@ -120,5 +93,5 @@
 		DisplayIO.UpdateTitle();
 		FrameMouseActions.getInstance().refreshHighlights();
-		Repaint();
+		refresh(false);
 	}
 
@@ -151,5 +124,5 @@
 		// Hide the message buffer if in audience mode
 		int newMaxHeight = max.height
-				- (isAudienceMode() ? 0 : MESSAGE_BUFFER_HEIGHT);
+				- (isAudienceMode() ? 0 : MessageBay.MESSAGE_BUFFER_HEIGHT);
 		if (newMaxHeight > 0) {
 			_MaxSize.setSize(max.width, newMaxHeight);
@@ -161,20 +134,6 @@
 		}
 
-		if (newMaxHeight > 0) {
-			_MessageBuffer = null;
-
-			for (int i = 0; i < Messages.length; i++) {
-				if (Messages[i] != null) {
-					Messages[i].setOffset(0, -_MaxSize.height);
-					Messages[i].setMaxSize(_MaxSize);
-				}
-			}
-
-			MessageLink.setOffset(0, -_MaxSize.height);
-			MessageLink.setMaxSize(_MaxSize);
-			MessageLink.setPosition(_MaxSize.width - MESSAGE_LINK_Y_OFFSET,
-					MESSAGE_LINK_X);
-		}
-		// Repaint();
+		if (newMaxHeight > 0)
+			MessageBay.updateSize();
 	}
 
@@ -205,5 +164,5 @@
 	 * Displays the given Item on the screen
 	 */
-	private static void PaintItem(Graphics2D g, Item i) {
+	static void PaintItem(Graphics2D g, Item i) {
 		if (i == null || g == null)
 			return;
@@ -286,9 +245,16 @@
 	}
 
-	private static Image Paint(Frame toPaint) {
-		return Paint(toPaint, true);
-	}
-
-	private static Image Paint(Frame toPaint, boolean isActualFrame) {
+	private static Image Paint(Frame toPaint, Area clip) {
+		return Paint(toPaint, clip, true);
+	}
+
+	/**
+	 * 
+	 * @param toPaint
+	 * @param clip If null, then no clip applied.
+	 * @param isActualFrame
+	 * @return
+	 */
+	private static Image Paint(Frame toPaint, Area clip, boolean isActualFrame) {
 		if (toPaint == null)
 			return null;
@@ -313,4 +279,7 @@
 
 			Graphics2D bg = (Graphics2D) buffer.getGraphics();
+			bg.setClip(clip); 
+			
+			// TODO: Revise images and clip - VERY IMPORTANT
 
 			// Nicer looking lines, but may be too jerky while
@@ -331,8 +300,11 @@
 			}
 
+			
 			bg.setColor(backgroundColor);
+			// bg.setColor(Color.pink); // TODO: TEMP FOR DEBUGGING
+			
 			bg.fillRect(0, 0, _MaxSize.width, _MaxSize.height);
 
-			List<Item> paintItems = new LinkedList<Item>();
+			List<Item> visibleItems = new LinkedList<Item>();
 			List<InteractiveWidget> paintWidgets;
 
@@ -340,27 +312,67 @@
 				// Add all the items for this frame and any other from other
 				// frames
-				paintItems.addAll(toPaint.getAllItems());
-
+				visibleItems.addAll(toPaint.getAllItems());
 				paintWidgets = new LinkedList<InteractiveWidget>();
 				AddAllOverlayWidgets(paintWidgets, toPaint,
 						new LinkedList<Frame>());
 			} else {
-				paintItems.addAll(toPaint.getVisibleItems());
-				paintItems.addAll(toPaint.getVectorItems());
+				visibleItems.addAll(toPaint.getVisibleItems());
+				visibleItems.addAll(toPaint.getVectorItems());
 				paintWidgets = toPaint.getInteractiveWidgets();
 			}
 
 			// FIRST: Paint widgets swing gui (not expeditee gui) .
-			// Note that these are the ancored widgets
+			// Note that these are the anchored widgets
 			for (InteractiveWidget iw : paintWidgets) {
-				iw.paint(bg);
-			}
-
-			PaintPictures(bg, paintItems);
-			PaintLines(bg, paintItems);
-
+				if (clip == null || clip.intersects(iw.getComponant().getBounds()))
+					iw.paint(bg);
+			}
+			
+			// Filter out items that do not need to be painted
+			List<Item> paintItems;
+			HashSet<Item> fillOnlyItems = null; // only contains items that do not need drawing but fills might
+			
+			if (clip == null) {
+				paintItems = visibleItems;
+			} else {
+				fillOnlyItems = new HashSet<Item>();
+				paintItems = new LinkedList<Item>();
+				for (Item i : visibleItems) {
+					if (i.isInDrawingArea(clip)) {
+						paintItems.add(i);
+					} else if (i.isEnclosed()) {
+						// just add all fill items despite possibility of fills not being in clip
+						// because it will be faster than having to test twice for fills that do need
+						// repainting.
+						fillOnlyItems.add(i);
+					}
+				}
+			}
+			// Only paint files and lines once ... between anchored AND free items
+			HashSet<Item> paintedFillsAndLines = new HashSet<Item> ();
+			PaintPictures(bg, paintItems, fillOnlyItems, paintedFillsAndLines);
+			PaintLines(bg, visibleItems);
+
+			// Filter out free items that do not need to be painted
+			// This is efficient in cases with animation while free items exist
+			
+			List<Item> freeItemsToPaint = new LinkedList<Item>();
+			if (clip == null) {
+				freeItemsToPaint = FreeItems.getInstance();
+			} else {
+				freeItemsToPaint = new LinkedList<Item>();
+				fillOnlyItems.clear();
+				for (Item i : FreeItems.getInstance()) {
+					if (i.isInDrawingArea(clip)) {
+						freeItemsToPaint.add(i);
+					} else if (i.isEnclosed()) {
+						fillOnlyItems.add(i);
+					}
+				}
+			}
+			
 			if (isActualFrame /* && toPaint == DisplayIO.getCurrentFrame() */)
-				PaintPictures(bg, Frame.FreeItems);
-			// TODO if we can get transparency with FreeItems... then text can
+				PaintPictures(bg, freeItemsToPaint, fillOnlyItems, paintedFillsAndLines);
+			// TODO if we can get transparency with FreeItems.getInstance()... then text can
 			// be done before freeItems
 			PaintNonLinesNonPicture(bg, paintItems);
@@ -374,5 +386,5 @@
 			if (DisplayIO.isTwinFramesOn()) {
 				List<Item> lines = new LinkedList<Item>();
-				for (Item i : Frame.FreeItems) {
+				for (Item i : freeItemsToPaint) {
 					if (i instanceof Line) {
 						Line line = (Line) i;
@@ -411,9 +423,9 @@
 				// Dont paint the
 				if (isActualFrame)
-					PaintLines(bg, Frame.FreeItems);
+					PaintLines(bg, freeItemsToPaint);
 			}
 
 			if (isActualFrame /* && toPaint == DisplayIO.getCurrentFrame() */)
-				PaintNonLinesNonPicture(bg, Frame.FreeItems);
+				PaintNonLinesNonPicture(bg, freeItemsToPaint);
 
 			// BROOK: Ensure popups are repainted
@@ -465,16 +477,5 @@
 	}
 
-	private static void Paint(Image left, Image right, Color background) {
-		if (_MessageBuffer == null) {
-			GraphicsEnvironment ge = GraphicsEnvironment
-					.getLocalGraphicsEnvironment();
-			_MessageBuffer = ge.getDefaultScreenDevice()
-					.getDefaultConfiguration().createCompatibleVolatileImage(
-							_MaxSize.width,
-							(isAudienceMode() ? 0 : MESSAGE_BUFFER_HEIGHT));
-		}
-
-		paintMessage(_MessageBuffer.createGraphics(), background);
-		Graphics g = _DisplayGraphics.create();
+	private static void Paint(Graphics g, Image left, Image right, Color background) {
 
 		// if TwinFrames mode is on, then clipping etc has to be set
@@ -503,32 +504,5 @@
 				g.drawImage(right, 0, 0, Item.DEFAULT_BACKGROUND, null);
 		}
-		// Dont display the message area in audience mode
-		if (!isAudienceMode()) {
-			// draw the message area
-			g.drawImage(_MessageBuffer, 0, _MaxSize.height, null);
-		}
-		g.dispose();
-
-	}
-
-	/**
-	 * Paints the message area
-	 * 
-	 * @param g
-	 * @param background
-	 */
-	private static void paintMessage(Graphics2D g, Color background) {
-		((Graphics2D) g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
-				RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
-		g.setColor(background);
-		g.fillRect(0, 0, _MaxSize.width, MESSAGE_BUFFER_HEIGHT);
-		g.setFont(_MessageFont);
-		g.setColor(Color.BLACK);
-		g.drawLine(0, 0, _MaxSize.width, 0);
-		for (Item t : Messages)
-			PaintItem(g, t);
-		if (MessageLink.getLink() != null)
-			PaintItem(g, MessageLink);
-		g.dispose();
+
 	}
 
@@ -539,36 +513,4 @@
 		g.dispose();
 	}
-
-	/**
-	 * Called to refresh the display screen.
-	 * 
-	 */
-	public static void Repaint() {
-		Runtime.getRuntime();
-		if (_DisplayGraphics == null)
-			return;
-
-		if (UserSettings.Threading) {
-			if (painter == null) {
-				painter = new FrameGraphics().new Repainter();
-
-				painter.setDaemon(true);
-				painter.setPriority(Thread.MIN_PRIORITY);
-
-				painter.start();
-			} else
-				painter.run();
-		} else {
-			Frame[] toPaint = DisplayIO.getFrames();
-
-			if (toPaint != null) {
-				Image left = Paint(toPaint[0]);
-				Image right = Paint(toPaint[1]);
-				Paint(left, right, Item.DEFAULT_BACKGROUND);
-			}
-		}
-	}
-
-	private static Repainter painter = null;
 
 	private static void PaintNonLinesNonPicture(Graphics2D g, List<Item> toPaint) {
@@ -601,14 +543,14 @@
 	}
 
+
 	/**
 	 * Paint filled areas and their surrounding lines as well as pictures.
-	 * 
+	 * Note: floating widgets are painted as fills
 	 * @param g
 	 * @param toPaint
 	 */
-	private static void PaintPictures(Graphics2D g, List<Item> toPaint) {
-		// Use this set to keep track of the items that dont need to be
-		// repainted
-		Collection<Item> done = new HashSet<Item>();
+	private static void PaintPictures(Graphics2D g, List<Item> toPaint, 
+			HashSet<Item> fillOnlyItems, HashSet<Item> done) {
+		
 		List<Item> toFill = new LinkedList<Item>();
 		for (Item i : toPaint) {
@@ -634,4 +576,15 @@
 			}
 		}
+		
+		if (fillOnlyItems != null) {
+			for (Item i : fillOnlyItems) {
+				if (done.contains(i)) continue;
+				else if (!isAudienceMode() || !i.isConnectedToAnnotation()) {
+					toFill.add(i);
+				}
+				done.addAll(i.getAllConnected());
+			}
+		}
+		
 		// Sort the items to fill
 		Collections.sort(toFill, new Comparator<Item>() {
@@ -639,5 +592,9 @@
 				Double aArea = a.getEnclosedArea();
 				Double bArea = b.getEnclosedArea();
-				return aArea.compareTo(bArea) * -1;
+				int cmp = aArea.compareTo(bArea);
+				if (cmp == 0) {
+					return new Integer(a.getID()).compareTo(b.getID());
+				}
+				return cmp * -1;
 			}
 		});
@@ -715,7 +672,7 @@
 		// Mike: TODO comment on why the line below is used!!
 		// I forgot already!!Opps
-		boolean freeItem = Frame.FreeItems.contains(item);
+		boolean freeItem = FreeItems.getInstance().contains(item);
 		for (Item i : item.getAllConnected()) {
-			if (/* freeItem || */!Frame.FreeItems.contains(i)) {
+			if (/* freeItem || */!FreeItems.getInstance().contains(i)) {
 				i.setHighlightMode(connectedNewMode);
 			}
@@ -723,192 +680,4 @@
 		if (!freeItem && newMode != connectedNewMode)
 			item.setHighlightMode(newMode);
-		Repaint();
-	}
-
-	public static void OverwriteMessage(String message) {
-		for (int ind = Messages.length - 1; ind >= 0; ind--) {
-			if (Messages[ind] != null) {
-				Messages[ind].setText(getMessagePrefix(false) + message);
-				Repaint();
-				return;
-			}
-		}
-
-		// if we have not returned, then there are no messages yet
-		DisplayMessage(message, Color.darkGray);
-	}
-
-	/**
-	 * Displays the given message in the message area of the Frame, any previous
-	 * message is cleared from the screen.
-	 * 
-	 * @param message
-	 *            The message to display to the user in the message area
-	 */
-	public static void DisplayMessage(String message) {
-		DisplayMessageAlways(message);
-	}
-
-	public static void DisplayMessageOnce(String message) {
-		displayMessage(message, null, null, Color.BLACK, false);
-	}
-
-	public static void DisplayMessage(String message, Color textColor) {
-		displayMessage(message, null, null, textColor);
-		// Misc.Beep();
-	}
-
-	public static void DisplayMessage(Text message) {
-		displayMessage(message.getFirstLine(), message.getLink(), message
-				.getAction(), message.getColor());
-		// Misc.Beep();
-	}
-
-	public static void DisplayMessageAlways(String message) {
-		displayMessage(message, null, null, Color.BLACK);
-		// Misc.Beep();
-	}
-
-	public static void WarningMessage(String message) {
-		displayMessage(message, null, null, Color.MAGENTA);
-		// Misc.Beep();
-	}
-
-	private static String _lastMessage = null;
-
-	private static void displayMessage(String message, String link,
-			List<String> actions, Color color) {
-		displayMessage(message, link, actions, color, true);
-	}
-
-	private static void displayMessage(String message, String link,
-			List<String> actions, Color color, boolean displayAlways) {
-
-		System.out.println(message);
-		assert (message != null);
-
-		if (_SupressMessages)
-			return;
-
-		if (!displayAlways && message.equals(_lastMessage)) {
-			Misc.Beep();
-			return;
-		}
-		_lastMessage = message;
-
-		if (_creator == null) {
-			_creator = new FrameCreator(MESSAGES_FRAMESET_NAME, true);
-
-			// set up 'Messages' link on the right hand side
-			MessageLink.setPosition(_MaxSize.width - MESSAGE_LINK_Y_OFFSET,
-					MESSAGE_LINK_X);
-			MessageLink.setOffset(0, -_MaxSize.height);
-		}
-
-		// if the message slots have not all been used yet
-		if (_MessageCount <= Messages.length) {
-			int pos = 15;
-			// find the next empty slot, and create the new message
-			for (int i = 0; i < Messages.length; i++) {
-				if (Messages[i] == null) {
-					Messages[i] = new Text(getMessagePrefix(true) + message);
-					Messages[i].setPosition(20, pos);
-					Messages[i].setOffset(0, -_MaxSize.height);
-					Messages[i].setMaxSize(_MaxSize);
-					Messages[i].setColor(color);
-					Messages[i].setLink(link);
-					_creator.addItem(Messages[i].copy());
-					MessageLink.setLink(_creator.getCurrent());
-					Repaint();
-					return;
-				}
-
-				pos += 25;
-			}
-		}
-
-		// if we have not returned then all message slots are used
-		for (int i = 0; i < Messages.length - 1; i++) {
-			Messages[i].setText(Messages[i + 1].getFirstLine());
-			Messages[i].setColor(Messages[i + 1].getColor());
-			Messages[i].setLink(Messages[i + 1].getLink());
-		}
-
-		// show the new message
-		Text last = Messages[Messages.length - 1];
-		last.setColor(color);
-		// Make set the text for the new message
-		last.setText(getMessagePrefix(true) + message);
-		last.setLink(link);
-		last.setActions(actions);
-
-		_creator.addItem(last.copy());
-		// update the link to the latest message frame
-		MessageLink.setLink(_creator.getCurrent());
-		Repaint();
-	}
-
-	private static String getMessagePrefix(boolean incrementCounter) {
-		if (incrementCounter)
-			_MessageCount++;
-		return "@" + _MessageCount + ": ";
-	}
-
-	/**
-	 * Checks if the error message ends with a frame name after the
-	 * frameNameSeparator symbol
-	 * 
-	 * @param message
-	 *            the message to be displayed
-	 */
-	public static void LinkedErrorMessage(String message) {
-		if (_SupressMessages)
-			return;
-		Misc.Beep();
-		String[] tokens = message.split(Text.FRAME_NAME_SEPARATOR);
-		String link = null;
-		if (tokens.length > 1)
-			link = tokens[tokens.length - 1];
-		displayMessage(message, link, null, ERROR_COLOR);
-	}
-
-	public static void ErrorMessage(String message) {
-		if (_SupressMessages)
-			return;
-		Misc.Beep();
-		displayMessage(message, null, null, ERROR_COLOR);
-	}
-
-	private class Repainter extends Thread {
-		public boolean isPainting = false;
-
-		public void run() {
-			// TODO see if there is any other way to deal with this
-			if (_MaxSize.width <= 0 || _MaxSize.height <= 0) {
-				return;
-			}
-			isPainting = true;
-
-			Frame[] toPaint = DisplayIO.getFrames();
-
-			if (toPaint != null) {
-				Image left = Paint(toPaint[0]);
-				Image right = Paint(toPaint[1]);
-				Paint(left, right, Item.DEFAULT_BACKGROUND);
-			}
-			isPainting = false;
-		}
-	}
-
-	/**
-	 * Invalidates the buffered image of the current Frame and forces it to be
-	 * repainted on to the screen.
-	 */
-	public static void ForceRepaint() {
-		Frame current = DisplayIO.getCurrentFrame();
-
-		if (current == null)
-			return;
-
 		Repaint();
 	}
@@ -925,10 +694,6 @@
 			return;
 
-		Image vi = Paint(toUpdate, paintOverlays);
+		Image vi = Paint(toUpdate, null, paintOverlays);
 		toUpdate.setBuffer(vi);
-	}
-
-	public static void SupressMessages(boolean val) {
-		_SupressMessages = val;
 	}
 
@@ -939,4 +704,6 @@
 						Browser._theBrowser.getContentPane());
 
+				c.setIgnoreRepaint(true);
+				((JComponent)c).setDoubleBuffered(false);
 				g.translate(p.x, p.y);
 				c.paint(g);
@@ -952,3 +719,137 @@
 		return _Mode;
 	}
+
+	// Damaged areas pending to render. Accessessed by multiple threads
+	private static HashSet<Rectangle> damagedAreas = new HashSet<Rectangle>();
+	
+	/**
+	 * Checks that the item is visible (on current frame && overlays) - if visible
+	 * then damaged area will be re-rendered on the next refresh.
+	 * @param damagedItem
+	 * @param toRepaint
+	 */
+	public static void invalidateItem(Item damagedItem, Rectangle toRepaint) {
+		// Only add area to repaint if item is visible...
+		if (ItemUtils.isVisible(damagedItem)) {
+			synchronized(damagedAreas) {
+				damagedAreas.add(toRepaint);
+			}
+		} else if(MessageBay.isMessageItem(damagedItem)) {
+			MessageBay.addDirtyArea(toRepaint);
+		}
+	}
+	
+	/**
+	 * The given area will be re-rendered in the next refresh. This is the quicker version
+	 * and is more useful for re-rendering animated areas.
+	 * @param toRepaint
+	 */
+	public static void invalidateArea(Rectangle toRepaint) {
+		synchronized(damagedAreas) {
+			damagedAreas.add(toRepaint);
+		}
+	}
+	
+	public static void clearInvalidAreas() {
+		synchronized(damagedAreas) {
+			damagedAreas.clear();
+		}
+	}
+	
+	/**
+	 * Invalidates the buffered image of the current Frame and forces it to be
+	 * repainted on to the screen. Repaints all items. This is more expensive
+	 * than refresh.
+	 */
+	public static void ForceRepaint() {  // TODO: TEMP: Use refresh
+		Frame current = DisplayIO.getCurrentFrame();
+
+		if (current == null)
+			return;
+		refresh(false);
+	}
+	
+	public static void Repaint() { // TODO: TEMP: Use refresh
+		refresh(true);
+	}
+
+	/**
+	 * Called to refresh the display screen. Thread safe.
+	 */
+	public static void refresh(boolean useInvalidation) {
+		
+		if (_DisplayGraphics == null) return;
+
+		Area clip = null;
+		if (useInvalidation) { // build clip
+			
+			synchronized(damagedAreas) {
+				if (!damagedAreas.isEmpty()) {
+					
+					for (Rectangle r : damagedAreas) {
+						if (clip == null) clip = new Area(r);
+						clip.add(new Area(r));	
+					}
+					damagedAreas.clear();
+				} else return; // nothing to render
+			}
+		
+		} else {
+			synchronized(damagedAreas) {
+				damagedAreas.clear();
+			}
+			System.out.println("FULLSCREEN REFRESH"); // TODO: REMOVE
+		}
+
+		Frame[] toPaint = DisplayIO.getFrames();
+		Image left = Paint(toPaint[0], clip);
+		Image right = Paint(toPaint[1], clip); 
+		
+		Graphics dg = _DisplayGraphics.create();
+		
+		// Paint frame to window
+		Paint(dg, left, right, Item.DEFAULT_BACKGROUND);
+		
+		// Paint message bay
+		MessageBay.refresh(useInvalidation, dg, Item.DEFAULT_BACKGROUND);
+		
+		dg.dispose();
+	}
+	
+	/**
+	 * If wanting to refresh from another thread - other than the main thread that
+	 * handles the expeditee datamodel (modifying / accessing / rendering). Use
+	 * this method for thread safety.
+	 */
+	public static synchronized void requestRefresh(boolean useInvalidation) {
+		
+		_requestMarsheller._useInvalidation = useInvalidation;
+		
+		if (_requestMarsheller._isQueued) {
+			return;
+		}
+		
+		_requestMarsheller._isQueued = true;
+		EventQueue.invokeLater(_requestMarsheller); // Render on AWT thread
+	}
+	
+	private static RenderRequestMarsheller _requestMarsheller = new FrameGraphics().new RenderRequestMarsheller();
+	
+	/**
+	 * Used for marshelling render requests from foreign threads to the event dispatcher thread... (AWT)
+	 * @author Brook Novak
+	 */
+	private class RenderRequestMarsheller implements Runnable {
+
+		boolean _useInvalidation = true;
+		boolean _isQueued = false;
+		
+		public void run() {
+			refresh(_useInvalidation);
+			_isQueued = false;
+			_useInvalidation = true;
+		}
+
+	}
+	
 }
Index: /trunk/src/org/expeditee/gui/FrameIO.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameIO.java	(revision 120)
+++ /trunk/src/org/expeditee/gui/FrameIO.java	(revision 121)
@@ -116,8 +116,8 @@
 		// do not display errors encountered to the user
 		// (they will be shown at load time)
-		FrameGraphics.SupressMessages(true);
+		MessageBay.supressMessages(true);
 		// loading automatically caches the frame is caching is turned on
 		LoadUnknownPath(framename);
-		FrameGraphics.SupressMessages(false);
+		MessageBay.supressMessages(false);
 	}
 
@@ -255,5 +255,5 @@
 
 			if (frame == null) {
-				FrameGraphics.ErrorMessage("Error: " + frameName
+				MessageBay.errorMessage("Error: " + frameName
 						+ " could not be successfully loaded.");
 				return null;
@@ -276,5 +276,5 @@
 			e.printStackTrace();
 			Logger.Log(e);
-			FrameGraphics.ErrorMessage("Error: " + frameName
+			MessageBay.errorMessage("Error: " + frameName
 					+ " could not be successfully loaded.");
 		}
@@ -311,6 +311,6 @@
 		// if we did not find another Frame then this one must be the last one
 		// in the frameset
-		FrameGraphics
-				.DisplayMessageOnce("This is the first frame in the frameset");
+		MessageBay
+				.displayMessageOnce("This is the first frame in the frameset");
 		return null;
 	}
@@ -335,5 +335,5 @@
 			max = ReadINF(current.path, current.getFramesetName());
 		} catch (IOException ioe) {
-			FrameGraphics.ErrorMessage("Error loading INF file for frameset '"
+			MessageBay.errorMessage("Error loading INF file for frameset '"
 					+ name + "'");
 			return null;
@@ -349,6 +349,6 @@
 		// if we did not find another Frame then this one must be the last one
 		// in the frameset
-		FrameGraphics
-				.DisplayMessageOnce("This is the last frame in the frameset");
+		MessageBay
+				.displayMessageOnce("This is the last frame in the frameset");
 		return null;
 	}
@@ -375,5 +375,5 @@
 			max = ReadINF(path, framesetName);
 		} catch (IOException ioe) {
-			FrameGraphics.ErrorMessage("Error loading INF file for frameset '"
+			MessageBay.errorMessage("Error loading INF file for frameset '"
 					+ framesetName + "'");
 			return null;
@@ -389,5 +389,5 @@
 		// if we did not find another Frame then this one must be the last one
 		// in the frameset
-		FrameGraphics.DisplayMessage("This is the last frame in the frameset");
+		MessageBay.displayMessage("This is the last frame in the frameset");
 		return null;
 	}
@@ -701,5 +701,5 @@
 			if (savedVersion > toSave.getVersion()
 					&& !toSave.getFramesetName().equalsIgnoreCase(
-							FrameGraphics.MESSAGES_FRAMESET_NAME)) {
+							MessageBay.MESSAGES_FRAMESET_NAME)) {
 				// remove this frame from the cache if it is there
 				// This will make sure links to the original are set correctly
@@ -714,15 +714,15 @@
 				// Show the messages alerting the user
 				Text originalMessage = new Text(-1);
-				originalMessage.setColor(FrameGraphics.ERROR_COLOR);
+				originalMessage.setColor(MessageBay.ERROR_COLOR);
 				originalMessage.setText(original.getName()
 						+ " was updated by another user.");
 				originalMessage.setLink(original.getName());
 				Text yourMessage = new Text(-1);
-				yourMessage.setColor(FrameGraphics.ERROR_COLOR);
+				yourMessage.setColor(MessageBay.ERROR_COLOR);
 				yourMessage.setText("Your version was renamed "
 						+ toSave.getName());
 				yourMessage.setLink(toSave.getName());
-				FrameGraphics.DisplayMessage(originalMessage);
-				FrameGraphics.DisplayMessage(yourMessage);
+				MessageBay.displayMessage(originalMessage);
+				MessageBay.displayMessage(yourMessage);
 			} else if (checkBackup
 					&& ItemUtils.ContainsExactTag(toSave.getItems(),
Index: /trunk/src/org/expeditee/gui/FrameKeyboardActions.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameKeyboardActions.java	(revision 120)
+++ /trunk/src/org/expeditee/gui/FrameKeyboardActions.java	(revision 121)
@@ -82,6 +82,6 @@
 		// permission check
 		if (on != null && !on.hasPermission(Permission.full)) {
-			FrameGraphics
-					.DisplayMessage("Insufficient permission to edit this item");
+			MessageBay
+					.displayMessage("Insufficient permission to edit this item");
 			return;
 		}
@@ -577,5 +577,5 @@
 							&& clicked.getParent() != null
 							&& clicked.getParent().getNameItem() != clicked) {
-						FrameGraphics.DisplayMessage("Insufficient Permission");
+						MessageBay.displayMessage("Insufficient Permission");
 						return;
 					}
@@ -621,15 +621,15 @@
 			if (current instanceof Text) {
 				if (current != null && !current.hasPermission(Permission.copy)) {
-					FrameGraphics
-							.DisplayMessage("Insufficient permission to copy that item");
+					MessageBay
+							.displayMessage("Insufficient permission to copy that item");
 					return;
 				}
 				copyItemToClipboard(current);
-				// FrameGraphics.DisplayMessage("Item copied to clipboard");
+				// MessageBay.displayMessage("Item copied to clipboard");
 				return;
 			}
 			if (current != null && !current.hasPermission(Permission.full)) {
-				FrameGraphics
-						.DisplayMessage("Insufficient permission edit that item");
+				MessageBay
+						.displayMessage("Insufficient permission edit that item");
 				return;
 			}
@@ -656,6 +656,6 @@
 				return;
 			if (current != null && !current.hasPermission(Permission.full)) {
-				FrameGraphics
-						.DisplayMessage("Insufficient permission to cut that item");
+				MessageBay
+						.displayMessage("Insufficient permission to cut that item");
 				return;
 			}
@@ -667,6 +667,6 @@
 				return;
 			if (current != null && !current.hasPermission(Permission.full)) {
-				FrameGraphics
-						.DisplayMessage("Insufficient permission toggle the items mark");
+				MessageBay
+						.displayMessage("Insufficient permission toggle the items mark");
 				return;
 			}
@@ -742,6 +742,6 @@
 
 		if (item != null && !item.hasPermission(Permission.full)) {
-			FrameGraphics
-					.DisplayMessage("Insufficient permission to copy that item");
+			MessageBay
+					.displayMessage("Insufficient permission to copy that item");
 			return null;
 		}
@@ -840,5 +840,5 @@
 				break;
 			default:
-				FrameGraphics.DisplayMessageOnce(displayMessage);
+				MessageBay.displayMessageOnce(displayMessage);
 				return;
 			}
@@ -892,5 +892,5 @@
 		Collection<Item> enclosed = FrameUtils.getCurrentItems(on);
 		if (on == null && (enclosed == null || enclosed.size() == 0))
-			FrameGraphics.DisplayMessage(displayMessage);
+			MessageBay.displayMessage(displayMessage);
 	}
 
@@ -932,12 +932,11 @@
 			// if no item was found, return
 			if (toDropFrom == null) {
-				FrameGraphics
-						.ErrorMessage("No item could be found to drop from");
+				MessageBay.errorMessage("No item could be found to drop from");
 				return;
 			}
 
 			if (!(toDropFrom instanceof Text)) {
-				FrameGraphics
-						.DisplayMessage("Only text items can be dropped from");
+				MessageBay
+						.displayMessage("Only text items can be dropped from");
 				return;
 			}
@@ -948,5 +947,5 @@
 
 			if (column == null) {
-				FrameGraphics.ErrorMessage("No column found to align items to");
+				MessageBay.errorMessage("No column found to align items to");
 				return;
 			}
@@ -1025,6 +1024,6 @@
 								FrameMouseActions.getY());
 					} else {
-						FrameGraphics
-								.WarningMessage("Can not create items outside the frame area");
+						MessageBay
+								.warningMessage("Can not create items outside the frame area");
 						// ensures correct repainting when items don't move
 						DisplayIO.setCursorPosition(DisplayIO.getMouseX(),
@@ -1045,5 +1044,5 @@
 					int deltaY = firstItem.getY() - dummyItem.getY();
 
-					for (Item i : Frame.FreeItems) {
+					for (Item i : FreeItems.getInstance()) {
 						i.setPosition(i.getX() - deltaX, i.getY() - deltaY);
 					}
@@ -1057,5 +1056,5 @@
 			FrameGraphics.Repaint();
 		} catch (RuntimeException e) {
-			// FrameGraphics.ErrorMessage(e.getMessage());
+			// MessageBay.errorMessage(e.getMessage());
 			e.printStackTrace();
 		}
@@ -1237,19 +1236,19 @@
 		if (item == null) {
 			if (Frame.itemAttachedToCursor())
-				toSize.addAll(Frame.FreeItems);
+				toSize.addAll(FreeItems.getInstance());
 			else {
-				FrameGraphics
-						.DisplayMessage("There are no Items selected on the Frame or on the Cursor");
+				MessageBay
+						.displayMessage("There are no Items selected on the Frame or on the Cursor");
 				return;
 			}
 		} else {
 			if (item.isFrameName()) {
-				FrameGraphics.DisplayMessage("Can not resize the frame name");
+				MessageBay.displayMessage("Can not resize the frame name");
 				return;
 			}
 			// check permissions
 			if (!item.hasPermission(Permission.full)) {
-				FrameGraphics
-						.DisplayMessage("Insufficient permission to change the size of that item");
+				MessageBay
+						.displayMessage("Insufficient permission to change the size of that item");
 				return;
 			}
@@ -1362,5 +1361,5 @@
 
 		// if (color == null) {
-		// FrameGraphics.DisplayMessage("FillColor is now transparent");
+		// MessageBay.displayMessage("FillColor is now transparent");
 		// }
 
@@ -1385,5 +1384,5 @@
 		if (item == null) {
 			if (Frame.itemAttachedToCursor()) {
-				color = Frame.FreeItems.get(0).getColor();
+				color = FreeItems.getInstance().get(0).getColor();
 			} else {
 				return;
@@ -1394,6 +1393,6 @@
 			// check permissions
 			if (!item.hasPermission(Permission.full)) {
-				FrameGraphics
-						.DisplayMessage("Insufficient permission to the frame's background color");
+				MessageBay
+						.displayMessage("Insufficient permission to the frame's background color");
 				return;
 			}
@@ -1405,5 +1404,5 @@
 			// if (currentFrame.getBackgroundColor() == null)
 			// FrameGraphics
-			// .DisplayMessage("Background color is now transparent");
+			// .displayMessage("Background color is now transparent");
 			FrameGraphics.Repaint();
 			return;
@@ -1411,6 +1410,6 @@
 			// check permissions
 			if (!item.hasPermission(Permission.full)) {
-				FrameGraphics
-						.DisplayMessage("Insufficient permission to change that item's color");
+				MessageBay
+						.displayMessage("Insufficient permission to change that item's color");
 				return;
 			}
@@ -1439,10 +1438,10 @@
 		// if color is being set to default display a message to indicate that
 		// if (color == null) {
-		// FrameGraphics.DisplayMessage("Color is set to default");
+		// MessageBay.displayMessage("Color is set to default");
 		// }
 
 		if (setBackgroundColor) {
 			if (item == null && Frame.itemAttachedToCursor()) {
-				for (Item i : Frame.FreeItems)
+				for (Item i : FreeItems.getInstance())
 					i.setBackgroundColor(color);
 			} else {
@@ -1452,5 +1451,5 @@
 		} else {
 			if (item == null && Frame.itemAttachedToCursor()) {
-				for (Item i : Frame.FreeItems)
+				for (Item i : FreeItems.getInstance())
 					i.setColor(color);
 			} else {
@@ -1470,5 +1469,5 @@
 	private static void ToggleAnnotation(Item toToggle) {
 		if (toToggle == null) {
-			FrameGraphics.DisplayMessage("There is no Item selected to toggle");
+			MessageBay.displayMessage("There is no Item selected to toggle");
 			return;
 		}
@@ -1476,6 +1475,6 @@
 		// check permissions
 		if (!toToggle.hasPermission(Permission.full)) {
-			FrameGraphics
-					.DisplayMessage("Insufficient permission to toggle that item's annotation");
+			MessageBay
+					.displayMessage("Insufficient permission to toggle that item's annotation");
 			return;
 		}
@@ -1494,5 +1493,5 @@
 	private static void ToggleFontStyle(Item toToggle) {
 		if (toToggle == null) {
-			FrameGraphics.DisplayMessage("There is no Item selected to toggle");
+			MessageBay.displayMessage("There is no Item selected to toggle");
 			return;
 		}
@@ -1500,6 +1499,6 @@
 		// check permissions
 		if (!toToggle.hasPermission(Permission.full)) {
-			FrameGraphics
-					.DisplayMessage("Insufficient permission to toggle that item's annotation");
+			MessageBay
+					.displayMessage("Insufficient permission to toggle that item's annotation");
 			return;
 		}
@@ -1522,5 +1521,5 @@
 	private static void ToggleFontFamily(Item toToggle) {
 		if (toToggle == null) {
-			FrameGraphics.DisplayMessage("There is no Item selected to toggle");
+			MessageBay.displayMessage("There is no Item selected to toggle");
 			return;
 		}
@@ -1528,6 +1527,5 @@
 		// check permissions
 		if (!toToggle.hasPermission(Permission.full)) {
-			FrameGraphics
-					.DisplayMessage("Insufficient permission to toggle that item's annotation");
+			MessageBay.displayMessage("Insufficient permission to toggle that item's annotation");
 			return;
 		}
@@ -1565,6 +1563,6 @@
 				// permission check
 				if (!toAdd.hasPermission(Permission.full)) {
-					FrameGraphics
-							.DisplayMessage("Insufficicent permission to add the date to that item");
+					MessageBay
+							.displayMessage("Insufficicent permission to add the date to that item");
 					return;
 				}
@@ -1617,6 +1615,6 @@
 				FrameGraphics.Repaint();
 			} else {
-				FrameGraphics
-						.DisplayMessage("Only text items can have the date prepended to them");
+				MessageBay
+						.displayMessage("Only text items can have the date prepended to them");
 			}
 			// otherwise, create a new text item
@@ -1640,12 +1638,12 @@
 	private static void CreateFrameset(Item item) {
 		if (item == null) {
-			FrameGraphics
-					.DisplayMessage("There is no selected item to use for the frameset name");
+			MessageBay
+					.displayMessage("There is no selected item to use for the frameset name");
 			return;
 		}
 
 		if (!(item instanceof Text)) {
-			FrameGraphics
-					.DisplayMessage("Framesets can only be created from text items");
+			MessageBay
+					.displayMessage("Framesets can only be created from text items");
 			return;
 		}
@@ -1653,6 +1651,6 @@
 		// dont create frameset if the item is linked
 		if (item.getLink() != null) {
-			FrameGraphics
-					.DisplayMessage("A frameset can not be created from a linked item");
+			MessageBay
+					.displayMessage("A frameset can not be created from a linked item");
 			return;
 		}
@@ -1660,6 +1658,6 @@
 		// check permissions
 		if (!item.hasPermission(Permission.full)) {
-			FrameGraphics
-					.DisplayMessage("Insufficient permission to create a frameset from this item");
+			MessageBay
+					.displayMessage("Insufficient permission to create a frameset from this item");
 			return;
 		}
@@ -1678,5 +1676,5 @@
 			DisplayIO.setCursor(Item.DEFAULT_CURSOR);
 		} catch (Exception e) {
-			FrameGraphics.ErrorMessage(e.getMessage());
+			MessageBay.errorMessage(e.getMessage());
 		}
 	}
@@ -1695,4 +1693,5 @@
 					+ "1");
 			assert (profile != null);
+			FrameUtils.Parse(currentFrame);
 			FrameUtils.ParseProfile(profile);
 		} else {
Index: /trunk/src/org/expeditee/gui/FrameMouseActions.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameMouseActions.java	(revision 120)
+++ /trunk/src/org/expeditee/gui/FrameMouseActions.java	(revision 121)
@@ -165,5 +165,5 @@
 				public void actionPerformed(ActionEvent ae) {
 					// check if we are in free space
-					if (_lastClickedOn == null && Frame.FreeItems.size() == 0) {
+					if (_lastClickedOn == null && FreeItems.getInstance().size() == 0) {
 						// System.out.println("SuperBack!");
 						_MouseTimer.setDelay(ZERO_MOUSE_PAUSE);
@@ -172,6 +172,6 @@
 						if (FrameUtils.getCurrentItem() == null) {
 							// Check if we are toggling arrowhead
-							if (Frame.FreeItems.size() <= 2) {
-								for (Item i : Frame.FreeItems) {
+							if (FreeItems.getInstance().size() <= 2) {
+								for (Item i : FreeItems.getInstance()) {
 									if (i instanceof Line) {
 										((Line) i).toggleArrow();
@@ -273,10 +273,10 @@
 		// the other
 		// Long depress actions if that is what is wanted.
-		if (_lastClickedOn == null && Frame.FreeItems.size() == 0) {
+		if (_lastClickedOn == null && FreeItems.getInstance().size() == 0) {
 			// System.out.println(e.getClickCount());
 			if (e.getClickCount() >= 2) {
 				_MouseTimer.start();
 			}
-		} else if (_lastClickedOn != null && Frame.FreeItems.size() == 0
+		} else if (_lastClickedOn != null && FreeItems.getInstance().size() == 0
 				&& e.getButton() == MouseEvent.BUTTON3) {
 			_ExtrudeMouseTimer.start();
@@ -318,5 +318,5 @@
 
 			_lastHighlightedItem = Frame.getItemAttachedToCursor();
-			for (Item i : Frame.FreeItems) {
+			for (Item i : FreeItems.getInstance()) {
 				i.setHighlightColor(Item.DEPRESSED_HIGHLIGHT);
 			}
@@ -438,9 +438,9 @@
 
 			if (Frame.itemAttachedToCursor()) {
-				move(Frame.FreeItems);
-			}
-
-			FrameGraphics
-					.DisplayMessage("Action cancelled, mouse moved more than "
+				move(FreeItems.getInstance());
+			}
+
+			MessageBay
+					.displayMessage("Action cancelled, mouse moved more than "
 							+ UserSettings.NoOpThreshold + " pixels.");
 			FrameGraphics.Repaint();
@@ -456,5 +456,5 @@
 				if (i != null && i instanceof Text) {
 					lastRanged.replaceSelectedText(((Text) i).getText());
-					Frame.FreeItems.clear();
+					FreeItems.getInstance().clear();
 				} else
 					lastRanged.cutSelectedText();
@@ -504,6 +504,6 @@
 				if (!lastRanged.hasPermission(Permission.full)
 						|| lastRanged.isFrameName()) {
-					FrameGraphics
-							.DisplayMessage("Insufficient permission to cut text");
+					MessageBay
+							.displayMessage("Insufficient permission to cut text");
 					lastRanged.clearSelection();
 					FrameGraphics.Repaint();
@@ -524,6 +524,6 @@
 				// do not have permission to do so... or it is the frame name
 				if (!lastRanged.hasPermission(Permission.copy)) {
-					FrameGraphics
-							.DisplayMessage("Insufficient permission to copy text");
+					MessageBay
+							.displayMessage("Insufficient permission to copy text");
 					lastRanged.clearSelection();
 					FrameGraphics.Repaint();
@@ -628,6 +628,6 @@
 			// check item permissions
 			if (!clicked.hasPermission(Permission.followLinks)) {
-				FrameGraphics
-						.DisplayMessage("Insufficient permissions to perform action on item");
+				MessageBay
+						.displayMessage("Insufficient permissions to perform action on item");
 				return;
 			}
@@ -658,6 +658,6 @@
 				// check for TDFC permission
 				if (!clicked.hasPermission(Permission.createFrames)) {
-					FrameGraphics
-							.DisplayMessage("Insufficient permission to TDFC from that item");
+					MessageBay
+							.displayMessage("Insufficient permission to TDFC from that item");
 					return;
 				}
@@ -675,5 +675,5 @@
 					tdfc(clickedOn);
 				} catch (RuntimeException e) {
-					FrameGraphics.ErrorMessage(e.getMessage());
+					MessageBay.errorMessage(e.getMessage());
 				}
 				return;
@@ -698,5 +698,5 @@
 			return false;
 
-		// System.out.println(Frame.FreeItems.size());
+		// System.out.println(FreeItems.getInstance().size());
 		if (isRubberBandingCorner()) {
 			if (clicked.isLineEnd()
@@ -707,5 +707,5 @@
 		}
 
-		if (Frame.FreeItems.size() > 2)
+		if (FreeItems.getInstance().size() > 2)
 			return false;
 
@@ -734,13 +734,13 @@
 						&& clicked.getParent() != null
 						&& clicked.getParent().getNameItem() != clicked) {
-					FrameGraphics.DisplayMessage("Insufficient permission");
+					MessageBay.displayMessage("Insufficient permission");
 					return;
 				}
 
-				Item merger = Frame.FreeItems.get(0);
+				Item merger = FreeItems.getInstance().get(0);
 				assert (merger != null);
-				Collection<Item> left = merge(Frame.FreeItems, clicked);
+				Collection<Item> left = merge(FreeItems.getInstance(), clicked);
 				anchor(left);
-				Frame.FreeItems.clear();
+				FreeItems.getInstance().clear();
 				FrameGraphics.Repaint();
 				updateCursor();
@@ -750,6 +750,6 @@
 				// if a line is being rubber-banded, check for auto
 				// straightening
-				anchor(Frame.FreeItems);
-				Frame.FreeItems.clear();
+				anchor(FreeItems.getInstance());
+				FreeItems.getInstance().clear();
 				updateCursor();
 				_offX = _offY = 0;
@@ -760,6 +760,6 @@
 			// check permissions
 			if (!clicked.hasPermission(Permission.full)) {
-				FrameGraphics
-						.DisplayMessage("Insufficient permission to pick up item");
+				MessageBay
+						.displayMessage("Insufficient permission to pick up item");
 				return;
 			}
@@ -885,9 +885,9 @@
 			return;
 		}
-		SessionStats.MovedItems(Frame.FreeItems);
+		SessionStats.MovedItems(FreeItems.getInstance());
 	}
 
 	private static Item getFirstFreeLineEnd() {
-		for (Item i : Frame.FreeItems)
+		for (Item i : FreeItems.getInstance())
 			if (i.isLineEnd())
 				return i;
@@ -896,5 +896,5 @@
 
 	private static boolean isRubberBandingCorner() {
-		return getShapeCorner(Frame.FreeItems) != null;
+		return getShapeCorner(FreeItems.getInstance()) != null;
 	}
 
@@ -949,6 +949,6 @@
 				if (!clicked.hasPermission(Permission.full)
 						&& clicked.getParent().getNameItem() != clicked) {
-					FrameGraphics
-							.DisplayMessage("Insufficient permission to merge items");
+					MessageBay
+							.displayMessage("Insufficient permission to merge items");
 					return;
 				}
@@ -988,21 +988,21 @@
 						copies = copy(toCopy);
 						// Now do the merging
-						Collection<Item> remain = merge(Frame.FreeItems,
+						Collection<Item> remain = merge(FreeItems.getInstance(),
 								clicked);
 						// anchor the points
 						anchor(remain);
-						Frame.FreeItems.clear();
+						FreeItems.getInstance().clear();
 						pickup(copies);
 						// line onto something
-					} else if (Frame.FreeItems.size() == 2
+					} else if (FreeItems.getInstance().size() == 2
 					/* && clicked instanceof XRayable */) {
-						copies = ItemUtils.UnreelLine(Frame.FreeItems,
+						copies = ItemUtils.UnreelLine(FreeItems.getInstance(),
 								_controlDown);
-						Collection<Item> leftOver = merge(Frame.FreeItems,
+						Collection<Item> leftOver = merge(FreeItems.getInstance(),
 								clicked);
 						anchor(leftOver);
 						if (copies == null)
-							copies = copy(Frame.FreeItems);
-						Frame.FreeItems.clear();
+							copies = copy(FreeItems.getInstance());
+						FreeItems.getInstance().clear();
 						for (Item i : copies)
 							i.setOffset(0, 0);
@@ -1011,6 +1011,6 @@
 						pickup(copies);
 						// point onto point
-					} else if (Frame.FreeItems.size() == 1) {
-						copies = copy(Frame.FreeItems);
+					} else if (FreeItems.getInstance().size() == 1) {
+						copies = copy(FreeItems.getInstance());
 						Collection<Item> remain = merge(copies, clicked);
 
@@ -1019,16 +1019,16 @@
 					} else {
 						stampItemsOnCursor();
-						copies = Frame.FreeItems;
+						copies = FreeItems.getInstance();
 					}
 				} else {
 					copies = ItemUtils
-							.UnreelLine(Frame.FreeItems, _controlDown);
+							.UnreelLine(FreeItems.getInstance(), _controlDown);
 					if (copies == null)
-						copies = copy(Frame.FreeItems);
+						copies = copy(FreeItems.getInstance());
 					for (Item i : copies) {
 						i.setOffset(0, 0);
 					}
-					anchor(Frame.FreeItems);
-					Frame.FreeItems.clear();
+					anchor(FreeItems.getInstance());
+					FreeItems.getInstance().clear();
 					pickup(copies);
 				}
@@ -1039,6 +1039,6 @@
 					Item d = getFirstFreeLineEnd();
 					// anchor the points
-					anchor(Frame.FreeItems);
-					Frame.FreeItems.clear();
+					anchor(FreeItems.getInstance());
+					FreeItems.getInstance().clear();
 					updateCursor();
 					// pick up a copy of all enclosed items
@@ -1083,5 +1083,5 @@
 					if (rubberBanding()) {
 						if (clicked != null) {
-							Collection<Item> leftOver = merge(Frame.FreeItems,
+							Collection<Item> leftOver = merge(FreeItems.getInstance(),
 									clicked);
 							anchor(leftOver);
@@ -1089,10 +1089,10 @@
 						// This is executed when the user is putting down a line
 						// endpoint and unreeling. ie. Normal unreeling
-						copies = ItemUtils.UnreelLine(Frame.FreeItems,
+						copies = ItemUtils.UnreelLine(FreeItems.getInstance(),
 								_controlDown);
 
 						if (copies == null)
-							copies = copy(Frame.FreeItems);
-						anchor(Frame.FreeItems);
+							copies = copy(FreeItems.getInstance());
+						anchor(FreeItems.getInstance());
 						for (Item i : copies)
 							i.setOffset(0, 0);
@@ -1104,5 +1104,5 @@
 						// remove any lines that dont have both endpoints
 						// floating
-						for (Item i : Frame.FreeItems) {
+						for (Item i : FreeItems.getInstance()) {
 							if (i.isFloating())
 								originals.add(i);
@@ -1112,5 +1112,5 @@
 						for (Item i : copies)
 							i.setOffset(0, 0);
-						anchor(Frame.FreeItems);
+						anchor(FreeItems.getInstance());
 						// Move isnt working right for extruding!!
 						// move(copies);
@@ -1118,5 +1118,5 @@
 					} else {
 						stampItemsOnCursor();
-						copies = Frame.FreeItems;
+						copies = FreeItems.getInstance();
 					}
 				}
@@ -1127,6 +1127,6 @@
 				// check permissions
 				if (!clicked.hasPermission(Permission.copy)) {
-					FrameGraphics
-							.DisplayMessage("Insufficient permission to copy item");
+					MessageBay
+							.displayMessage("Insufficient permission to copy item");
 					return;
 				}
@@ -1164,6 +1164,6 @@
 					Collection<Item> enclosed = getFullyEnclosedItems(clickedIn);
 					if (enclosed.size() == 0) {
-						FrameGraphics
-								.DisplayMessage("Insufficient permission to copy items");
+						MessageBay
+								.displayMessage("Insufficient permission to copy items");
 					} else {
 						copies = copy(enclosed);
@@ -1202,5 +1202,5 @@
 						merge(toMerge, on);
 						// anchor(left);
-						// Frame.FreeItems.clear();
+						// FreeItems.getInstance().clear();
 						FrameGraphics.Repaint();
 						updateCursor();
@@ -1251,5 +1251,5 @@
 	 */
 	private static void stampItemsOnCursor() {
-		List<Item> copies = copy(Frame.FreeItems);
+		List<Item> copies = copy(FreeItems.getInstance());
 		// MIKE: what does the below 2 lines do?
 		for (Item i : copies)
@@ -1257,5 +1257,5 @@
 		// The below code has a little problem withflicker when stamp
 		// and dragging
-		move(Frame.FreeItems);
+		move(FreeItems.getInstance());
 		for (Item i : copies) {
 			i.setHighlightMode(HighlightMode.None);
@@ -1379,5 +1379,5 @@
 					e.getY());
 
-			if (Frame.FreeItems.size() == 0) {
+			if (FreeItems.getInstance().size() == 0) {
 				// if the user can spot-weld, show the virtual spot
 				if (on instanceof Line) {
@@ -1454,5 +1454,5 @@
 			// Wait until the last Robot mouse move event arrives before
 			// processing other events
-			if (/* Frame.FreeItems.size() == 0 || */
+			if (/* FreeItems.getInstance().size() == 0 || */
 			(LastRobotX == e.getX() && LastRobotY == e.getY())) {
 				LastRobotX = null;
@@ -1460,5 +1460,5 @@
 				_RobotTimer.stop();
 			} else {
-				// System.out.println("Ignored: " + Frame.FreeItems.size());
+				// System.out.println("Ignored: " + FreeItems.getInstance().size());
 				return;
 			}
@@ -1477,14 +1477,14 @@
 
 		// If shift is down then the movement is constrained
-		if (_controlDown && Frame.FreeItems.size() > 0) {
+		if (_controlDown && FreeItems.getInstance().size() > 0) {
 			// Check if we are rubber banding a line
 			if (shiftStateChanged && rubberBanding()) {
 				// Get the line end that is being rubber banded
-				Item thisEnd = Frame.FreeItems.get(0).isLineEnd() ? Frame.FreeItems
+				Item thisEnd = FreeItems.getInstance().get(0).isLineEnd() ? FreeItems.getInstance()
 						.get(0)
-						: Frame.FreeItems.get(1);
-				Line line = (Line) (Frame.FreeItems.get(0).isLineEnd() ? Frame.FreeItems
+						: FreeItems.getInstance().get(1);
+				Line line = (Line) (FreeItems.getInstance().get(0).isLineEnd() ? FreeItems.getInstance()
 						.get(1)
-						: Frame.FreeItems.get(0));
+						: FreeItems.getInstance().get(0));
 				Item otherEnd = line.getOppositeEnd(thisEnd);
 				int deltaX = Math.abs(e.getX() - otherEnd.getX());
@@ -1533,7 +1533,7 @@
 			}// If its a lineend attached to two lines lengthen the shorter
 			// so it is the same length as the longer line
-			else if (Frame.FreeItems.size() == 3) {
+			else if (FreeItems.getInstance().size() == 3) {
 				// check if we are rubber banding the corner of a shape
-				Item thisEnd = getShapeCorner(Frame.FreeItems);
+				Item thisEnd = getShapeCorner(FreeItems.getInstance());
 				if (thisEnd != null) {
 					Line line1 = thisEnd.getLines().get(0);
@@ -1614,6 +1614,6 @@
 		} else if (shiftStateChanged && !_controlDown && rubberBanding()) {
 			// Get the line end that is being rubber banded
-			Item thisEnd = Frame.FreeItems.get(0).isLineEnd() ? Frame.FreeItems
-					.get(0) : Frame.FreeItems.get(1);
+			Item thisEnd = FreeItems.getInstance().get(0).isLineEnd() ? FreeItems.getInstance()
+					.get(0) : FreeItems.getInstance().get(1);
 			thisEnd.removeAllConstraints();
 		}
@@ -1627,6 +1627,6 @@
 
 		if (Frame.itemAttachedToCursor()) {
-			move(Frame.FreeItems);
-			// System.out.println(Frame.FreeItems.size());
+			move(FreeItems.getInstance());
+			// System.out.println(FreeItems.getInstance().size());
 		}
 
@@ -1652,5 +1652,5 @@
 				_context = CONTEXT_AT_TEXT;
 			}
-			if (Frame.FreeItems.size() > 0)
+			if (FreeItems.getInstance().size() > 0)
 				_alpha = 60;
 			else
@@ -1662,10 +1662,10 @@
 
 		// if the user is pointing at an item, highlight it
-		if (on != null && !Frame.FreeItems.contains(on)) {
+		if (on != null && !FreeItems.getInstance().contains(on)) {
 			// if the user can spot-weld, show the virtual spot
-			if (Frame.FreeItems.size() == 2 && on instanceof Line) {
+			if (FreeItems.getInstance().size() == 2 && on instanceof Line) {
 				Line line = (Line) on;
-				Item freeItem0 = Frame.FreeItems.get(0);
-				Item freeItem1 = Frame.FreeItems.get(1);
+				Item freeItem0 = FreeItems.getInstance().get(0);
+				Item freeItem1 = FreeItems.getInstance().get(1);
 				Item lineEnd = freeItem0.isLineEnd() ? freeItem0 : (freeItem1
 						.isLineEnd() ? freeItem1 : null);
@@ -1702,5 +1702,5 @@
 				// check that the enclosure is not part of a point being
 						// dragged in space
-						!ContainsOneOf(enclosure, Frame.FreeItems)) {
+						!ContainsOneOf(enclosure, FreeItems.getInstance())) {
 					on = firstLineEnd.getLines().get(0);
 					// System.out.println(on == null ? "Null" :
@@ -1760,5 +1760,5 @@
 	 */
 	private static boolean rubberBanding() {
-		if (Frame.FreeItems.size() != 2) {
+		if (FreeItems.getInstance().size() != 2) {
 			return false;
 		}
@@ -1766,5 +1766,5 @@
 		// if rubber-banding, there will be 1 lineend and the rest will be lines
 		boolean foundLineEnd = false;
-		for (Item i : Frame.FreeItems) {
+		for (Item i : FreeItems.getInstance()) {
 			if (i.isLineEnd()) {
 				if (foundLineEnd) {
@@ -1803,8 +1803,8 @@
 	public static void resetOffset() {
 		if (Frame.itemAttachedToCursor()) {
-			_offX = DisplayIO.getMouseX() - Frame.FreeItems.get(0).getX()
-					+ Frame.FreeItems.get(0).getOffset().x;
-			_offY = getY() - Frame.FreeItems.get(0).getY()
-					+ Frame.FreeItems.get(0).getOffset().y;
+			_offX = DisplayIO.getMouseX() - FreeItems.getInstance().get(0).getX()
+					+ FreeItems.getInstance().get(0).getOffset().x;
+			_offY = getY() - FreeItems.getInstance().get(0).getY()
+					+ FreeItems.getInstance().get(0).getOffset().y;
 		}
 	}
@@ -1835,5 +1835,5 @@
 			FrameUtils.DisplayFrame(toLoad);
 		} else {
-			FrameGraphics.ErrorMessage(toLoad + " is not a valid frame name.");
+			MessageBay.errorMessage(toLoad + " is not a valid frame name.");
 		}
 	}
@@ -1844,5 +1844,5 @@
 		// repaint things if necessary
 		if (Frame.itemAttachedToCursor())
-			move(Frame.FreeItems);
+			move(FreeItems.getInstance());
 	}
 
@@ -1921,6 +1921,6 @@
 
 		if (attribs == null)
-			FrameGraphics
-					.DisplayMessage("All attributes of that item are default values.");
+			MessageBay
+					.displayMessage("All attributes of that item are default values.");
 		else {
 			// Give the attribute text item the color of the item for which
@@ -1946,16 +1946,16 @@
 		if (Frame.itemAttachedToCursor()) {
 			// if this is an item-swap
-			if (Frame.FreeItems.size() == 1
-					&& Frame.FreeItems.get(0) instanceof Text
+			if (FreeItems.getInstance().size() == 1
+					&& FreeItems.getInstance().get(0) instanceof Text
 					&& toDelete != null && toDelete instanceof Text) {
 
 				// check permissions
 				if (!toDelete.hasPermission(Permission.full)) {
-					FrameGraphics
-							.DisplayMessage("Insufficient permission to swap Item text");
+					MessageBay
+							.displayMessage("Insufficient permission to swap Item text");
 					return;
 				}
 				Text anchored = (Text) toDelete;
-				Text free = (Text) Frame.FreeItems.get(0);
+				Text free = (Text) FreeItems.getInstance().get(0);
 				SessionStats.DeletedItem(free);
 				// List<String> temp = anchored.getText();
@@ -1963,5 +1963,5 @@
 
 				// free.setTextList(temp);
-				Frame.FreeItems.clear();
+				FreeItems.getInstance().clear();
 
 				anchored.getParent().setChanged(true);
@@ -1972,5 +1972,5 @@
 				_offY = getY() - anchored.getY() + anchored.getOffset().y;
 			} else {
-				deleteItems(Frame.FreeItems);
+				deleteItems(FreeItems.getInstance());
 			}
 			// reset the mouse cursor
@@ -2032,6 +2032,6 @@
 			// check permissions
 			if (!toDelete.hasPermission(Permission.full)) {
-				FrameGraphics
-						.DisplayMessage("Insufficient permission to delete item");
+				MessageBay
+						.displayMessage("Insufficient permission to delete item");
 				return;
 			}
@@ -2355,6 +2355,6 @@
 
 		if (!toGrab.hasPermission(Permission.full)) {
-			FrameGraphics
-					.DisplayMessage("Insufficient permission pickup the item");
+			MessageBay
+					.displayMessage("Insufficient permission pickup the item");
 			return;
 		}
@@ -2402,5 +2402,5 @@
 					i.setParent(null);
 			}
-			Frame.FreeItems.add(i);
+			FreeItems.getInstance().add(i);
 			i.setFloating(true);
 			if (i.hasVector()) {
@@ -2409,5 +2409,5 @@
 				// Collection<Item> copies = ItemUtils.CopyItems(overlayFrame
 				// .getNonAnnotationItems(), i.getVector());
-				// Frame.FreeItems.addAll(copies);
+				// FreeItems.getInstance().addAll(copies);
 				// TODO add the copies to the free items so they are visible
 				// when the cursor is moving around but are not anchored
@@ -2429,12 +2429,12 @@
 					// make the offset item the first item in the list (so
 					// move method knows which item to use)
-					Frame.FreeItems.set(Frame.FreeItems.indexOf(i),
-							Frame.FreeItems.get(0));
-					Frame.FreeItems.set(0, i);
+					FreeItems.getInstance().set(FreeItems.getInstance().indexOf(i),
+							FreeItems.getInstance().get(0));
+					FreeItems.getInstance().set(0, i);
 					break;
 				}
 			}
 
-			move(Frame.FreeItems);
+			move(FreeItems.getInstance());
 			ItemUtils.EnclosedCheck(toGrab);
 			// otherwise, just use the first item
@@ -2448,6 +2448,6 @@
 			move(toGrab);
 		} else {
-			FrameGraphics
-					.DisplayMessage("Insufficient permission pickup the items");
+			MessageBay
+					.displayMessage("Insufficient permission pickup the items");
 		}
 		if (bReparse)
@@ -2536,14 +2536,14 @@
 		int clicks = arg0.getClickCount();
 
-		if (Frame.FreeItems.size() == 2) {
-			if ((Frame.FreeItems.get(0).isLineEnd() && Frame.FreeItems.get(1) instanceof Line)
-					|| (Frame.FreeItems.get(1).isLineEnd() && Frame.FreeItems
+		if (FreeItems.getInstance().size() == 2) {
+			if ((FreeItems.getInstance().get(0).isLineEnd() && FreeItems.getInstance().get(1) instanceof Line)
+					|| (FreeItems.getInstance().get(1).isLineEnd() && FreeItems.getInstance()
 							.get(0) instanceof Line)) {
 
 				Line line;
-				if (Frame.FreeItems.get(0) instanceof Line)
-					line = (Line) Frame.FreeItems.get(0);
+				if (FreeItems.getInstance().get(0) instanceof Line)
+					line = (Line) FreeItems.getInstance().get(0);
 				else
-					line = (Line) Frame.FreeItems.get(1);
+					line = (Line) FreeItems.getInstance().get(1);
 
 				// User must do multiple clicks to toggle the line
@@ -2590,6 +2590,6 @@
 				// check permissions
 				if (!item.hasPermission(Permission.full)) {
-					FrameGraphics
-							.DisplayMessage("Insufficient permission to edit the Line");
+					MessageBay
+							.displayMessage("Insufficient permission to edit the Line");
 					return;
 				}
Index: /trunk/src/org/expeditee/gui/FrameUtils.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameUtils.java	(revision 120)
+++ /trunk/src/org/expeditee/gui/FrameUtils.java	(revision 121)
@@ -331,5 +331,5 @@
 		if (Frame.itemAttachedToCursor()) {
 			List<Item> toAdd = new ArrayList<Item>();
-			List<Item> toCheck = new ArrayList<Item>(Frame.FreeItems);
+			List<Item> toCheck = new ArrayList<Item>(FreeItems.getInstance());
 
 			while (toCheck.size() > 0) {
@@ -339,6 +339,6 @@
 				// // Only move completely enclosed items
 				// if (!toCheck.containsAll(connected)) {
-				// connected.retainAll(Frame.FreeItems);
-				// Frame.FreeItems.removeAll(connected);
+				// connected.retainAll(FreeItems.getInstance());
+				// FreeItems.getInstance().removeAll(connected);
 				// toCheck.removeAll(connected);
 				// FrameMouseActions.anchor(connected);
@@ -349,5 +349,5 @@
 				// Anchor overlay items where they belong
 				if (i.getParent() != null && i.getParent() != current) {
-					Frame.FreeItems.removeAll(connected);
+					FreeItems.getInstance().removeAll(connected);
 					toCheck.removeAll(connected);
 					FrameMouseActions.anchor(connected);
@@ -357,5 +357,5 @@
 					toCheck.removeAll(connected);
 					// Dont add the items that are free
-					connected.removeAll(Frame.FreeItems);
+					connected.removeAll(FreeItems.getInstance());
 					toAdd.addAll(connected);
 				}
@@ -376,5 +376,5 @@
 		// if the saving happened properly, we can continue
 		if (!LeavingFrame(current)) {
-			FrameGraphics.DisplayMessage("Navigation cancelled");
+			MessageBay.displayMessage("Navigation cancelled");
 			return;
 		}
@@ -437,5 +437,5 @@
 
 		if (f == null) {
-			FrameGraphics.ErrorMessage("Frame '" + frameName
+			MessageBay.errorMessage("Frame '" + frameName
 					+ "' could not be found.");
 		}
@@ -461,7 +461,7 @@
 			if (imagePath.length() == 0) {
 				return false;
-				// FrameGraphics.ErrorMessage("Expected image path after @i:");
+				// MessageBay.errorMessage("Expected image path after @i:");
 			} else {
-				FrameGraphics.ErrorMessage("Image " + imagePath
+				MessageBay.errorMessage("Image " + imagePath
 						+ " could not be loaded");
 			}
@@ -506,14 +506,11 @@
 		} catch (InteractiveWidgetNotAvailableException e) {
 			e.printStackTrace();
-			FrameGraphics.ErrorMessage("Cannot create iWidget: "
-					+ e.getMessage());
+			MessageBay.errorMessage("Cannot create iWidget: " + e.getMessage());
 		} catch (InteractiveWidgetInitialisationFailedException e) {
 			e.printStackTrace();
-			FrameGraphics.ErrorMessage("Cannot create iWidget: "
-					+ e.getMessage());
+			MessageBay.errorMessage("Cannot create iWidget: " + e.getMessage());
 		} catch (IllegalArgumentException e) {
 			e.printStackTrace();
-			FrameGraphics.ErrorMessage("Cannot create iWidget: "
-					+ e.getMessage());
+			MessageBay.errorMessage("Cannot create iWidget: " + e.getMessage());
 		}
 
@@ -557,5 +554,5 @@
 				// warn the user
 				else {
-					// FrameGraphics.WarningMessage("Home frame: " + first
+					// MessageBay.warningMessage("Home frame: " + first
 					// + " is not a valid frame.");
 					UserSettings.FirstFrame = profile.getName();
@@ -627,5 +624,5 @@
 				UserSettings.FrameDirs.addAll(getDirs(item));
 			} else {
-				FrameGraphics.WarningMessage(attributeFullCase
+				MessageBay.warningMessage(attributeFullCase
 						+ " is not a profile frame tag");
 			}
@@ -636,15 +633,15 @@
 		if (UserSettings.FirstFrame == null)
 			UserSettings.FirstFrame = profile.getName();
-		else {
-			Frame firstFrame = FrameIO.LoadFrame(UserSettings.FirstFrame);
-			if (firstFrame == null) {
-				FrameGraphics.WarningMessage("Home frame not found: "
-						+ UserSettings.FirstFrame);
-				UserSettings.FirstFrame = profile.getName();
-				DisplayIO.setCurrentFrame(profile);
-			} else {
-				DisplayIO.setCurrentFrame(firstFrame);
-			}
-		}
+		// else {
+		Frame firstFrame = FrameIO.LoadFrame(UserSettings.FirstFrame);
+		if (firstFrame == null) {
+			MessageBay.warningMessage("Home frame not found: "
+					+ UserSettings.FirstFrame);
+			UserSettings.FirstFrame = profile.getName();
+			DisplayIO.setCurrentFrame(profile);
+		} else {
+			DisplayIO.setCurrentFrame(firstFrame);
+		}
+		// }
 	}
 
@@ -727,8 +724,8 @@
 					return name + File.separator;
 			} else {
-				FrameGraphics.ErrorMessage("Directory not found: " + name);
+				MessageBay.errorMessage("Directory not found: " + name);
 			}
 		} else {
-			FrameGraphics.WarningMessage("Missing value for profile attribute"
+			MessageBay.warningMessage("Missing value for profile attribute"
 					+ name);
 		}
@@ -866,5 +863,6 @@
 						}
 					}// check for new VECTOR items
-					else if (ItemUtils.startsWithTag(i, ItemUtils.TAG_VECTOR)
+					else if (!FrameGraphics.isXRayMode()
+							&& ItemUtils.startsWithTag(i, ItemUtils.TAG_VECTOR)
 							&& i.getLink() != null) {
 						// TODO It is possible to get into an infinate loop if a
@@ -879,6 +877,7 @@
 						vectorPermission = Permission.min(vectorPermission,
 								permission);
-						//Highest permissable permission for vectors is copy
-						vectorPermission = Permission.min(vectorPermission, Permission.copy);
+						// Highest permissable permission for vectors is copy
+						vectorPermission = Permission.min(vectorPermission,
+								Permission.copy);
 						if (vector != null) {
 							String scaleString = AttributeUtils
@@ -889,7 +888,7 @@
 							} catch (Exception e) {
 							}
-							Vector newVector = new Vector(vector, vectorPermission, i
-									.getPosition(), scale, i.getColor(), i
-									.getBackgroundColor());
+							Vector newVector = new Vector(vector,
+									vectorPermission, i.getPosition(), scale, i
+											.getColor(), i.getBackgroundColor());
 							i.setOverlay(newVector);
 							vectors.add(newVector);
@@ -903,5 +902,5 @@
 							// This frame contains an active overlay which
 							// points to itself
-							FrameGraphics.ErrorMessage(toParse.getName()
+							MessageBay.errorMessage(toParse.getName()
 									+ " contains an @o which links to itself");
 							continue;
@@ -921,5 +920,5 @@
 							// This frame contains an active overlay which
 							// points to itself
-							FrameGraphics.ErrorMessage(toParse.getName()
+							MessageBay.errorMessage(toParse.getName()
 									+ " contains an @ao which links to itself");
 							continue;
@@ -1054,5 +1053,5 @@
 				Logger.Log(e);
 				e.printStackTrace();
-				FrameGraphics.WarningMessage("Exception occured when loading "
+				MessageBay.warningMessage("Exception occured when loading "
 						+ i.getClass().getSimpleName() + "(ID: " + i.getID()
 						+ ") " + e.getMessage());
@@ -1100,5 +1099,5 @@
 		if (y > FrameGraphics.getMaxFrameSize().getHeight()) {
 			// check the individual message items
-			for (Item message : FrameGraphics.Messages) {
+			for (Item message : MessageBay.getMessages()) {
 				if (message != null) {
 					if (message.contains(x, y)) {
@@ -1114,8 +1113,8 @@
 
 			// check the link to the message frame
-			if (FrameGraphics.MessageLink != null) {
-				if (FrameGraphics.MessageLink.contains(x, y)) {
-					FrameGraphics.MessageLink.setPermission(Permission.copy);
-					possibles.add(FrameGraphics.MessageLink);
+			if (MessageBay.getMessageLink() != null) {
+				if (MessageBay.getMessageLink().contains(x, y)) {
+					MessageBay.getMessageLink().setPermission(Permission.copy);
+					possibles.add(MessageBay.getMessageLink());
 				}
 			}
@@ -1128,5 +1127,5 @@
 										 * LastEdited.isVisible() &&
 										 */LastEdited.contains(x, y)
-					&& !Frame.FreeItems.contains(LastEdited)
+					&& !FreeItems.getInstance().contains(LastEdited)
 					&& LastEdited.getParent() == DisplayIO.getCurrentFrame()
 					&& LastEdited.getParent().getItems().contains(LastEdited)) {
@@ -1141,6 +1140,8 @@
 			for (Item i : checkList) {
 				// do not check annotation items in audience mode
-				if (i.isVisible() && !(FrameGraphics.isAudienceMode() && i.isAnnotation())) {
-					if (i.contains(x, y) && !Frame.FreeItems.contains(i)) {
+				if (i.isVisible()
+						&& !(FrameGraphics.isAudienceMode() && i.isAnnotation())) {
+					if (i.contains(x, y)
+							&& !FreeItems.getInstance().contains(i)) {
 						possibles.add(i);
 					}
@@ -1232,5 +1233,5 @@
 
 		// Remove all items that are connected to freeItems
-		List<Item> freeItems = new ArrayList<Item>(Frame.FreeItems);
+		List<Item> freeItems = new ArrayList<Item>(FreeItems.getInstance());
 		while (freeItems.size() > 0) {
 			Item item = freeItems.get(0);
Index: /trunk/src/org/expeditee/io/AbstractHTMLWriter.java
===================================================================
--- /trunk/src/org/expeditee/io/AbstractHTMLWriter.java	(revision 120)
+++ /trunk/src/org/expeditee/io/AbstractHTMLWriter.java	(revision 121)
@@ -5,5 +5,5 @@
 
 import org.expeditee.gui.Frame;
-import org.expeditee.gui.FrameGraphics;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.items.Item;
 
@@ -39,5 +39,5 @@
 					dir.mkdirs();
 				} catch (Exception e) {
-					FrameGraphics.ErrorMessage("Could not create folder: "
+					MessageBay.errorMessage("Could not create folder: "
 							+ dir.getName());
 					_filesFolderName = null;
Index: /trunk/src/org/expeditee/io/DefaultTreeWriter.java
===================================================================
--- /trunk/src/org/expeditee/io/DefaultTreeWriter.java	(revision 120)
+++ /trunk/src/org/expeditee/io/DefaultTreeWriter.java	(revision 121)
@@ -6,6 +6,6 @@
 
 import org.expeditee.gui.Frame;
-import org.expeditee.gui.FrameGraphics;
 import org.expeditee.gui.FrameIO;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.items.Item;
 import org.expeditee.items.Text;
@@ -91,5 +91,5 @@
 				this.resumeFrame(next);
 			} else {
-				FrameGraphics.OverwriteMessage("Writing: " + next.getName());
+				MessageBay.overwriteMessage("Writing: " + next.getName());
 				_frameCount++;
 				writeStartFrame(next);
Index: /trunk/src/org/expeditee/io/KMSReader.java
===================================================================
--- /trunk/src/org/expeditee/io/KMSReader.java	(revision 120)
+++ /trunk/src/org/expeditee/io/KMSReader.java	(revision 121)
@@ -12,5 +12,5 @@
 
 import org.expeditee.gui.Frame;
-import org.expeditee.gui.FrameGraphics;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.items.Constraint;
 import org.expeditee.items.Dot;
@@ -361,5 +361,5 @@
 		if (_FrameTags.get(tag) == null) {
 			if (!tag.equals("t") && !tag.equals("v"))
-				FrameGraphics.ErrorMessage("Tag '" + tag + "' in '" + line
+				MessageBay.errorMessage("Tag '" + tag + "' in '" + line
 						+ "' is not supported.");
 			return;
@@ -379,6 +379,6 @@
 	private Frame readFrameClass() throws IOException {
 		if (_data.size() == 0) {
-			FrameGraphics
-					.ErrorMessage("IO Error: File contains no valid KMS lines.");
+			MessageBay
+					.errorMessage("IO Error: File contains no valid KMS lines.");
 			return null;
 		}
Index: /trunk/src/org/expeditee/io/PNGWriter.java
===================================================================
--- /trunk/src/org/expeditee/io/PNGWriter.java	(revision 120)
+++ /trunk/src/org/expeditee/io/PNGWriter.java	(revision 121)
@@ -6,6 +6,6 @@
 import org.expeditee.agents.DefaultAgent;
 import org.expeditee.gui.Frame;
-import org.expeditee.gui.FrameGraphics;
 import org.expeditee.gui.FrameIO;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.items.Item;
 
@@ -26,5 +26,5 @@
 			_writer.write(ItemWriter.NEW_LINE);
 		} else {
-			FrameGraphics.ErrorMessage("Could not create image for "
+			MessageBay.errorMessage("Could not create image for "
 					+ starting.getName());
 		}
Index: /trunk/src/org/expeditee/items/Circle.java
===================================================================
--- /trunk/src/org/expeditee/items/Circle.java	(revision 120)
+++ /trunk/src/org/expeditee/items/Circle.java	(revision 121)
@@ -7,4 +7,5 @@
 import java.awt.Graphics2D;
 import java.awt.Polygon;
+import java.awt.Rectangle;
 import java.awt.geom.Point2D;
 import java.util.Collection;
@@ -36,7 +37,7 @@
 		updatePolygon();
 	}
-	
+
 	public Collection<Item> getItemsToSave() {
-		Collection<Item> toSave =super.getItemsToSave();
+		Collection<Item> toSave = super.getItemsToSave();
 		toSave.add(_center);
 		return toSave;
@@ -196,5 +197,5 @@
 		return super.setHighlightColor(c);
 	}
-	
+
 	@Override
 	public void setFillColor(Color c) {
@@ -254,9 +255,9 @@
 	@Override
 	public float getSize() {
-		return (float)getRadius();
+		return (float) getRadius();
 	}
 
 	/**
-	 *Resizes the circle from the center.
+	 * Resizes the circle from the center.
 	 */
 	@Override
@@ -283,17 +284,32 @@
 	public void translate(Point2D origin, double ratio) {
 		updatePolygon();
-		//_center.translate(origin, ratio);
-		//super.translate(origin, ratio);
+		// _center.translate(origin, ratio);
+		// super.translate(origin, ratio);
+	}
+
+	@Override
+	public Rectangle[] getDrawingArea() {
+
+		float thickness = getThickness();
+		double radius = getRadius();
+
+		int size = (int) ((2 * radius) + 3.0 + thickness);
+
+		return new Rectangle[] { new Rectangle((int) (_center.getX() - radius
+				- 0.5 - (thickness / 2.0)), (int) (_center.getY() - radius
+				- 0.5 - (thickness / 2.0)), size, size) };
+	}
+
+	// @Override
+	// public void setPosition(float x, float y){
+	// float deltaX = x - _source._x;
+	// float deltaY = y = _source._y;
+	// _center.setPosition(deltaX, deltaY);
+	// super.setPosition(x,y);
+	// }
+	public Item getCenter() {
+		return _center;
 	}
 	
-//	@Override
-//	public void setPosition(float x, float y){
-//		float deltaX = x - _source._x;
-//		float deltaY = y = _source._y;
-//		_center.setPosition(deltaX, deltaY);
-//		super.setPosition(x,y);
-//	}
-	public Item getCenter(){
-		return _center;
-	}
+	
 }
Index: unk/src/org/expeditee/items/CommandLineWidget.java
===================================================================
--- /trunk/src/org/expeditee/items/CommandLineWidget.java	(revision 120)
+++ 	(revision )
@@ -1,70 +1,0 @@
-package org.expeditee.items;
-
-
-public class CommandLineWidget { // extends InteractiveWidget {
-	/*
-	private JTextArea _output;
-	private JTextArea _input;
-	
-	public CommandLineWidget(Frame idAllocator) {
-		super(new JSplitPane(JSplitPane.VERTICAL_SPLIT), idAllocator);
-		build();
-		setMaxWidth(-1);
-		setMaxHeight(-1);
-		setMinWidth(100);
-		setMinHeight(80);
-		
-		setPosition(100, 100);
-		setSize(400, 100);
-	}
-
-	// Clone constructor
-	private CommandLineWidget(CommandLineWidget blueprint) {
-		super(new JSplitPane(JSplitPane.VERTICAL_SPLIT), blueprint);
-		build();
-		
-		// Set state
-		_output.setText(blueprint.getOutputText());
-		_input.setText(blueprint.getInputText());
-		
-	}
-	
-	private void build() {
-		
-
-		_output = new JTextArea();
-		//output.setMinimumSize(new Dimension(100, 20));
-		_output.setBackground(Color.black);
-		_output.setForeground(Color.green);
-		_output.setCaretColor(Color.green);
-		_output.setFont(new Font("Arial", Font.BOLD, 14));
-		
-		_input = new JTextArea();
-		//input.setMinimumSize(output.getMinimumSize());
-		_input.setBackground(Color.black);
-		_input.setForeground(Color.green);
-		_input.setFont(_output.getFont());
-		_input.setCaretColor(Color.green);
-
-		JSplitPane sp = (JSplitPane)this._component;
-		sp.setTopComponent(_output);
-		sp.setBottomComponent(_input);
-		
-		sp.setOneTouchExpandable(false);
-		sp.setDividerLocation(80);
-
-	}
-	
-	@Override
-	protected InteractiveWidget clone() {
-		return new CommandLineWidget(this);
-	}
-	
-	String getInputText() {
-		return _input.getText();
-	}
-	
-	String getOutputText() {
-		return _output.getText();
-	}*/
-}
Index: /trunk/src/org/expeditee/items/Dot.java
===================================================================
--- /trunk/src/org/expeditee/items/Dot.java	(revision 120)
+++ /trunk/src/org/expeditee/items/Dot.java	(revision 121)
@@ -86,5 +86,5 @@
 	@Override
 	public void paint(Graphics2D g) {
-		if (isHighlighted() /* && !Frame.FreeItems.contains(this) */) {
+		if (isHighlighted() /* && !FreeItems.getInstance().contains(this) */) {
 			Color highlightColor = getHighlightColor();
 			g.setColor(highlightColor);
Index: /trunk/src/org/expeditee/items/InteractiveWidget.java
===================================================================
--- /trunk/src/org/expeditee/items/InteractiveWidget.java	(revision 120)
+++ /trunk/src/org/expeditee/items/InteractiveWidget.java	(revision 121)
@@ -20,4 +20,5 @@
 import org.expeditee.gui.Frame;
 import org.expeditee.gui.FrameGraphics;
+import org.expeditee.gui.FreeItems;
 
 /**
@@ -53,11 +54,13 @@
 	// world
 	private Text _textRepresentation;
+	
+	private final static Color FREESPACE_BACKCOLOR = new Color(100,100,100,128);
 
 	// A flag for signifying whether the swing components are ready to paint.
 	// If the swing components has not been layed out, if they are painted they
-	// will
-	// not draw in the correct positions.
+	// will not draw in the correct positions.
+	// Also for setting AWT and Swing -Related drawing options after construction
 	private boolean _isReadyToPaint = false;
-
+	
 	/**
 	 * Creates a InteractiveWidget from a text item.
@@ -356,5 +359,5 @@
 		_swingComponent = component;
 		_textRepresentation = source;
-
+		
 		_minWidth = minWidth;
 
@@ -742,4 +745,6 @@
 
 		}
+		
+		FrameGraphics.invalidateItem(_d1, _swingComponent.getBounds());
 	}
 
@@ -772,5 +777,5 @@
 
 				synchronized (_widgetsToAddLater) {
-					_widgetsToAddLater.add(new WidgetInfo(this, e));
+					_widgetsToAddLater.add(new DelayedWidgetEvent(this, e));
 				}
 				SwingUtilities.invokeLater(new AddToFrameLater());
@@ -780,4 +785,17 @@
 
 	}
+	
+	/**
+	 * @return True if at least one corner is floating
+	 */
+	public boolean isFloating() {
+		return _d1.isFloating() || _d2.isFloating()
+				|| _d3.isFloating() || _d4.isFloating();
+	}
+	
+	public boolean areCornersFullyAnchored() {
+		return _d1.getParent() != null && _d2.getParent() != null
+		&& _d3.getParent() != null && _d4.getParent() != null;
+	}
 
 	/**
@@ -786,7 +804,7 @@
 	 * @author Brook Novak
 	 */
-	class WidgetInfo {
-
-		WidgetInfo(InteractiveWidget widget, ItemParentStateChangedEvent e) {
+	class DelayedWidgetEvent {
+
+		DelayedWidgetEvent(InteractiveWidget widget, ItemParentStateChangedEvent e) {
 			_widget = widget;
 			_e = e;
@@ -802,5 +820,5 @@
 	 * before the browser singleton is made available.
 	 */
-	private static List<WidgetInfo> _widgetsToAddLater = new LinkedList<WidgetInfo>();
+	private static List<DelayedWidgetEvent> _widgetsToAddLater = new LinkedList<DelayedWidgetEvent>();
 
 	/**
@@ -810,10 +828,10 @@
 		public void run() {
 			if (!_widgetsToAddLater.isEmpty()) {
-				List<WidgetInfo> tmp = null;
+				List<DelayedWidgetEvent> tmp = null;
 				synchronized (_widgetsToAddLater) {
-					tmp = new LinkedList<WidgetInfo>(_widgetsToAddLater);
+					tmp = new LinkedList<DelayedWidgetEvent>(_widgetsToAddLater);
 				}
 				_widgetsToAddLater.clear();
-				for (WidgetInfo iwi : tmp) {
+				for (DelayedWidgetEvent iwi : tmp) {
 					iwi._widget.addJComponantToFrame(iwi._e);
 				}
@@ -821,4 +839,11 @@
 		}
 	}
+	
+	public void onBoundsChanged() {
+
+		_swingComponent.setBounds(getX(), getY(), getWidth(), getHeight());
+
+	}
+
 
 	/**
@@ -841,12 +866,36 @@
 		}
 
+	}
+
+	private void ignoreAWTPainting(Component c) {
+		
+		if (c instanceof JComponent) {
+			((JComponent)c).setDoubleBuffered(false);
+		}
+		
+		c.setIgnoreRepaint(true);
+		
+		if (c instanceof Container) {
+			for (Component child : ((Container) c).getComponents()) {
+
+				if (child instanceof Container) {
+					ignoreAWTPainting(child);
+				} else {
+					if (child instanceof JComponent) {
+						((JComponent)child).setDoubleBuffered(false);
+					}
+					
+					child.setIgnoreRepaint(true);
+				}
+			}
+		}
+	}
+	
+	private void prepareToPaint() {
 		_isReadyToPaint = true;
-	}
-
-	public void onBoundsChanged() {
-
-		_swingComponent.setBounds(getX(), getY(), getWidth(), getHeight());
-
-	}
+		layout(_swingComponent);
+		ignoreAWTPainting(_swingComponent);
+	}
+	
 
 	/**
@@ -858,8 +907,9 @@
 
 		if (!_isReadyToPaint) {
-			layout(_swingComponent);
+			prepareToPaint();
 		}
 
 		Point loc = _swingComponent.getLocation();
+		
 		g.translate(loc.x, loc.y - 1);
 		_swingComponent.paint(g);
@@ -867,26 +917,32 @@
 
 	}
-
-	/**
-	 * Called from the widgets corners: Whenever the corners are repainted and
-	 * the widget is floating (e.g. currently picked up / rubberbanding) then a
+	
+	/**
+	 * Invoked whenever the widget is to be repainted in free space.
+	 * @param g
+	 */
+	protected void paintInFreeSpace(Graphics g) {
+		g.setColor(FREESPACE_BACKCOLOR);
+		g.fillRect(getX(), getY(), getWidth(), getHeight());
+	}
+
+	/**
+	 * Called from the widgets corners: Whenever one of the corners are invoked for
+	 * a refill of the enclosed area.
+	 * 
+	 * If the widget is floating (e.g. currently picked up / rubberbanding) then a
 	 * shaded area is drawn instead of the actual widget so the manipulation of
-	 * the widget is as smooth as possible. The shaded area is only draw once so
-	 * it selects one of the 4 possible notifiers to be the actual trigger to
-	 * draw the shaded area
+	 * the widget is as smooth as possible. 
 	 * 
 	 * @param g
 	 * @param notifier
 	 */
-	void paint(Graphics g, WidgetCorner notifier) {
+	void paintFill(Graphics g) {
 		if (_swingComponent.getParent() == null) {
 			// Note that frames with @f may want to paint the widgets so do not
 			// paint over the widget interface in these cases: must only
 			// paint if an object is floating
-			if (notifier == _d4
-					&& (_d1.isFloating() || _d2.isFloating()
-							|| _d3.isFloating() || _d4.isFloating())) {
-				g.setColor(Color.DARK_GRAY);
-				g.fillRect(getX(), getY(), getWidth(), getHeight());
+			if (isFloating()) {
+				paintInFreeSpace(g);
 			}
 		}
@@ -909,5 +965,5 @@
 	 * 
 	 * The purpose of this is so that widgets can have an extra context: no
-	 * expeditee highlighting if focus is on a swing componet.
+	 * expeditee highlighting if focus is on a swing componant.
 	 * 
 	 * @param enable
@@ -921,7 +977,37 @@
 	}
 
-	public static boolean isExepiteeHighlightingEnabled() {
+	public static boolean isExpediteeHighlightingEnabled() {
 		return _isExepiteeHighlightingEnabled;
 	}
 
+	/**
+	 * Removes this widget from the parent frame or free space
+	 */
+	protected void removeSelf() {
+		
+		Frame parent = getParentFrame();
+		
+		if (parent == null) {
+			FreeItems.getInstance().removeAll(_expediteeItems);
+		} else {
+			parent.removeAllItems(_expediteeItems);
+		}
+
+	}
+	
+	/**
+	 * @return The parent frame. Null if has none. Note: Based on corners parents.
+	 */
+	public Frame getParentFrame() {
+
+		Frame parent = null;
+		if (_d1.getParent() != null) parent = _d1.getParent();
+		else if (_d2.getParent() != null) parent = _d2.getParent();
+		else if (_d3.getParent() != null) parent = _d3.getParent();
+		else if (_d4.getParent() != null) parent = _d4.getParent();
+		
+		return parent;
+	}
+	
+	
 }
Index: /trunk/src/org/expeditee/items/Item.java
===================================================================
--- /trunk/src/org/expeditee/items/Item.java	(revision 120)
+++ /trunk/src/org/expeditee/items/Item.java	(revision 121)
@@ -5,8 +5,10 @@
 import java.awt.Cursor;
 import java.awt.Dimension;
+import java.awt.GradientPaint;
 import java.awt.Graphics2D;
 import java.awt.Point;
 import java.awt.Polygon;
 import java.awt.Rectangle;
+import java.awt.Shape;
 import java.awt.Stroke;
 import java.awt.geom.AffineTransform;
@@ -29,4 +31,5 @@
 import org.expeditee.gui.FrameIO;
 import org.expeditee.gui.FrameUtils;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.gui.Overlay;
 import org.expeditee.gui.Vector;
@@ -185,5 +188,8 @@
 		if (parent != null) {
 			dest.setID(source.getParentOrCurrentFrame().getNextItemID());
-		}
+		} 
+//		else {
+//			dest.setID(source.getID());
+//		}
 	}
 
@@ -254,5 +260,5 @@
 	private Color _color = null;
 
-	private Color _highlightColor = DEFAULT_HIGHLIGHT;
+	protected Color _highlightColor = DEFAULT_HIGHLIGHT;
 
 	private Color _colorBackground = null;
@@ -525,5 +531,5 @@
 	}
 
-	protected Polygon getCircle() {
+	protected Polygon getLinkPoly() {
 		if (_circle == null) {
 			int points = 16;
@@ -552,5 +558,5 @@
 			_circleCross = new Polygon();
 
-			Rectangle bounds = getCircle().getBounds();
+			Rectangle bounds = getLinkPoly().getBounds();
 			int x1 = (int) bounds.getMinX();
 			int x2 = (int) bounds.getMaxX();
@@ -943,11 +949,11 @@
 			g.setColor(fillColor);
 			// The painting is not efficient enough for gradients...
-			// Shape s = getEnclosedShape();
-			// Rectangle b = s.getBounds();
-			// GradientPaint gp = new GradientPaint((int) (b.x + b.width * 0.3),
-			// b.y, getFillColor(), (int) (b.x + b.width * 1.3), b.y,
-			// Color.white);
-			// g.setPaint(gp);
-			// g.fill(s);
+//			 Polygon s = getEnclosedShape();
+//			 Rectangle b = s.getBounds();
+//			 GradientPaint gp = new GradientPaint((int) (b.x + b.width * 0.3),
+//			 b.y, getFillColor(), (int) (b.x + b.width * 1.3), b.y,
+//			 Color.white);
+//			 g.setPaint(gp);
+//			 g.fillPolygon(s);
 			g.fillPolygon(getEnclosedShape());
 		}
@@ -994,4 +1000,7 @@
 	 */
 	public void removeAllLines() {
+		for (Line l : _lines) {
+			l.invalidateAll();
+		}
 		_lines.clear();
 	}
@@ -1016,5 +1025,6 @@
 	 */
 	public void removeLine(Line line) {
-		_lines.remove(line);
+		if (_lines.remove(line)) 
+			line.invalidateAll();
 	}
 
@@ -1024,10 +1034,10 @@
 			Simple.RunFrameAndReportError(this, new Context());
 			Simple.ProgramFinished();
-			FrameGraphics.DisplayMessage(AgentStats.getStats(), GREEN);
+			MessageBay.displayMessage(AgentStats.getStats(), GREEN);
 		} catch (ConcurrentModificationException ce) {
 			Simple.ProgramFinished();
 			ce.printStackTrace();
 		} catch (Exception e) {
-			FrameGraphics.LinkedErrorMessage(e.getMessage());
+			MessageBay.linkedErrorMessage(e.getMessage());
 			Simple.ProgramFinished();
 		}
@@ -1142,5 +1152,8 @@
 
 	public void setBackgroundColor(Color c) {
-		_colorBackground = c;
+		if (c != _colorBackground) {
+			_colorBackground = c;
+			invalidateCommonTrait(ItemAppearence.BackgroundColorChanged);
+		}
 	}
 
@@ -1163,5 +1176,8 @@
 	 */
 	public void setColor(Color c) {
-		_color = c;
+		if (c != _color) {
+			_color = c;
+			invalidateCommonTrait(ItemAppearence.ForegroundColorChanged);
+		}
 	}
 
@@ -1191,4 +1207,5 @@
 
 	public void setFillColor(Color c) {
+
 		_colorFill = c;
 
@@ -1198,8 +1215,13 @@
 				other.setFillColor(c);
 		}
+		
+		invalidateCommonTrait(ItemAppearence.FillColor);
+		invalidateFill();
 	}
 
 	public void setFillPattern(String patternLink) {
 		_fillPattern = patternLink;
+		invalidateCommonTrait(ItemAppearence.FillPattern);
+		invalidateFill();
 	}
 
@@ -1244,4 +1266,6 @@
 		for (Line line : lines)
 			line.setLinePattern(getLinePattern());
+		
+		
 	}
 
@@ -1254,10 +1278,12 @@
 	 */
 	public void setLink(String frameName) {
-		if (FrameIO.isValidLink(frameName))
+		if (FrameIO.isValidLink(frameName)) 
 			_link = frameName;
 		else
-			FrameGraphics.ErrorMessage("[" + frameName
+			MessageBay.errorMessage("[" + frameName
 					+ "] is not a valid frame name");
 		// TODO make this throw exceptions etc...
+		
+		invalidate(getLinkDrawArea());
 	}
 
@@ -1266,5 +1292,5 @@
 			_link_frameset = frameset;
 		else
-			FrameGraphics.ErrorMessage("[" + frameset
+			MessageBay.errorMessage("[" + frameset
 					+ "] is not a valid frameset name");
 		// TODO make this throw exceptions etc...
@@ -1280,5 +1306,5 @@
 			_link_template = template;
 		else
-			FrameGraphics.ErrorMessage("[" + template
+			MessageBay.errorMessage("[" + template
 					+ "] is not a valid frame name");
 		// TODO make this throw exceptions etc...
@@ -1316,4 +1342,22 @@
 
 	/**
+	 * Invalidates this, connected lines and fill
+	 * @param trait
+	 */
+	private void invalidateCommonTraitForAll(ItemAppearence trait) {
+		invalidateCommonTrait(trait);
+		for (Line line : getLines()) 
+			line.invalidateCommonTrait(trait);
+		if (_colorFill != null) {
+			invalidateFill(); // only invalidates if has fill
+		}
+		for(XRayable x: getEnclosures()){
+			x.invalidateCommonTrait(trait);
+		}
+
+	}
+	
+	
+	/**
 	 * Sets the position of this item on the screen
 	 * 
@@ -1326,4 +1370,8 @@
 		float deltaX = x - _x;
 		float deltaY = y - _y;
+		
+		if (deltaX == 0 && deltaY == 0) return;
+		
+		invalidateCommonTraitForAll(ItemAppearence.PreMoved);
 
 		_x = x;
@@ -1413,6 +1461,10 @@
 		}
 
-		for (Line line : getLines())
-			line.updatePolygon();
+		for (Line line : getLines()) {
+			line.updatePolygon();	
+		}
+		
+		invalidateCommonTraitForAll(ItemAppearence.PostMoved);
+		
 	}
 
@@ -1463,8 +1515,16 @@
 	 */
 	public void setThickness(float thick, boolean setConnectedThickness) {
+		
+		if (thick == _thickness) return;
+		boolean bigger = thick > _thickness;
+		
+		if (!bigger) invalidateCommonTrait(ItemAppearence.Thickness);
+		
 		_thickness = thick;
 		// update the size of any lines
 		for (Line line : getLines())
 			line.setThickness(thick, setConnectedThickness);
+
+		if (bigger) invalidateCommonTrait(ItemAppearence.Thickness);
 	}
 
@@ -1534,11 +1594,15 @@
 
 	public int setHighlightColor(Color c) {
+		
 		_highlightThickness = DEFAULT_HIGHLIGHT_THICKNESS;
-		if (c != null)
-			_highlightColor = c;
-		else
-			_highlightColor = DEFAULT_HIGHLIGHT;
+		
+		Color selColor = (c != null) ? c : DEFAULT_HIGHLIGHT;
+		if (_highlightColor != c) {
+			_highlightColor = selColor;
+			this.invalidateCommonTrait(ItemAppearence.HighlightColorChanged);
+		}
 
 		return Item.UNCHANGED_CURSOR;
+		
 	}
 
@@ -1589,5 +1653,8 @@
 	public void setHighlightMode(HighlightMode mode, Color color) {
 		setHighlightColor(color);
-		_mode = mode;
+		if (_mode != mode) {
+			_mode = mode;
+			this.invalidateCommonTrait(ItemAppearence.HighlightModeChanged);
+		}
 	}
 
@@ -1655,5 +1722,16 @@
 	 */
 	public void setEnclosedList(Collection<Item> enclosed) {
+		
+		boolean changed = (_enclosure == null && enclosed != null);
+		
+		if (_enclosure != null && enclosed == null) {
+			invalidateFill();
+		}
+		
 		_enclosure = enclosed;
+		
+		if (changed) {
+			invalidateFill();;
+		}
 	}
 
@@ -1773,4 +1851,5 @@
 		if (_actions == null || _actions.size() == 0) {
 			_poly = null;
+			invalidateCommonTrait(ItemAppearence.LinkChanged);
 		}
 		_actions = new LinkedList<String>();
@@ -1780,4 +1859,8 @@
 	protected int getLinkYOffset() {
 		return 0;
+	}
+	
+	protected Rectangle getLinkDrawArea() { // TODO: Revise
+		return new Rectangle(getX() - LEFT_MARGIN - 3, getY() + getLinkYOffset() - 3, 6, 6);
 	}
 
@@ -1804,5 +1887,5 @@
 
 			if (getLinkMark() && getLink() != null) {
-				g.drawPolygon(getCircle());
+				g.drawPolygon(getLinkPoly());
 
 				// if the link is not valid, cross out the circle
@@ -1812,6 +1895,6 @@
 
 			if (getActionMark() && getAction() != null) {
-				g.drawPolygon(getCircle());
-				g.fillPolygon(getCircle());
+				g.drawPolygon(getLinkPoly());
+				g.fillPolygon(getLinkPoly());
 
 				// if the link is not valid, cross out the circle
@@ -1973,4 +2056,7 @@
 	 */
 	public void translate(Point2D origin, double ratio) {
+		
+		invalidateCommonTraitForAll(ItemAppearence.PreMoved);
+		
 		_x = (float) (origin.getX() + ratio * (_x - origin.getX()));
 		_y = (float) (origin.getY() + ratio * (_y - origin.getY()));
@@ -1978,4 +2064,7 @@
 		for (Line line : getLines())
 			line.updatePolygon();
+		
+		invalidateCommonTraitForAll(ItemAppearence.PostMoved);
+		
 	}
 
@@ -2005,7 +2094,11 @@
 					setLinePattern(new int[] { LinePatterns[i], LinePatterns[i] });
 				}
+				
+				invalidateCommonTrait(ItemAppearence.ToggleDashed);
 				return;
 			}
 		}
+		
+		
 	}
 
@@ -2037,4 +2130,100 @@
 	public boolean isDeleted() {
 		return _deleted;
+	}
+	
+	/**
+	 * @return The full canvas that this item draws to. Must include highlighting bounds
+	 */
+	public Rectangle[] getDrawingArea() {
+		
+		return new Rectangle[] {
+				ItemUtils.expandRectangle(getPolygon().getBounds(), 
+				_highlightThickness)
+			};
+		
+	}
+	
+	/**
+	 * 
+	 * @param area
+	 * @return True if area intersects with this items drawing area.
+	 */
+	public final boolean isInDrawingArea(Area area) {
+		for (Rectangle r : getDrawingArea()) {
+			if (area.intersects(r)) return true;
+		}
+		return false;
+	}
+	
+	/**
+	 * Completetly invalidates the item - so that it should be redrawed.
+	 * Note: This is handled internally, it should be reare to invoke this
+	 * externally
+	 */
+	public final void invalidateAll() {
+		invalidate(getDrawingArea());
+	}
+	
+	/**
+	 * Invalidates areas on the parent frame.
+	 * Purpose: to be called on specific areas of the item that needs redrawing. 
+	 * @param damagedAreas
+	 */
+	protected final void invalidate(Rectangle[] damagedAreas) {
+		for (Rectangle r : damagedAreas) invalidate(r);
+	}
+	
+	/**
+	 * Invalidates areas on the parent frame.
+	 * Purpose: to be called on specific areas of the item that needs redrawing. 
+	 * @param damagedAreas
+	 */
+	protected final void invalidate(Rectangle damagedArea) {
+		FrameGraphics.invalidateItem(this, damagedArea);
+	}
+	
+	/**
+	 * Used to invalidate visual traits commonly shared by all items.
+	 * @param trait
+	 */
+	public final void invalidateCommonTrait(ItemAppearence trait) {
+		invalidate(getDamagedArea(trait));
+		
+		if (_colorFill != null && (
+				trait == ItemAppearence.Added
+				|| trait == ItemAppearence.Removed)
+				) {
+			invalidateFill();
+		}
+	}
+	
+	/**
+	 * Invalidates fill if has one, even if no color is set.
+	 */
+	public void invalidateFill() {
+		if (isLineEnd() && _enclosure != null) {
+			invalidate(getEnclosedShape().getBounds());
+		}
+	}
+	
+	/**
+	 * Default implementation always uses drawing area except for links,
+	 * where the link drawing area is used. Override to make item 
+	 * drawing more efficient - defining only parts of the item that needs
+	 * redrawing.
+	 * 
+	 * @see Item.getDrawingArea
+	 * 
+	 * @param trait The visual trait that has changed.
+	 * 
+	 * @return The damaged area according to the visual trait that has changed.
+	 */
+	protected Rectangle[] getDamagedArea(ItemAppearence trait) {
+		
+		if (trait == ItemAppearence.LinkChanged) 
+			return new Rectangle[] {getLinkDrawArea()}; // Invalidate area where link is drawn
+			
+		return getDrawingArea();
+
 	}
 
@@ -2056,3 +2245,4 @@
 		_overlay = overlay;
 	}
+
 }
Index: /trunk/src/org/expeditee/items/ItemUtils.java
===================================================================
--- /trunk/src/org/expeditee/items/ItemUtils.java	(revision 120)
+++ /trunk/src/org/expeditee/items/ItemUtils.java	(revision 121)
@@ -2,4 +2,5 @@
 
 import java.awt.Color;
+import java.awt.Rectangle;
 import java.awt.image.ImageObserver;
 import java.io.File;
@@ -17,6 +18,8 @@
 import org.expeditee.gui.DisplayIO;
 import org.expeditee.gui.Frame;
+import org.expeditee.gui.FreeItems;
 import org.expeditee.gui.Vector;
 import org.expeditee.items.Item.HighlightMode;
+
 
 //Static methods that provide functions for the objects\
@@ -847,4 +850,47 @@
 	}
 
+	/**
+	 * Determines if an item is visible from a the current frame(s).
+	 * If the item is free then it is considered visible.
+	 * @param i The item to check
+	 * @return True if visible/free from given frame.
+	 */
+	public static boolean isVisible(Item i) {
+		if (DisplayIO.isTwinFramesOn()) {
+			if (!isVisible(DisplayIO.getFrames()[0], i)) {
+				return isVisible(DisplayIO.getFrames()[1], i);
+			} else {
+				return true;
+			}
+		} else  {
+			return isVisible(DisplayIO.getCurrentFrame(), i);
+		}
+	}
+
+	/**
+	 * Determines if an item is visible from a given frame.
+	 * If the item is free then it is considered visible.
+	 * 
+	 * @param fromFrame The frame to check from.
+	 * @param i The item to check
+	 * @return True if visible/free from given frame.
+	 */
+	public static boolean isVisible(Frame fromFrame, Item i) {
+		if (fromFrame == null) return false;
+		
+		Frame parent = i.getParent();
+		
+		if (parent == fromFrame) return true;
+		
+		else if (parent == null) return FreeItems.getInstance().contains(i);
+		
+		return fromFrame.getAllItems().contains(i) && i.isVisible();
+	}
+	
+	public static Rectangle expandRectangle(Rectangle r, int n) {
+		return new Rectangle(r.x - (n >> 1), r.y - (n >> 1), 
+				r.width + n, r.height + n);
+	}
+	
 	/*
 	 * FrameMouseActions while (!copies.isEmpty()) { Iterator<Item> iterator =
Index: /trunk/src/org/expeditee/items/Line.java
===================================================================
--- /trunk/src/org/expeditee/items/Line.java	(revision 120)
+++ /trunk/src/org/expeditee/items/Line.java	(revision 121)
@@ -54,4 +54,6 @@
 		return _lineStroke;
 	}
+	
+	
 
 	/**
@@ -344,6 +346,14 @@
 		if (_virtualSpot != null) {
 			_virtualSpot.paint(g);
+			invalidateVirtualSpot();
 			_virtualSpot = null;
 		}
+	}
+	
+	private void invalidateVirtualSpot() {
+		assert (_virtualSpot != null);
+		
+		invalidate(_virtualSpot.getDrawingArea());
+		
 	}
 
@@ -390,7 +400,5 @@
 			return;
 		if (arrowLength == AUTO_ARROWHEAD_LENGTH) {
-			arrowLength = length / ARROW_HEAD_TO_LENGTH_RATIO;
-			arrowLength = Math.max(MINIMUM_ARROW_HEAD_LENGTH, arrowLength);
-			arrowLength = Math.min(MAXIMUM_ARROW_HEAD_LENGTH, arrowLength);
+			arrowLength = getAutoArrowheadLength(length);
 			withArrow.setArrowhead(null);
 			if (arrowRatio < 0)
@@ -416,4 +424,18 @@
 		AffineTransform tx = AffineTransform.getRotateInstance(rad, x0, y0);
 		g.draw(tx.createTransformedShape((Shape) arrowhead));
+	}
+
+
+	/**
+	 * 
+	 * @param length The length of the line
+	 * @return
+	 */
+	private float getAutoArrowheadLength(float length) {
+		float arrowLength;
+		arrowLength = length / ARROW_HEAD_TO_LENGTH_RATIO;
+		arrowLength = Math.max(MINIMUM_ARROW_HEAD_LENGTH, arrowLength);
+		arrowLength = Math.min(MAXIMUM_ARROW_HEAD_LENGTH, arrowLength);
+		return arrowLength;
 	}
 
@@ -540,4 +562,11 @@
 	@Override
 	public void setThickness(float thick, boolean setConnectedThickness) {
+		
+		float oldThickness = this.getThickness();
+		if (thick == oldThickness) return;
+		boolean bigger = thick > oldThickness;
+		
+		if (!bigger) invalidateAll();
+		
 		if (thick < 0)
 			thick = DEFAULT_THICKNESS;
@@ -564,4 +593,6 @@
 			_lineStroke = new BasicStroke(Math.max(thick, MINIMUM_THICKNESS),
 					CAP, JOIN);
+		
+		if (bigger) invalidateAll();
 	}
 
@@ -759,4 +790,5 @@
 		spot.setPosition((int) x, (int) y);
 		_virtualSpot = spot;
+		invalidateVirtualSpot();
 	}
 
@@ -797,4 +829,5 @@
 		spot.setPosition((int) x, (int) y);
 		_virtualSpot = spot;
+		invalidateVirtualSpot();
 	}
 
@@ -974,4 +1007,5 @@
 			_poly.addPoint((int) one.getMaxX(), (int) one.getMaxY());
 		}
+	
 	}
 
@@ -1035,4 +1069,66 @@
 		return Point.distance(p1.x, p1.y, p2.x, p2.y);
 	}
+
+	@Override
+	public Rectangle[] getDrawingArea() { // TODO: CACHE - LIKE UPDATE POLYGON
+
+		float currentThickness = this.getThickness();
+		
+		// Establish bounds
+		int x = Math.min(_start.getX(), _end.getX());
+		int y = Math.min(_start.getY(), _end.getY());
+		int w = (Math.max(_start.getX(), _end.getX()) - x) + 1;
+		int h = (Math.max(_start.getY(), _end.getY()) - y) + 1;
+		
+		int thickness = (int)Math.ceil(currentThickness);
+		if (thickness < 4) thickness = 4;
+		int halfThickness = (int)Math.ceil(currentThickness / 2);
+		
+		// Consider line thickness
+		w += thickness;
+		h += thickness;
+		x -= halfThickness;
+		y -= halfThickness;
+	
+		Rectangle bounds = new Rectangle(x, y, w, h);
+		
+		// TODO: Cap bounds
+		
+		if (_end.hasVisibleArrow()) {
+			
+			double arrowLength = _end.getArrowheadLength();
+			
+			if (arrowLength == AUTO_ARROWHEAD_LENGTH) {
+				arrowLength = Math.ceil(getAutoArrowheadLength((float)getLength()));
+			} else {
+				arrowLength = Math.ceil(arrowLength);
+			}
+
+			arrowLength += ((thickness * 2) + 1);
+			int nArrowLength = (int)arrowLength;
+				
+			// NAIVE version - but probably more efficient in the long run... overall
+			// as opposed to advanced/expensive calculations for getting exact bounding box
+			Rectangle arrowBounds = new Rectangle(
+					_end.getX() - nArrowLength,
+					_end.getY() - nArrowLength,
+					2 * nArrowLength, 
+					2 * nArrowLength);
+			
+			if (currentThickness > 0.0f) {
+
+				arrowBounds = new Rectangle( 
+						arrowBounds.x - halfThickness,
+						arrowBounds.y - halfThickness,
+						arrowBounds.width + thickness,
+						arrowBounds.height + thickness);
+			}
+			
+			return new Rectangle[] { bounds, arrowBounds };
+		} else {
+			return new Rectangle[] { bounds };
+		}
+
+	}
 	
 	@Override
@@ -1046,3 +1142,4 @@
 		_end.setPermission(p);
 	}
+	
 }
Index: /trunk/src/org/expeditee/items/Picture.java
===================================================================
--- /trunk/src/org/expeditee/items/Picture.java	(revision 120)
+++ /trunk/src/org/expeditee/items/Picture.java	(revision 121)
@@ -526,3 +526,24 @@
 		super.translate(origin, ratio);
 	}
+
+	@Override
+	public Rectangle[] getDrawingArea() {
+		
+		Rectangle[] da = super.getDrawingArea();
+		
+		if (getLink() != null || getAction() != null) {
+			Rectangle[] da2 = new Rectangle[da.length + 1];
+			System.arraycopy(da, 0, da2, 0, da.length);
+			da2[da.length] = getLinkPoly().getBounds();
+			da2[da.length].translate(getX() - LEFT_MARGIN, getY() + getLinkYOffset());
+			da2[da.length].width += 2;
+			da2[da.length].height += 2;
+			da = da2;
+		} 
+		
+		return da;
+		
+	}
+	
+	
 }
Index: /trunk/src/org/expeditee/items/Text.java
===================================================================
--- /trunk/src/org/expeditee/items/Text.java	(revision 120)
+++ /trunk/src/org/expeditee/items/Text.java	(revision 121)
@@ -182,4 +182,12 @@
 	}
 
+	@Override
+	public Color getHighlightColor() {
+		if (_highlightColor.equals(getPaintBackgroundColor()))
+			return ALTERNATE_HIGHLIGHT;
+		return _highlightColor;
+	}
+
+	
 	/**
 	 * Sets the justification of this Text item. The given integer should
@@ -225,6 +233,9 @@
 	 */
 	public void setText(String text) {
+	//	if (_text != null && text.length() < _text.length())
+	//		invalidateAll();
 		_text = new StringBuffer(text);
 		rebuild(false);
+	//	invalidateAll();
 	}
 
@@ -265,6 +276,10 @@
 	 */
 	public void removeText(String text) {
-		if (_text.length() > 0 && _text.indexOf(text) == 0)
+		
+		if (_text.length() > 0 && _text.indexOf(text) == 0) {
+			//invalidateAll();
 			_text.delete(0, text.length());
+		}
+		
 
 	}
@@ -273,4 +288,5 @@
 		int length = _text.length();
 		if (length > 0) {
+			//invalidateAll();
 			int pos = _text.indexOf(textToRemove);
 			int textToRemoveLength = textToRemove.length();
@@ -279,4 +295,5 @@
 			}
 		}
+		
 	}
 
@@ -411,4 +428,5 @@
 		TextHitInfo hit = getCharPosition(line, mouseX);
 		_selectionStart = hit.getInsertionIndex() + _lineOffsets.get(line);
+		invalidateAll();
 	}
 
@@ -420,4 +438,5 @@
 		TextHitInfo hit = getCharPosition(line, mouseX);
 		_selectionEnd = hit.getInsertionIndex() + _lineOffsets.get(line);
+		invalidateAll();
 	}
 
@@ -425,8 +444,10 @@
 		_selectionStart = -1;
 		_selectionEnd = -1;
+		invalidateAll();
 	}
 
 	public void clearSelectionEnd() {
 		_selectionEnd = -1;
+		invalidateAll();
 	}
 
@@ -448,5 +469,8 @@
 		if (_selectionStart < 0 || _selectionEnd < 0)
 			return null;
-		else if (_selectionEnd > _text.length())
+		
+		invalidateAll();
+		
+		if (_selectionEnd > _text.length())
 			_selectionEnd = _text.length();
 
@@ -459,4 +483,6 @@
 		_text.insert(left, newText);
 		rebuild(true);
+		
+		invalidateAll();
 
 		return s;
@@ -493,4 +519,6 @@
 		TextLayout current = null;
 		int line;
+		
+		invalidateAll();
 
 		// check for empty string
@@ -635,4 +663,7 @@
 						x,
 						(getX() - Item.MARGIN_RIGHT - (2 * getGravity()) + getBoundsWidth()));
+		
+		invalidateAll();
+		
 		return new Point2D.Float(Math.round(x), Math.round(getY() + y
 				+ caret[1]));
@@ -777,6 +808,6 @@
 	public void setFont(Font font) {
 		// all decoding occurs in the Utils class
+		
 		_font = font;
-
 		// rejustify();
 		rebuild(false);
@@ -1105,5 +1136,5 @@
 			return;
 		}
-
+		
 		AttributedString paragraphText = new AttributedString(_text.toString());
 		paragraphText.addAttribute(TextAttribute.FONT, getPaintFont());
@@ -1154,4 +1185,5 @@
 
 		updatePolygon();
+		
 	}
 
@@ -1515,4 +1547,7 @@
 			_lineBreaker.deleteChar(inserting.getIterator(), pos);
 		}
+		
+		
+		
 	}
 
@@ -1682,4 +1717,5 @@
 	@Override
 	protected int getLinkYOffset() {
+		if (_textLayouts.size() == 0) return  0;
 		return Math.round(-(_textLayouts.get(0).getAscent() / 2));
 	}
Index: /trunk/src/org/expeditee/items/WidgetCorner.java
===================================================================
--- /trunk/src/org/expeditee/items/WidgetCorner.java	(revision 120)
+++ /trunk/src/org/expeditee/items/WidgetCorner.java	(revision 121)
@@ -1,5 +1,8 @@
 package org.expeditee.items;
 
+import java.awt.Color;
 import java.awt.Graphics2D;
+import java.awt.Polygon;
+import java.awt.geom.Point2D;
 
 
@@ -10,4 +13,7 @@
 	WidgetCorner(int x, int y, int id, InteractiveWidget widgetSource) {
 		super(x, y, id);
+		
+		super.setThickness(2.0f);
+		
 		if (widgetSource == null) throw new NullPointerException("widgetSource");
 		_widgetSource = widgetSource;
@@ -22,9 +28,27 @@
 	@Override
 	public void setPosition(float x, float y) {
+		invalidateFill();
+		if (_widgetSource != null) { // _widgetSource == null on construction
+			if (!_widgetSource.setPositions(this,(int)(x+0.5),(int)(y+0.5))) {
+				super.setPosition(x, y);
+			}
+		} else super.setPosition(x, y);
+		invalidateFill();
+	}
+	
+	@Override
+	public void setXY(float x, float y) {
+		invalidateFill();
+		if (_widgetSource != null) { // _widgetSource == null on construction
+			if (!_widgetSource.setPositions(this,(int)(x+0.5),(int)(y+0.5))) {
+				super.setXY(x, y);
+			}
+		} else super.setXY(x, y);
+		invalidateFill();
+	}
 
-		if (_widgetSource != null) { // _widgetSource == null on construction
-			if (!_widgetSource.setPositions(this,(int)(x+0.5),(int)(y+0.5)))
-				super.setPosition(x, y);
-		} else super.setPosition(x, y);
+	@Override
+	public void translate(Point2D origin, double ratio) {
+		//super.translate(origin, ratio);
 	}
 
@@ -41,5 +65,5 @@
 	@Override
 	public void paint(Graphics2D g) {
-		if (InteractiveWidget.isExepiteeHighlightingEnabled()) { // only paint if flag is set to true
+		if (InteractiveWidget.isExpediteeHighlightingEnabled()) { // only paint if flag is set to true
 			
 			// For fixed widgets, always have corner selected with connected context
@@ -51,5 +75,9 @@
 			_mode = tmp; // restore mode
 		}
-		_widgetSource.paint(g, this);	
+	}
+	
+	@Override
+	public void paintFill(Graphics2D g) {
+		_widgetSource.paintFill(g); // only paints a fill if floating
 	}
 	
@@ -69,5 +97,51 @@
 		return "WidgetCorner: [" + this.getX() + "," +  this.getY() + "]";
 	}
+
+	@Override
+	public void setThickness(float thick) {
+	}
+
+	@Override
+	public void setArrow(float length, double ratio) {
+	}
+
+	@Override
+	public void setArrowhead(Polygon arrow) {
+	}
+
+	@Override
+	public void setArrowheadLength(float length) {
+	}
+
+	@Override
+	public void setArrowheadRatio(double ratio) {
+	}
+
+	@Override
+	public void setBackgroundColor(Color c) {
+	}
+
+	@Override
+	public void setBottomShadowColor(Color bottom) {
+	}
+
+	@Override
+	public void setFillColor(Color c) {
+	}
+
+	@Override
+	public void setFillPattern(String patternLink) {
+	}
+
+	@Override
+	public void toggleDashed(int amount) {
+	}
+
+	@Override
+	public void setSize(float size) {
+	}
+
+
 	
-	
+
 }
Index: /trunk/src/org/expeditee/items/WidgetEdge.java
===================================================================
--- /trunk/src/org/expeditee/items/WidgetEdge.java	(revision 120)
+++ /trunk/src/org/expeditee/items/WidgetEdge.java	(revision 121)
@@ -2,4 +2,5 @@
 
 import java.awt.Color;
+import java.awt.Polygon;
 
 /**
@@ -60,4 +61,38 @@
 	}
 
-	
+	@Override
+	public void setArrow(float length, double ratio) {
+	}
+
+	@Override
+	public void setArrowhead(Polygon arrow) {
+	}
+
+	@Override
+	public void setArrowheadLength(float length) {
+	}
+
+	@Override
+	public void setArrowheadRatio(double ratio) {
+	}
+
+	@Override
+	public void setBackgroundColor(Color c) {
+	}
+
+	@Override
+	public void setBottomShadowColor(Color bottom) {
+	}
+
+	@Override
+	public void setFillColor(Color c) {
+	}
+
+	@Override
+	public void setFillPattern(String patternLink) {
+	}
+
+	@Override
+	public void setSize(float size) {
+	}
 }
Index: /trunk/src/org/expeditee/items/XRayable.java
===================================================================
--- /trunk/src/org/expeditee/items/XRayable.java	(revision 120)
+++ /trunk/src/org/expeditee/items/XRayable.java	(revision 121)
@@ -107,5 +107,7 @@
 	@Override
 	public void setThickness(float thick) {
+		this.invalidateCommonTrait(ItemAppearence.Thickness);
 		_source.setThickness(thick);
+		this.invalidateCommonTrait(ItemAppearence.Thickness);
 	}
 	
@@ -171,4 +173,5 @@
 	public void setPosition(float x, float y) {
 		//_source.setPosition(x, y);
+		
 	}
 	
Index: /trunk/src/org/expeditee/simple/Context.java
===================================================================
--- /trunk/src/org/expeditee/simple/Context.java	(revision 120)
+++ /trunk/src/org/expeditee/simple/Context.java	(revision 121)
@@ -9,6 +9,6 @@
 import org.expeditee.actions.Simple;
 import org.expeditee.gui.Frame;
-import org.expeditee.gui.FrameGraphics;
 import org.expeditee.gui.FrameIO;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.items.Text;
 
@@ -40,5 +40,5 @@
 	public void display() {
 		if (size() == 0) {
-			FrameGraphics.ErrorMessage("No variables exist!");
+			MessageBay.errorMessage("No variables exist!");
 			return;
 		}
@@ -238,5 +238,5 @@
 		}
 		if (!success && Simple.isVerbose())
-			FrameGraphics.WarningMessage("Error creating " + framesetName);
+			MessageBay.warningMessage("Error creating " + framesetName);
 		if (successVar != null) {
 			primitives_.setValue(successVar, new SBoolean(success));
Index: /trunk/src/org/expeditee/simple/Variables.java
===================================================================
--- /trunk/src/org/expeditee/simple/Variables.java	(revision 120)
+++ /trunk/src/org/expeditee/simple/Variables.java	(revision 121)
@@ -3,5 +3,5 @@
 import java.util.ArrayList;
 
-import org.expeditee.gui.FrameGraphics;
+import org.expeditee.gui.MessageBay;
 
 public abstract class Variables<T extends SVariable<?>> {
@@ -23,5 +23,5 @@
 	public void display() {
 		for (T v : list_) {
-			FrameGraphics.DisplayMessage(v.getName() + ": " + v.stringValue());
+			MessageBay.displayMessage(v.getName() + ": " + v.stringValue());
 		}
 	}
Index: /trunk/src/org/expeditee/stats/TreeStats.java
===================================================================
--- /trunk/src/org/expeditee/stats/TreeStats.java	(revision 120)
+++ /trunk/src/org/expeditee/stats/TreeStats.java	(revision 121)
@@ -6,6 +6,6 @@
 
 import org.expeditee.gui.Frame;
-import org.expeditee.gui.FrameGraphics;
 import org.expeditee.gui.FrameIO;
+import org.expeditee.gui.MessageBay;
 import org.expeditee.io.Logger;
 import org.expeditee.items.Item;
@@ -27,5 +27,5 @@
 		super(topFrame);
 		visited.add(_name.toLowerCase());
-		FrameGraphics.OverwriteMessage("Computed: " + _name);
+		MessageBay.overwriteMessage("Computed: " + _name);
 
 		// Initialise variables with the data for this frames comet
