Index: /trunk/src/org/expeditee/actions/Actions.java
===================================================================
--- /trunk/src/org/expeditee/actions/Actions.java	(revision 283)
+++ /trunk/src/org/expeditee/actions/Actions.java	(revision 284)
@@ -410,9 +410,10 @@
 			Object[] params = null;
 
+			parameters = parameters.trim();
 			// determine correct parameters for constructor
 			for (Constructor c : constructors) {
 				Class[] paramTypes = c.getParameterTypes();
 				int paramCount = paramTypes.length;
-				if (paramCount > 0) {
+				if (paramCount > 0 && parameters.length() > 0) {
 					params = new Object[paramCount];
 					String[] paramStrings = parameters.split("\\s+");
Index: /trunk/src/org/expeditee/actions/MailActions.java
===================================================================
--- /trunk/src/org/expeditee/actions/MailActions.java	(revision 283)
+++ /trunk/src/org/expeditee/actions/MailActions.java	(revision 284)
@@ -1,3 +1,5 @@
 package org.expeditee.actions;
+
+import java.util.Collection;
 
 import javax.mail.Flags.Flag;
@@ -46,18 +48,31 @@
 		return mail;
 	}
-
-	public static void getUnreadMail() {
-		MailSession.getInstance().getMail(Flag.SEEN, false,
-				DisplayIO.getCurrentFrame(), FrameMouseActions.getPosition());
+	
+	public static Collection<Text> getRecentMail(int number) {
+		return getMail(null, null, number);
+	}
+	
+	public static Collection<Text> getUnreadMail() {
+		return getMail(Flag.SEEN, false, Integer.MAX_VALUE);
 	}
 
-	public static void getAllMail() {
-		MailSession.getInstance().getMail(null, null,
-				DisplayIO.getCurrentFrame(), FrameMouseActions.getPosition());
+	public static Collection<Text> getAllMail() {
+		return getMail(null, null, Integer.MAX_VALUE);
+	}
+	
+	public static Collection<Text> getMail() {
+		return getAllMail();
 	}
 
-	public static void getNewMail() {
-		MailSession.getInstance().getMail(Flag.RECENT, true,
-				DisplayIO.getCurrentFrame(), FrameMouseActions.getPosition());
+	public static Collection<Text> getNewMail() {
+		return getMail(Flag.RECENT, true, Integer.MAX_VALUE);
+	}
+	
+	private static Collection<Text> getMail(Flag flag, Boolean isPresent, int noOfMessages){
+		Collection<Text> mailItems = MailSession.getInstance().getMail(flag, isPresent,
+				DisplayIO.getCurrentFrame(), FrameMouseActions.getPosition(), noOfMessages);
+		//MessageBay.displayMessage(mailItems.size() + " messages read", Color.green);
+		
+		return mailItems;
 	}
 
@@ -80,4 +95,8 @@
 		}
 	}
+	
+	public static String getMailCount() {
+		return getAllMailCount();
+	}
 
 	public static String getNewMailCount() {
@@ -96,26 +115,29 @@
 			return;
 		}
-		String fromName = frame.getAnnotationValue("fromName");
-		
+
 		reply.setActions(null);
 		FrameMouseActions.tdfc(reply);
+
+		Frame replyFrame = DisplayIO.getCurrentFrame();
+		String titleText = frame.getTitle();
+		//Add Re on the end if it is not already there
+		if (titleText.length() >= 3
+				&& !"re:".equals(titleText.substring(0, 3).toLowerCase())) {
+			titleText = "Re: " + titleText;
+		}
+		replyFrame.setTitle(titleText);
+		FrameKeyboardActions.Drop(null, false);
 		
-		Frame replyFrame = DisplayIO.getCurrentFrame();
-		replyFrame.setTitle("RE: " + frame.getTitle());
-		FrameKeyboardActions.Drop(null, false);
+		//Add a link to the original message
 		Text original = replyFrame.createNewText("@original");
 		original.setPosition(FrameMouseActions.getPosition());
 		original.setLink(frame.getName());
 		FrameKeyboardActions.Drop(original, false);
-		
+
 		Text to = replyFrame.createNewText("@to: " + fromAddress);
 		to.setPosition(FrameMouseActions.getPosition());
-		to.addAction("MailFrame");
+		to.addAction("MailTree");
 		FrameKeyboardActions.Drop(to, false);
-		if (fromName != null) {
-			Text toName = replyFrame.createNewText("@toName: " + fromName);
-			toName.setPosition(FrameMouseActions.getPosition());
-			FrameKeyboardActions.Drop(toName, false);
-		}
+		DisplayIO.setCursorPosition(FrameMouseActions.MouseX, FrameMouseActions.MouseY + 15);
 	}
 
Index: /trunk/src/org/expeditee/actions/Misc.java
===================================================================
--- /trunk/src/org/expeditee/actions/Misc.java	(revision 283)
+++ /trunk/src/org/expeditee/actions/Misc.java	(revision 284)
@@ -22,7 +22,7 @@
 import org.expeditee.gui.FrameMouseActions;
 import org.expeditee.gui.MessageBay;
+import org.expeditee.gui.Reminders;
 import org.expeditee.gui.TimeKeeper;
 import org.expeditee.importer.FrameDNDTransferHandler;
-import org.expeditee.items.Dot;
 import org.expeditee.items.Item;
 import org.expeditee.items.ItemUtils;
@@ -860,3 +860,7 @@
 		return d[0];
 	}
+	
+	public static void StopReminder() {
+		Reminders.stop();
+	}
 }
