Index: /trunk/src/org/expeditee/agents/mail/MailSession.java
===================================================================
--- /trunk/src/org/expeditee/agents/mail/MailSession.java	(revision 403)
+++ /trunk/src/org/expeditee/agents/mail/MailSession.java	(revision 404)
@@ -458,4 +458,5 @@
 					Text newItem = readMessage(msgs[msgNum], msgNum + 1, frame,
 							point);
+					// TODO: May want to reverse the order of mail messages
 					if (newItem != null) {
 						mailItems.add(newItem);
@@ -565,5 +566,5 @@
 						while (thisLine != null) {
 							// A blank line is a signal to start a new text item
-							if (thisLine.trim() == "") {
+							if (thisLine.trim().equals("")) {
 								addTextItem(frames, nextText.toString());
 								nextText = new StringBuffer();
@@ -597,7 +598,10 @@
 				if (nextText.length() == 0)
 					return;
-
-				frames.addText(nextText.substring(0, nextText.length() - 1),
-						null, null, null, false);
+				// Remove the last char if its a newline
+				if (nextText.charAt(nextText.length() - 1) == '\n')
+					nextText = nextText.substring(0, nextText.length() - 1);
+				//TODO: Make the space a setting in frame creator.
+				frames.addSpace(10);
+				frames.addText(nextText, null, null, null, false);
 			}
 		}.start();
Index: /trunk/src/org/expeditee/gui/FrameMouseActions.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameMouseActions.java	(revision 403)
+++ /trunk/src/org/expeditee/gui/FrameMouseActions.java	(revision 404)
@@ -294,7 +294,10 @@
 
 		// pre-cache the frame if it is linked
-		if (on != null && on.getLink() != null && on.isLinkValid()) {
-			FrameIO.Precache(on.getAbsoluteLink());
-		}
+
+		// If pre-caching is done, it must be done in the background
+
+		// if (on != null && on.getLink() != null && on.isLinkValid()) {
+		// FrameIO.Precache(on.getAbsoluteLink());
+		// }
 
 		// check for delete command
@@ -697,8 +700,9 @@
 					/*
 					 * Find the first linked item or the first unlinked Dot This
-					 * code assumes that items are are ordered from top to bottom.
-					 * TODO make sure the list will always be ordered correctly!!
+					 * code assumes that items are are ordered from top to
+					 * bottom. TODO make sure the list will always be ordered
+					 * correctly!!
 					 */
-					if (i.hasLink() || i instanceof Dot){
+					if (i.hasLink() || i instanceof Dot) {
 						clicked = i;
 						break;
@@ -1398,5 +1402,5 @@
 						copies.add(d[i]);
 					}
-					
+
 					current.nextDot();
 
Index: /trunk/src/org/expeditee/items/Text.java
===================================================================
--- /trunk/src/org/expeditee/items/Text.java	(revision 403)
+++ /trunk/src/org/expeditee/items/Text.java	(revision 404)
@@ -200,8 +200,8 @@
 		return _maxWidth;
 	}
-	
-	/**
-	 * Returns the maximum width of this Text item when justifcation is used.
-	 * If the width is negative, it means no explicit width has been set
+
+	/**
+	 * Returns the maximum width of this Text item when justifcation is used. If
+	 * the width is negative, it means no explicit width has been set
 	 * 
 	 * @return The maximum width of this Text item when justification is used
@@ -380,4 +380,10 @@
 	}
 
+	/**
+	 * Used by the frame reader to construct multi-line text items. It must run
+	 * quickly, so that the system still responds well for long text items.
+	 * 
+	 * @param text
+	 */
 	public void appendLine(String text) {
 		if (text == null)
@@ -388,5 +394,4 @@
 
 		_text.append(text);
-		rebuild(false);
 	}
 
@@ -1425,5 +1430,5 @@
 	private boolean hasFixedWidth() {
 		assert (_maxWidth != null);
-		if(_maxWidth == null){
+		if (_maxWidth == null) {
 			justify(false);
 		}
@@ -1529,6 +1534,6 @@
 		if (_textLayouts.size() < 1) {
 			rebuild(true);
-			System.out.println("Error: " + _text);
-			return;
+			//System.out.println("Error: " + _text);
+			//return;
 		}
 
@@ -1973,9 +1978,9 @@
 			if (frameWidth - getX() > ADJUST_WIDTH_THRESHOLD) {
 				justify(false);
-				//setRightMargin(frameWidth, false);
-			}
-		}
-	}
-	
+				// setRightMargin(frameWidth, false);
+			}
+		}
+	}
+
 	public void justify(boolean fixWidth) {
 		Integer width = FrameGraphics.getMaxFrameSize().width;
@@ -1986,5 +1991,5 @@
 		if (enclosure != null) {
 			Rectangle bounds = enclosure.getBounds();
-			if(bounds.width > 200 && getX() < bounds.width / 3 + bounds.x){
+			if (bounds.width > 200 && getX() < bounds.width / 3 + bounds.x) {
 				width = bounds.x + bounds.width;
 			}