Index: /trunk/src/org/expeditee/agents/MailTree.java
===================================================================
--- /trunk/src/org/expeditee/agents/MailTree.java	(revision 283)
+++ /trunk/src/org/expeditee/agents/MailTree.java	(revision 284)
@@ -30,10 +30,12 @@
 
 				String frameTitle = linkedFrame.getTitle();
-				sb.append(prefix).append(frameTitle).append('\n')
+				sb.append('\n').append(prefix).append(frameTitle).append('\n')
 						.append(prefix);
-				for (int i = 0; i < frameTitle.length(); i++) {
-					sb.append('-');
-				}
-				sb.append("\n\n");
+				// for (int i = 0; i < frameTitle.length(); i++) {
+				// sb.append('-');
+				// }
+				sb.append("----------------");
+
+				sb.append("\n");
 				sb.append(getFrameText(linkedFrame, prefix));
 			} else {
@@ -46,6 +48,19 @@
 			Frame linkedFrame = FrameIO.LoadFrame(original.getAbsoluteLink());
 			if (linkedFrame != null) {
-				sb.append("\n\n").append("Original Message").append(
-						"----------------").append("\n\n");
+				sb.append("\n\n");
+				String date = linkedFrame.getAnnotationValue("date");
+				if (date != null) {
+					sb.append("On ").append(date);
+				}
+				String from = linkedFrame.getAnnotationValue("from");
+				if (from != null) {
+					if (sb.length() > 0)
+						sb.append(", ");
+					//else
+					//	sb.append("> ");
+					sb.append(from);
+					sb.append(" wrote:");
+				}
+				sb.append("\n\n");
 				sb.append(getFrameText(linkedFrame, ">"));
 			}
Index: /trunk/src/org/expeditee/agents/mail/MailSession.java
===================================================================
--- /trunk/src/org/expeditee/agents/mail/MailSession.java	(revision 283)
+++ /trunk/src/org/expeditee/agents/mail/MailSession.java	(revision 284)
@@ -11,4 +11,5 @@
 import java.util.Properties;
 
+import javax.mail.Address;
 import javax.mail.Authenticator;
 import javax.mail.Folder;
@@ -22,4 +23,5 @@
 import javax.mail.Transport;
 import javax.mail.Flags.Flag;
+import javax.mail.Message.RecipientType;
 import javax.mail.event.MessageCountAdapter;
 import javax.mail.event.MessageCountEvent;
@@ -27,9 +29,9 @@
 import javax.mail.internet.MimeMessage;
 
-import org.expeditee.importer.FrameDNDTransferHandler;
 import org.expeditee.gui.AttributeValuePair;
 import org.expeditee.gui.Frame;
 import org.expeditee.gui.FrameCreator;
 import org.expeditee.gui.MessageBay;
+import org.expeditee.importer.FrameDNDTransferHandler;
 import org.expeditee.items.Item;
 import org.expeditee.items.Text;
@@ -151,9 +153,9 @@
 		try {
 			if (!_transport.isConnected()) {
-				MessageBay.displayMessage("Connecting to SMTP server...");
+				Text message = MessageBay.displayMessage("Connecting to SMTP server...");
 				_bConnecting = true;
 				_transport.connect();
-				MessageBay.overwriteMessage("SMTP server connected",
-						Color.green);
+				message.setText("SMTP server connected");
+				message.setColor(Color.green);
 			} else {
 				MessageBay.warningMessage("SMTP server already connected");
@@ -165,5 +167,5 @@
 		if (_mailServer != null && !_store.isConnected()) {
 			try {
-				MessageBay.displayMessage("Connecting to " + _mailServer
+				Text message = MessageBay.displayMessage("Connecting to " + _mailServer
 						+ "...");
 				_store.connect(_mailServer, _username, _password);
@@ -192,11 +194,16 @@
 						for (;;) {
 							try {
-								Thread.sleep(1000); // sleep for freq
-								// milliseconds
-								// This is to force the IMAP server to send us
-								// EXISTS notifications
+								Thread.sleep(1000);
+								/*
+								 * sleep for freq milliseconds. This is to force
+								 * the IMAP server to send us EXISTS
+								 * notifications
+								 */
 								// TODO: Is synchronisation needed?
 								_folder.getMessageCount();
+								_folder.exists();
+								//_folder.getUnreadMessageCount();
 							} catch (Exception e) {
+								e.printStackTrace();
 							}
 						}
@@ -204,5 +211,6 @@
 				}.start();
 
-				MessageBay.overwriteMessage("Connection complete", Color.GREEN);
+				message.setText("Connection complete");
+				message.setColor(Color.GREEN);
 
 				displayUnreadMailCount();
@@ -217,7 +225,8 @@
 
 	private void displayUnreadMailCount() {
-		Text text = new Text(-1, getUnreadCount() + " unread message"
-				+ (getUnreadCount() == 1 ? "" : "s"), Color.BLUE, null);
-		text.addAction("getUnreadMail");
+		int unreadCount = getUnreadCount();
+		Text text = new Text(-1, unreadCount + " unread message"
+				+ (unreadCount == 1 ? "" : "s"), Color.BLUE, null);
+		text.addAction("getRecentMail " + unreadCount);
 		MessageBay.displayMessage(text);
 	}
@@ -236,5 +245,6 @@
 		}
 
-		return _theMailSession.sendText(to, cc, bcc, subject, body, attachments);
+		return _theMailSession
+				.sendText(to, cc, bcc, subject, body, attachments);
 	}
 
@@ -263,5 +273,5 @@
 			// -- Create a new message --
 			Message msg = new MimeMessage(_session);
-			
+
 			// -- Set the FROM and TO fields --
 			msg.setFrom(new InternetAddress(_address));
@@ -399,15 +409,21 @@
 	 * @return
 	 */
-	public Collection<Item> getMail(Flag flag, Boolean isPresent, Frame frame,
-			Point point) {
-		Collection<Item> mailItems = new LinkedList<Item>();
+	public Collection<Text> getMail(Flag flag, Boolean isPresent, Frame frame,
+			Point point, int numberOfMessages) {
+		if (_folder == null)
+			return null;
+
+		Collection<Text> mailItems = new LinkedList<Text>();
 		// -- Get the message wrappers and process them --
 		Message[] msgs;
 		try {
 			msgs = _folder.getMessages();
-			for (int msgNum = 0; msgNum < msgs.length; msgNum++) {
+
+			int start = Math.max(msgs.length - numberOfMessages, 0);
+
+			for (int msgNum = start; msgNum < msgs.length; msgNum++) {
 				if (flag == null
 						|| msgs[msgNum].getFlags().contains(flag) == isPresent) {
-					Item newItem = readMessage(msgs[msgNum], msgNum, frame,
+					Text newItem = readMessage(msgs[msgNum], msgNum + 1, frame,
 							point);
 					if (newItem != null) {
@@ -421,12 +437,13 @@
 			e.printStackTrace();
 		}
+		
 		return mailItems;
 	}
 
-	private Item readMessage(final Message message, final int messageNo,
+	private Text readMessage(final Message message, final int messageNo,
 			final Frame frame, final Point point) {
 
 		final Text source = FrameDNDTransferHandler.importString(
-				"Loading message " + messageNo, point);
+				"Reading message " + messageNo + "...", point);
 
 		new Thread() {
@@ -439,21 +456,34 @@
 							.getFramesetName(), frame.path, subject, false);
 
+					frames.addText("@date: " + message.getSentDate(), null,
+							null, null, false);
+
 					// Get the header information
 					String from = ((InternetAddress) message.getFrom()[0])
-							.getPersonal();
-					if (from != null) {
-						frames.addText("@fromName: " + from, null, null, null,
-								false);
-					}
-					from = ((InternetAddress) message.getFrom()[0])
-							.getAddress();
+							.toString();
 					Text fromAddressItem = frames.addText("@from: " + from,
 							null, null, null, false);
 
-					Text reply = frames.addText("@reply" + from, null, null,
-							null, false);
-					reply.setPosition(10 + fromAddressItem.getX()
-							+ fromAddressItem.getBoundsWidth(), fromAddressItem
-							.getY());
+					addRecipients(message, frames, _address, RecipientType.TO,
+							"@to: ");
+					addRecipients(message, frames, null, RecipientType.CC,
+							"@cc: ");
+
+					// Read reply to addresses
+					Text reply = addAddresses(message, frames, from, message
+							.getReplyTo(), "@replyTo: ");
+					/*
+					 * If the only person to reply to is the person who sent the
+					 * mail add a tag that just says reply
+					 */
+					if (reply == null) {
+						reply = frames.addText("@reply", null, null, null,
+								false);
+						reply.setPosition(10 + fromAddressItem.getX()
+								+ fromAddressItem.getBoundsWidth(),
+								fromAddressItem.getY());
+					}
+					reply.addAction("reply");
+					// frames.addSpace(15);
 
 					// -- Get the message part (i.e. the message itself) --
@@ -491,4 +521,5 @@
 					MessageBay.errorMessage("Error reading mail: "
 							+ e.getMessage());
+					e.printStackTrace();
 				}
 			}
@@ -546,3 +577,47 @@
 		return _folder;
 	}
+
+	/**
+	 * @param message
+	 * @param frames
+	 * @param type
+	 * @throws MessagingException
+	 */
+	private Text addAddresses(final Message message, final FrameCreator frames,
+			final String excludeAddress, final Address[] addresses,
+			String typeTag) throws MessagingException {
+		if (addresses == null)
+			return null;
+
+		StringBuffer sb = new StringBuffer();
+		boolean foundOtherRecipients = false;
+		for (Address addy : addresses) {
+			// Only show the to flag if this message was sent to
+			// other people
+			if (excludeAddress == null
+					|| !addy.toString().toLowerCase().contains(
+							excludeAddress.toLowerCase())) {
+				foundOtherRecipients = true;
+			}
+			if (sb.length() > 0) {
+				sb.append(", ");
+			}
+			sb.append(addy.toString());
+		}
+		Text reply = null;
+		if (foundOtherRecipients) {
+			reply = frames.addText(typeTag + sb.toString(), null, null, null,
+					false);
+		}
+		return reply;
+	}
+
+	private Text addRecipients(final Message message,
+			final FrameCreator frames, String excludeAddress,
+			RecipientType type, String typeTag) throws MessagingException {
+		// Read and display all the recipients of the message
+		Address[] toRecipients = message.getRecipients(type);
+		return addAddresses(message, frames, excludeAddress, toRecipients,
+				typeTag);
+	}
 }
Index: /trunk/src/org/expeditee/gui/FrameCreator.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameCreator.java	(revision 283)
+++ /trunk/src/org/expeditee/gui/FrameCreator.java	(revision 284)
@@ -7,15 +7,17 @@
 
 public class FrameCreator {
-	private int START_Y = 40;
-
-	private final static int START_X = 20;
+	public static final int INDENT_FROM_TITLE = 20;
+
+	private int START_Y;
+
+	private int START_X;
 
 	private Frame _current = null;
 
-	private int _lastX = START_X;
+	private int _lastX;
 
 	private int _maxX = 0;
 
-	private int _lastY = START_Y;
+	private int _lastY;
 
 	// Master copy of next & previous links
@@ -23,5 +25,5 @@
 
 	private Item _Mprev;
-	
+
 	private Item _Mfirst;
 
@@ -60,4 +62,5 @@
 			Float bottom) {
 		Text button = new Text(text);
+
 		button.setBackgroundColor(Color.LIGHT_GRAY);
 		button.setBorderColor(Color.DARK_GRAY);
@@ -73,5 +76,5 @@
 
 		button.updatePolygon();
-		
+
 		return button;
 	}
@@ -82,8 +85,10 @@
 		_Mnext = createButton("@Next", null, null, 10F, 15F);
 
-		_Mprev = createButton("@Previous", null, null, _Mnext.getBoundsWidth() + _Mnext.getAnchorRight() + 20F, 15F);
-		
-		_Mfirst = createButton("@First", null, null, _Mprev.getBoundsWidth() + _Mprev.getAnchorRight() + 20F, 15F);
-		
+		_Mprev = createButton("@Previous", null, null, _Mnext.getBoundsWidth()
+				+ _Mnext.getAnchorRight() + 20F, 15F);
+
+		_Mfirst = createButton("@First", null, null, _Mprev.getBoundsWidth()
+				+ _Mprev.getAnchorRight() + 20F, 15F);
+
 		Frame toUse = null;
 		try {
@@ -97,4 +102,5 @@
 		resetGlobals(toUse);
 		_firstFrame = toUse;
+
 		// set positions of next\prev frame links
 		// _Mnext.setPosition(FrameGraphics.getMaxSize().width - 100,
@@ -118,12 +124,12 @@
 
 			// add link to previous frame
-			_prev = addPreviousButton(newFrame, _current.getName()); 
+			_prev = addPreviousButton(newFrame, _current.getName());
 
 			// add link to new frame
-			_next = addNextButton(_current,newFrame.getName());
-			
-//			 add link to new frame
-			addFirstButton(newFrame,_firstFrame.getName());
-			
+			_next = addNextButton(_current, newFrame.getName());
+
+			// add link to new frame
+			addFirstButton(newFrame, _firstFrame.getName());
+
 			FrameIO.SaveFrame(_current, false);
 
@@ -138,5 +144,6 @@
 	private void resetGlobals(Frame toUse) {
 		Text title = toUse.getTitleItem();
-		START_Y = title.getY() + title.getBoundsHeight();
+		START_X = INDENT_FROM_TITLE + title.getX();
+		START_Y = getYStart(title);
 		_lastY = START_Y;
 		_lastX = START_X;
@@ -201,12 +208,12 @@
 	public Text addText(String toAdd, Color c, String link, String action,
 			boolean bSave) {
-		Text text = _current.createNewText();
-		text.setText(toAdd);
-		text.setColor(c);
+		Text text = _current.createNewText(toAdd);
+		if (c != null)
+			text.setColor(c);
 		text.setLink(link);
 		text.setAction(action);
 
 		addItem(text, bSave);
-		
+
 		return text;
 	}
@@ -235,13 +242,13 @@
 		return addButton(_Mnext, current, link);
 	}
-	
+
 	public Item addPreviousButton(Frame current, String link) {
 		return addButton(_Mprev, current, link);
 	}
-	
+
 	public Item addFirstButton(Frame current, String link) {
 		return addButton(_Mfirst, current, link);
 	}
-	
+
 	public Item addButton(Item template, Frame current, String link) {
 		// add link to new frame
@@ -250,6 +257,14 @@
 		previousButton.setLink(link);
 		current.addItem(previousButton);
-		
+
 		return previousButton;
 	}
+
+	public void addSpace(int space) {
+		_lastY += space;
+	}
+
+	public static int getYStart(Item title) {
+		return title.getY() + title.getBoundsHeight();
+	}
 }
Index: /trunk/src/org/expeditee/gui/FrameKeyboardActions.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameKeyboardActions.java	(revision 283)
+++ /trunk/src/org/expeditee/gui/FrameKeyboardActions.java	(revision 284)
@@ -1127,5 +1127,5 @@
 	 *            indicate the cursor is in free space.
 	 */
-	public static void Drop(Item toDropFrom, boolean bPasting) {
+	public static boolean Drop(Item toDropFrom, boolean bPasting) {
 		try {
 			FrameUtils.setLastEdited(null);
@@ -1135,5 +1135,5 @@
 			// if a line is being rubber-banded, this is a no-op
 			if (Frame.rubberbandingLine())
-				return; // No-op
+				return false; // No-op
 
 			// if the cursor is in free space then the drop will happen from the
@@ -1147,5 +1147,5 @@
 			if (toDropFrom == null) {
 				MessageBay.errorMessage("No item could be found to drop from");
-				return;
+				return false;
 			}
 
@@ -1153,5 +1153,5 @@
 				MessageBay
 						.displayMessage("Only text items can be dropped from");
-				return;
+				return false;
 			}
 
@@ -1162,5 +1162,5 @@
 			if (column == null) {
 				MessageBay.errorMessage("No column found to align items to");
-				return;
+				return false;
 			}
 
@@ -1173,5 +1173,4 @@
 
 			Text dummyItem = null;
-
 			if (!bPasting && FreeItems.textOnlyAttachedToCursor()) {
 				dummyItem = (Text) FreeItems.getItemAttachedToCursor();
@@ -1182,4 +1181,5 @@
 				dummyItem.setText(newItemText + dummyItem.getText());
 			}
+			
 			dummyItem = createText();
 			if (FreeItems.textOnlyAttachedToCursor()) {
@@ -1199,8 +1199,7 @@
 			if (column.size() == 0) {
 				Frame current = DisplayIO.getCurrentFrame();
-				Item itemTemplate = current.getItemTemplate();
-				int xPos = title.getX() + 25;
-				int yPos = title.getY() + title.getBoundsHeight()
-						+ itemTemplate.getBoundsHeight();
+				//Item itemTemplate = current.getItemTemplate();
+				int xPos = title.getX() + FrameCreator.INDENT_FROM_TITLE;
+				int yPos = FrameCreator.getYStart(title);
 				// Check for @start on the zero frame
 				Frame zero = FrameIO.LoadFrame(current.getFramesetName() + '0');
@@ -1281,5 +1280,5 @@
 						DisplayIO.setCursorPosition(DisplayIO.getMouseX(),
 								FrameMouseActions.getY());
-						return;
+						return false;
 					}
 				}
@@ -1317,5 +1316,7 @@
 			// MessageBay.errorMessage(e.getMessage());
 			e.printStackTrace();
-		}
+			return false;
+		}
+		return true;
 	}
 
Index: /trunk/src/org/expeditee/gui/FrameMouseActions.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameMouseActions.java	(revision 283)
+++ /trunk/src/org/expeditee/gui/FrameMouseActions.java	(revision 284)
@@ -2559,4 +2559,7 @@
 
 	public static void pickup(Collection<Item> toGrab) {
+		if(toGrab == null || toGrab.size() == 0)
+			return;
+		
 		boolean bReparse = false;
 		Frame frame = DisplayIO.getCurrentFrame();
Index: /trunk/src/org/expeditee/gui/FrameUtils.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameUtils.java	(revision 283)
+++ /trunk/src/org/expeditee/gui/FrameUtils.java	(revision 284)
@@ -580,4 +580,6 @@
 			else if (attribute.equals("mailsettings"))
 				MailSession.init(item.getChild());
+			else if (attribute.equals("reminders"))
+				Reminders.init(item.getChild());
 			else if (attribute.equals("antialias"))
 				UserSettings.AntiAlias = avp.getBooleanValue();
Index: /trunk/src/org/expeditee/gui/MessageBay.java
===================================================================
--- /trunk/src/org/expeditee/gui/MessageBay.java	(revision 283)
+++ /trunk/src/org/expeditee/gui/MessageBay.java	(revision 284)
@@ -250,10 +250,17 @@
 	}
 
-	private static void displayMessage(String message, String link,
+	private static Text displayMessage(String message, String link,
 			List<String> actions, Color color) {
-		displayMessage(message, link, actions, color, true);
-	}
-
-	private static void displayMessage(String message, String link,
+		return displayMessage(message, link, actions, color, true);
+	}
+	
+	public static Text displayMessage(String message, String link,
+		 Color color, boolean displayAlways, String action) {
+		List<String> actions = new LinkedList<String>();
+		actions.add(action);
+		return displayMessage(message, link, actions, color, displayAlways);
+	}
+
+	public static Text displayMessage(String message, String link,
 			List<String> actions, Color color, boolean displayAlways) {
 
@@ -265,9 +272,9 @@
 
 		if (_supressMessages)
-			return;
+			return null;
 
 		if (!displayAlways && message.equals(_lastMessage)) {
 			Misc.beep();
-			return;
+			return null;
 		}
 		_lastMessage = message;
@@ -301,5 +308,5 @@
 					if (g != null)
 						refresh(false, g, Item.DEFAULT_BACKGROUND);
-					return;
+					return _messages[i];
 				}
 
@@ -329,4 +336,6 @@
 
 		refresh(false, FrameGraphics.createGraphics(), Item.DEFAULT_BACKGROUND);
+		
+		return last;
 	}
 
@@ -363,7 +372,7 @@
 	 *            the message to be displayed
 	 */
-	public static void linkedErrorMessage(String message) {
+	public static Text linkedErrorMessage(String message) {
 		if (_supressMessages)
-			return;
+			return null;
 		Misc.beep();
 		String[] tokens = message.split(Text.FRAME_NAME_SEPARATOR);
@@ -371,12 +380,12 @@
 		if (tokens.length > 1)
 			link = tokens[tokens.length - 1];
-		displayMessage(message, link, null, ERROR_COLOR);
-	}
-
-	public static void errorMessage(String message) {
+		return displayMessage(message, link, null, ERROR_COLOR);
+	}
+
+	public static Text errorMessage(String message) {
 		if (_supressMessages)
-			return;
+			return null;
 		Misc.beep();
-		displayMessage(message, null, null, ERROR_COLOR, false);
+		return displayMessage(message, null, null, ERROR_COLOR, false);
 	}
 
@@ -388,30 +397,30 @@
 	 *            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);
+	public static Text displayMessage(String message) {
+		return displayMessageAlways(message);
+	}
+
+	public static Text displayMessageOnce(String message) {
+		return displayMessage(message, null, null, Color.BLACK, false);
+	}
+
+	public static Text displayMessage(String message, Color textColor) {
+		return displayMessage(message, null, null, textColor);
 		// Misc.Beep();
 	}
 
-	public static void displayMessage(Text message) {
-		displayMessage(message.getFirstLine(), message.getLink(), message
+	public static Text displayMessage(Text message) {
+		return displayMessage(message.getFirstLine(), message.getLink(), message
 				.getAction(), message.getColor());
 		// Misc.Beep();
 	}
 
-	public static void displayMessageAlways(String message) {
-		displayMessage(message, null, null, Color.BLACK);
+	public static Text displayMessageAlways(String message) {
+		return displayMessage(message, null, null, Color.BLACK);
 		// Misc.Beep();
 	}
 
-	public static void warningMessage(String message) {
-		displayMessage(message, null, null, Color.MAGENTA);
+	public static Text warningMessage(String message) {
+		return displayMessage(message, null, null, Color.MAGENTA);
 		// Misc.Beep();
 	}
Index: /trunk/src/org/expeditee/io/DefaultFrameWriter.java
===================================================================
--- /trunk/src/org/expeditee/io/DefaultFrameWriter.java	(revision 283)
+++ /trunk/src/org/expeditee/io/DefaultFrameWriter.java	(revision 284)
@@ -213,6 +213,7 @@
 
 		for (Item i : getItemsToWrite(toWrite)) {
-			if (_stop)
+			if (_stop){
 				return;
+			}
 			writeItem(i);
 		}
Index: /trunk/src/org/expeditee/io/DefaultFramesetWriter.java
===================================================================
--- /trunk/src/org/expeditee/io/DefaultFramesetWriter.java	(revision 283)
+++ /trunk/src/org/expeditee/io/DefaultFramesetWriter.java	(revision 284)
@@ -33,3 +33,8 @@
 		}
 	}
+	
+	@Override
+	protected String finaliseFrame() throws IOException {
+		return "Frameset" + finalise();
+	}
 }
Index: /trunk/src/org/expeditee/items/Item.java
===================================================================
--- /trunk/src/org/expeditee/items/Item.java	(revision 283)
+++ /trunk/src/org/expeditee/items/Item.java	(revision 284)
@@ -1100,4 +1100,10 @@
 				if (returnValue instanceof Item) {
 					Misc.attachToCursor(((Item) returnValue).getAllConnected());
+				} else if (returnValue instanceof Collection) {
+					try {
+						Misc.attachToCursor((Collection) returnValue);
+					} catch (Exception e) {
+						e.printStackTrace();
+					}
 				} else {
 					Misc.attachStatsToCursor(returnValue.toString());
@@ -1546,5 +1552,5 @@
 				for (Item i : getAllConnected()) {
 					if (i instanceof Line) {
-						((Line)i).invalidateCommonTrait(trait);
+						((Line) i).invalidateCommonTrait(trait);
 					}
 				}
@@ -1670,8 +1676,8 @@
 			line.updatePolygon();
 		}
-		
-//		for (Item item : getAllConnected()) {
-//			item.updatePolygon();
-//		}
+
+		// for (Item item : getAllConnected()) {
+		// item.updatePolygon();
+		// }
 
 		invalidateCommonTraitForAll(ItemAppearence.PostMoved);
Index: /trunk/src/org/expeditee/items/widgets/charts/TimeSeries.java
===================================================================
--- /trunk/src/org/expeditee/items/widgets/charts/TimeSeries.java	(revision 283)
+++ /trunk/src/org/expeditee/items/widgets/charts/TimeSeries.java	(revision 284)
@@ -205,5 +205,5 @@
 	 * @throws ParseException
 	 */
-	private Date parseDate(String dateString) throws ParseException {
+	public static Date parseDate(String dateString) throws ParseException {
 		// Convert the attribute into a date
 		DateFormat df = null;
