Index: /trunk/src/org/expeditee/actions/Actions.java
===================================================================
--- /trunk/src/org/expeditee/actions/Actions.java	(revision 285)
+++ /trunk/src/org/expeditee/actions/Actions.java	(revision 286)
@@ -29,4 +29,5 @@
 import org.expeditee.items.ItemUtils;
 import org.expeditee.items.Text;
+import org.expeditee.simple.SString;
 
 /**
@@ -65,4 +66,7 @@
 	private static HashMap<String, String> _JAGs = new HashMap<String, String>();
 
+	// maps lower case IW class names to capitalized IW names
+	private static HashMap<String, String> _IWs = new HashMap<String, String>();
+
 	public static final String ROOT_PACKAGE = "org.expeditee.";
 
@@ -71,4 +75,10 @@
 
 	private static final String AGENTS_PACKAGE = ROOT_PACKAGE + "agents.";
+
+	private static final String WIDGET_PACKAGE = ROOT_PACKAGE
+			+ "items.widgets.";
+
+	private static final String CHARTS_PACKAGE = ROOT_PACKAGE
+			+ "items.widgets.charts.";
 
 	private static final String NAVIGATIONS_CLASS = ROOT_PACKAGE
@@ -199,8 +209,25 @@
 				_JAGs.put(name.toLowerCase(), name);
 			}
+
+			classes = getClasses(WIDGET_PACKAGE);
+
+			for (int i = 0; i < classes.length; i++) {
+				String name = classes[i].getSimpleName();
+				// maps lower case name to correct capitalised name
+				_IWs.put(name.toLowerCase(), WIDGET_PACKAGE + name);
+			}
+
+			classes = getClasses(CHARTS_PACKAGE);
+
+			for (int i = 0; i < classes.length; i++) {
+				String name = classes[i].getSimpleName();
+				// maps lower case name to correct capitalised name
+				_IWs.put("charts." + name.toLowerCase(), CHARTS_PACKAGE + name);
+			}
 		} catch (Exception e) {
 			warnings.add("You must have Java 1.5 or higher to run Expeditee");
 			warnings.add(e.getMessage());
 		}
+
 		try {
 			classes = getClasses(ACTIONS_PACKAGE);
@@ -421,21 +448,29 @@
 						continue;
 					for (int i = 0; i < paramCount; i++) {
-						if (paramTypes[i].equals(int.class)
-								|| paramTypes[i].equals(Integer.class)) {
-							try {
-								params[i] = Integer.parseInt(paramStrings[i]);
-							} catch (Exception e) {
+						SString nextParam = new SString(paramStrings[i]);
+						try {
+							params[i] = null;
+							if (paramTypes[i].equals(int.class)
+									|| paramTypes[i].equals(Integer.class)) {
+								params[i] = nextParam.integerValue().intValue();
+							} else if (paramTypes[i].equals(long.class)
+									|| paramTypes[i].equals(Long.class)) {
+								params[i] = nextParam.integerValue();
+							} else if (paramTypes[i].equals(double.class)
+									|| paramTypes[i].equals(Double.class)) {
+								params[i] = nextParam.doubleValue();
+							} else if (paramTypes[i].equals(float.class)
+									|| paramTypes[i].equals(Float.class)) {
+								params[i] = nextParam.doubleValue()
+										.floatValue();
+							} else if (paramTypes[i].equals(boolean.class)
+									|| paramTypes[i].equals(Boolean.class)) {
+								params[i] = nextParam.booleanValue();
+							} else if (paramTypes[i].equals(String.class)) {
+								params[i] = nextParam.stringValue();
+							} else {
 								continue;
 							}
-						} else if (paramTypes[i].equals(double.class)
-								|| paramTypes[i].equals(Double.class)) {
-							try {
-								params[i] = Double.parseDouble(paramStrings[i]);
-							} catch (Exception e) {
-								continue;
-							}
-						} else if (paramTypes[i].equals(String.class)) {
-							params[i] = paramStrings[i];
-						} else {
+						} catch (Exception e) {
 							continue;
 						}
@@ -736,3 +771,13 @@
 		return null;
 	}
+
+	/**
+	 * Gets the full class path for a widget with a given case insensitive name.
+	 * 
+	 * @param widgetName
+	 * @return
+	 */
+	public static String getClassName(String widgetName) {
+		return _IWs.get(widgetName.toLowerCase());
+	}
 }
Index: /trunk/src/org/expeditee/agents/PdfFrameset.java
===================================================================
--- /trunk/src/org/expeditee/agents/PdfFrameset.java	(revision 285)
+++ /trunk/src/org/expeditee/agents/PdfFrameset.java	(revision 286)
@@ -6,4 +6,5 @@
 import org.expeditee.gui.MessageBay;
 import org.expeditee.io.PdfFramesetWriter;
+import org.expeditee.items.widgets.InteractiveWidget;
 
 
@@ -14,20 +15,29 @@
 
 	private int _maxFrame = Integer.MAX_VALUE;
+	
+	private boolean _showFrameNames = false;
 
-	public PdfFrameset(int firstFrame, int maxFrame) {
+	public PdfFrameset(int firstFrame, int maxFrame, boolean showFrameNames) {
 		super();
 		_firstFrame = firstFrame;
 		_maxFrame = maxFrame;
+		_showFrameNames = showFrameNames;
+	}
+	
+	public PdfFrameset(int firstFrame, int maxFrame) {
+		this(firstFrame, maxFrame, false);
+	}
+	
+	public PdfFrameset( boolean showFrameNames) {
+		this(1,Integer.MAX_VALUE, showFrameNames);
 	}
 
 	public PdfFrameset() {
-		super();
-		_firstFrame = 1;
-		_maxFrame = Integer.MAX_VALUE;
+		this(false);
 	}
 
 	@Override
 	protected Frame process(Frame frame) {
-		_pdfWriter = new PdfFramesetWriter(_firstFrame, _maxFrame);
+		_pdfWriter = new PdfFramesetWriter(_firstFrame, _maxFrame, _showFrameNames);
 		
 		try {
Index: /trunk/src/org/expeditee/agents/mail/MailSession.java
===================================================================
--- /trunk/src/org/expeditee/agents/mail/MailSession.java	(revision 285)
+++ /trunk/src/org/expeditee/agents/mail/MailSession.java	(revision 286)
@@ -76,4 +76,5 @@
 			if (item.getText().toLowerCase().trim().equals("autoconnect")) {
 				_autoConnect = true;
+				continue;
 			}
 			AttributeValuePair avp = new AttributeValuePair(item.getText());
@@ -156,5 +157,5 @@
 				_bConnecting = true;
 				_transport.connect();
-				message.setText("SMTP server connected");
+				message.setAttributeValue("SMTP server connected");
 				message.setColor(Color.green);
 			} else {
@@ -211,5 +212,5 @@
 				}.start();
 
-				message.setText("Connection complete");
+				message.setAttributeValue("Connection complete");
 				message.setColor(Color.GREEN);
 
Index: /trunk/src/org/expeditee/gui/AttributeValuePair.java
===================================================================
--- /trunk/src/org/expeditee/gui/AttributeValuePair.java	(revision 285)
+++ /trunk/src/org/expeditee/gui/AttributeValuePair.java	(revision 286)
@@ -54,5 +54,5 @@
 		if (text.charAt(0) == ANNOTATION_CHAR) {
 			_bAnnotation = true;
-			if (text.length() == 1 || !Character.isLetter(text.charAt(1)))
+			if (text.length() == 1 || !Character.isLetterOrDigit(text.charAt(1)))
 				return;
 			// All chars in the attribute must be letters or digits
@@ -61,6 +61,8 @@
 					return;
 			}
+			text = text.substring(1);
+			ind--;
 			if (ind < 1) {
-				setAttribute(text.substring(1));
+				setAttribute(text);
 				return;
 			}
Index: /trunk/src/org/expeditee/gui/Frame.java
===================================================================
--- /trunk/src/org/expeditee/gui/Frame.java	(revision 285)
+++ /trunk/src/org/expeditee/gui/Frame.java	(revision 286)
@@ -2,5 +2,4 @@
 
 import java.awt.Color;
-import java.awt.Dimension;
 import java.awt.Image;
 import java.awt.Polygon;
@@ -31,4 +30,5 @@
 import org.expeditee.items.Text;
 import org.expeditee.items.XRayable;
+import org.expeditee.items.Item.HighlightMode;
 import org.expeditee.items.widgets.InteractiveWidget;
 import org.expeditee.items.widgets.WidgetCorner;
@@ -501,4 +501,11 @@
 		for (Overlay o : _overlays.keySet())
 			results.addAll(o.Frame.getItemsWithin(poly));
+		
+		for(Item i: getVectorItems()){
+			if (i.intersects(poly)) {
+				//This assumes a results is a set
+				results.add(i.getEditTarget());
+			}
+		}
 
 		return results;
@@ -1070,6 +1077,7 @@
 			int index = toCheck.indexOf(from);
 
+			//If its the title index will be 0
 			if (index < 0)
-				return column;
+				index = 0;
 
 			for (int i = index; i < toCheck.size(); i++) {
@@ -1100,12 +1108,28 @@
 		// Items must be notified that they have been added or removed from this
 		// frame via the vector...
+		int maxX = 0;
+		int maxY = 0;
+		HighlightMode mode = toAdd.Source.getHighlightMode();
+		if(mode != HighlightMode.None)
+			mode = HighlightMode.Connected;
+		Color highlightColor = toAdd.Source.getHighlightColor();
 		for (Item i : ItemUtils.CopyItems(toAdd.Frame.getVectorItems(), toAdd)) {
 			i.onParentStateChanged(new ItemParentStateChangedEvent(this,
 					ItemParentStateChangedEvent.EVENT_TYPE_ADDED_VIA_OVERLAY,
 					toAdd.permission));
+			i.setEditTarget(toAdd.Source);
+			i.setHighlightMode(mode, highlightColor);
 			_vectorItems.add(i);
 			i.invalidateAll();
 			i.invalidateFill();
-		}
+			//Get the right most x and bottom most y pos
+			int itemRight = i.getX() + i.getBoundsWidth();
+			if(itemRight > maxX)
+				maxX = itemRight;
+			int itemBottom = i.getY() + i.getBoundsHeight();
+			if(itemBottom > maxY)
+				maxY = itemBottom;
+		}
+		toAdd.setSize(maxX, maxY);
 		return true;
 	}
@@ -1916,4 +1940,9 @@
 			}
 		}
+		
+		for(Vector v: getVectors()){
+			toSave.add(v.Source);
+		}
+		
 		return toSave;
 	}
@@ -2016,3 +2045,11 @@
 		_frameName = null;
 	}
+
+	public void parse() {
+		for(Overlay o: getOverlays()){
+			o.Frame.parse();
+		}
+		//Must parse the frame AFTER the overlays
+		FrameUtils.Parse(this);
+	}
 }
Index: /trunk/src/org/expeditee/gui/FrameGraphics.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameGraphics.java	(revision 285)
+++ /trunk/src/org/expeditee/gui/FrameGraphics.java	(revision 286)
@@ -36,5 +36,5 @@
 	// the maximum size that can be used to paint on
 	private static Dimension _MaxSize = new Dimension(1000, 1000);
-	
+
 	// Final passes to renderering the current frame
 	private static LinkedList<FinalFrameRenderPass> _finalPasses = new LinkedList<FinalFrameRenderPass>();
@@ -100,6 +100,8 @@
 			return;
 		_Mode = mode;
-		if (parse)
-			FrameUtils.Parse(DisplayIO.getCurrentFrame());
+		if (parse) {
+			Frame current = DisplayIO.getCurrentFrame();
+			current.parse();
+		}
 	}
 
@@ -134,8 +136,8 @@
 			if (DisplayIO.isTwinFramesOn()) {
 				Frame opposite = DisplayIO.getOppositeFrame();
-				//if (opposite != null) {
-					opposite.setBuffer(null);
-					opposite.refreshSize();
-				//}
+				// if (opposite != null) {
+				opposite.setBuffer(null);
+				opposite.refreshSize();
+				// }
 			}
 		}
@@ -264,5 +266,6 @@
 	 * @return
 	 */
-	private static Image Paint(Frame toPaint, Area clip, boolean isActualFrame, boolean createVolitile) {
+	private static Image Paint(Frame toPaint, Area clip, boolean isActualFrame,
+			boolean createVolitile) {
 		if (toPaint == null)
 			return null;
@@ -276,7 +279,7 @@
 				if (createVolitile) {
 					buffer = ge.getDefaultScreenDevice()
-					.getDefaultConfiguration()
-					.createCompatibleVolatileImage(_MaxSize.width,
-							_MaxSize.height);
+							.getDefaultConfiguration()
+							.createCompatibleVolatileImage(_MaxSize.width,
+									_MaxSize.height);
 				} else {
 					buffer = new BufferedImage(_MaxSize.width, _MaxSize.height,
@@ -302,5 +305,6 @@
 	 * @param bg
 	 */
-	public static void paintFrame(Frame toPaint, Area clip, boolean isActualFrame, boolean createVolitile, Graphics2D bg) {
+	public static void paintFrame(Frame toPaint, Area clip,
+			boolean isActualFrame, boolean createVolitile, Graphics2D bg) {
 		bg.setClip(clip);
 
@@ -318,5 +322,5 @@
 		if (createVolitile) {
 			backgroundColor = toPaint.getPaintBackgroundColor();
-		}else{
+		} else {
 			backgroundColor = toPaint.getBackgroundColor();
 			if (backgroundColor == null)
@@ -337,6 +341,5 @@
 			visibleItems.addAll(toPaint.getAllItems());
 			paintWidgets = new LinkedList<InteractiveWidget>();
-			AddAllOverlayWidgets(paintWidgets, toPaint,
-					new LinkedList<Frame>());
+			AddAllOverlayWidgets(paintWidgets, toPaint, new LinkedList<Frame>());
 		} else {
 			visibleItems.addAll(toPaint.getVisibleItems());
@@ -348,12 +351,13 @@
 		// FIRST: Paint widgets swing gui (not expeditee gui) .
 		// Note that these are the anchored widgets
-		ListIterator<InteractiveWidget> widgetItor = paintWidgets.listIterator(paintWidgets.size());
-		while (widgetItor.hasPrevious())  { 
-			//Paint first-in-last-serve ordering - like swing
-			//If it is done the other way around then widgets are covered up by the box that is supposed to be underneath
+		ListIterator<InteractiveWidget> widgetItor = paintWidgets
+				.listIterator(paintWidgets.size());
+		while (widgetItor.hasPrevious()) {
+			// Paint first-in-last-serve ordering - like swing
+			// If it is done the other way around then widgets are covered up by
+			// the box that is supposed to be underneath
 			InteractiveWidget iw = widgetItor.previous();
-			if (clip == null
-					|| clip.intersects(iw.getComponant().getBounds())){
-				iw.paint(bg);	
+			if (clip == null || clip.intersects(iw.getComponant().getBounds())) {
+				iw.paint(bg);
 				PaintItem(bg, iw.getItems().get(4));
 				paintedFillsAndLines.addAll(iw.getItems());
@@ -702,4 +706,6 @@
 		} else if (i instanceof Circle) {
 			i.setHighlightMode(Item.HighlightMode.Connected);
+		} else if (!i.isVisible()) {
+			changeHighlightMode(i, Item.HighlightMode.Connected, null);
 		} else {
 			// FrameGraphics.ChangeSelectionMode(i,
@@ -726,14 +732,24 @@
 		if (item == null)
 			return;
-		// Mike: TODO comment on why the line below is used!!
-		// I forgot already!!Opps
-		boolean freeItem = FreeItems.getInstance().contains(item);
-		for (Item i : item.getAllConnected()) {
-			if (/* freeItem || */!FreeItems.getInstance().contains(i)) {
-				i.setHighlightMode(connectedNewMode);
-			}
-		}
-		if (!freeItem && newMode != connectedNewMode)
+
+		if (item.hasVector()) {
+			for (Item i : item.getParentOrCurrentFrame().getVectorItems()) {
+				if (i.getEditTarget() == item) {
+					i.setHighlightMode(newMode);
+				}
+			}
 			item.setHighlightMode(newMode);
+		} else {
+			// Mike: TODO comment on why the line below is used!!
+			// I forgot already!!Opps
+			boolean freeItem = FreeItems.getInstance().contains(item);
+			for (Item i : item.getAllConnected()) {
+				if (/* freeItem || */!FreeItems.getInstance().contains(i)) {
+					i.setHighlightMode(connectedNewMode);
+				}
+			}
+			if (!freeItem && newMode != connectedNewMode)
+				item.setHighlightMode(newMode);
+		}
 		Repaint();
 	}
@@ -746,9 +762,11 @@
 	 */
 
-	public static void UpdateBuffer(Frame toUpdate, boolean paintOverlays, boolean useVolitile) {
+	public static void UpdateBuffer(Frame toUpdate, boolean paintOverlays,
+			boolean useVolitile) {
 		toUpdate.setBuffer(getBuffer(toUpdate, paintOverlays, useVolitile));
 	}
-	
-	public static Image getBuffer(Frame toUpdate, boolean paintOverlays, boolean useVolitile){
+
+	public static Image getBuffer(Frame toUpdate, boolean paintOverlays,
+			boolean useVolitile) {
 		if (toUpdate == null)
 			return null;
@@ -771,8 +789,8 @@
 	// Damaged areas pending to render. Accessessed by multiple threads
 	private static HashSet<Rectangle> damagedAreas = new HashSet<Rectangle>();
-	
+
 	/** The clip used while paiting */
 	private static Area currentClip;
-	
+
 	/**
 	 * The current clip that is used for painting at this instant.
@@ -781,9 +799,8 @@
 	 * lost in the graphics object for which can be regained via this method.
 	 * 
-	 * @return
-	 * 		The current clip. Null if no clip (e.g. full screen render).
+	 * @return The current clip. Null if no clip (e.g. full screen render).
 	 */
 	public static Area getCurrentClip() {
-		return (currentClip != null) ? (Area)currentClip.clone() : null;
+		return (currentClip != null) ? (Area) currentClip.clone() : null;
 	}
 
@@ -869,6 +886,7 @@
 					MessageBay.refresh(true, dg, Item.DEFAULT_BACKGROUND);
 					return;
-					
-				} else return; // nothing to render
+
+				} else
+					return; // nothing to render
 			}
 
@@ -936,5 +954,5 @@
 
 	}
-	
+
 	/**
 	 * Adds a FinalFrameRenderPass to the frame-render pipeline...
@@ -944,16 +962,18 @@
 	 * 
 	 * @param pass
-	 * 		The pass to add. If already added then nothing results in the call.
+	 *            The pass to add. If already added then nothing results in the
+	 *            call.
 	 * 
 	 * @throws NullPointerException
-	 * 		If pass is null.
+	 *             If pass is null.
 	 */
 	public static void addFinalFrameRenderPass(FinalFrameRenderPass pass) {
-		if (pass == null) throw new NullPointerException("pass");
-		
+		if (pass == null)
+			throw new NullPointerException("pass");
+
 		if (!_finalPasses.contains(pass))
 			_finalPasses.add(pass);
 	}
-	
+
 	/**
 	 * Adds a FinalFrameRenderPass to the frame-render pipeline...
@@ -963,5 +983,5 @@
 	 * 
 	 * @param pass
-	 * 		The pass to remove
+	 *            The pass to remove
 	 * 
 	 */
@@ -969,11 +989,12 @@
 		_finalPasses.remove(pass);
 	}
-	
-	/**
-	 * A FinalFrameRenderPass is invoked at the very final stages for rendering a frame:
-	 * that is, after the popups are drawn.
-	 *  
-	 * There can be many applications for FinalFrameRenderPass. Such as tool tips, balloons,
-	 * or drawing items at the highest Z-order in special situations.
+
+	/**
+	 * A FinalFrameRenderPass is invoked at the very final stages for rendering
+	 * a frame: that is, after the popups are drawn.
+	 * 
+	 * There can be many applications for FinalFrameRenderPass. Such as tool
+	 * tips, balloons, or drawing items at the highest Z-order in special
+	 * situations.
 	 * 
 	 * Although if there are multiples FinalFrameRenderPasses attatach to the
Index: /trunk/src/org/expeditee/gui/FrameIO.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameIO.java	(revision 285)
+++ /trunk/src/org/expeditee/gui/FrameIO.java	(revision 286)
@@ -44,4 +44,5 @@
 	public static void changeParentFolder(String newFolder) {
 		PARENT_FOLDER = newFolder;
+		PUBLIC_PATH = PARENT_FOLDER + "public" + File.separator;
 		FRAME_PATH = PARENT_FOLDER + "framesets" + File.separator;
 		TRASH_PATH = PARENT_FOLDER + "trash" + File.separator;
@@ -65,4 +66,6 @@
 
 	public static String FRAME_PATH;
+	
+	public static String PUBLIC_PATH;
 
 	public static String IMAGES_PATH;
Index: /trunk/src/org/expeditee/gui/FrameKeyboardActions.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameKeyboardActions.java	(revision 285)
+++ /trunk/src/org/expeditee/gui/FrameKeyboardActions.java	(revision 286)
@@ -10,4 +10,5 @@
 import java.awt.event.KeyListener;
 import java.awt.geom.Point2D;
+import java.text.NumberFormat;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -39,5 +40,5 @@
 
 	private static Collection<Item> _enclosedItems = null;
-	
+
 	public static void resetEnclosedItems() {
 		_enclosedItems = null;
@@ -330,9 +331,9 @@
 	public void keyPressed(KeyEvent e) {
 		int keyCode = e.getKeyCode();
-		
-		if(keyCode != KeyEvent.VK_F1 && keyCode != KeyEvent.VK_F2){
+
+		if (keyCode != KeyEvent.VK_F1 && keyCode != KeyEvent.VK_F2) {
 			resetEnclosedItems();
 		}
-		
+
 		SessionStats.AddFrameEvent("k" + KeyEvent.getKeyText(keyCode));
 
@@ -526,5 +527,4 @@
 
 	}
-
 
 	public void keyReleased(KeyEvent e) {
@@ -1114,4 +1114,6 @@
 	public static final String SHORT_DATE_FORMAT = "ddMMMyyyy";
 
+	public static final String TIME_DATE_FORMAT = "[HH:mm]";
+
 	public static final String LONG_DATE_FORMAT = "ddMMMyyyy[HH:mm]";
 
@@ -1181,5 +1183,5 @@
 				dummyItem.setText(newItemText + dummyItem.getText());
 			}
-			
+
 			dummyItem = createText();
 			if (FreeItems.textOnlyAttachedToCursor()) {
@@ -1199,5 +1201,5 @@
 			if (column.size() == 0) {
 				Frame current = DisplayIO.getCurrentFrame();
-				//Item itemTemplate = current.getItemTemplate();
+				// Item itemTemplate = current.getItemTemplate();
 				int xPos = title.getX() + FrameCreator.INDENT_FROM_TITLE;
 				int yPos = FrameCreator.getYStart(title);
@@ -1509,7 +1511,13 @@
 			// check permissions
 			if (!item.hasPermission(Permission.full)) {
-				MessageBay
-						.displayMessage("Insufficient permission to change the size of that item");
-				return;
+				Item editTarget = item.getEditTarget();
+				if (editTarget != item
+						&& editTarget.hasPermission(Permission.full)) {
+					item = editTarget;
+				} else {
+					MessageBay
+							.displayMessage("Insufficient permission to change the size of that item");
+					return;
+				}
 			}
 			toSet = item;
@@ -1569,11 +1577,33 @@
 					i.setThickness((float) (i.getThickness() * ratio));
 				} else if (i instanceof XRayable) {
+					XRayable xRay = (XRayable) i;
+					Text source = xRay.getSource();
+					// Ensure that the source is done before the XRayable
+					if (!done.contains(source)) {
+						scaleText(origin, ratio, done, source);
+					}
+
 					i.translate(origin, ratio);
 					i.setThickness((float) (i.getThickness() * ratio));
 					done.add(i);
+				} else if (i.hasVector()) {
+					// TODO Improve the effiency of resizing vectors... ie...
+					// dont want to have to reparse all the time
+					assert (i instanceof Text);
+					Text text = (Text) i;
+					AttributeValuePair avp = new AttributeValuePair(text
+							.getText());
+					double scale = 1F;
+					try {
+						scale = avp.getDoubleValue();
+					} catch (Exception e) {
+					}
+					scale *= ratio;
+					NumberFormat nf = Vector.getNumberFormatter();
+					text.setAttributeValue(nf.format(scale));
+					text.translate(origin, ratio);
+					item.getParent().parse();
 				} else if (i instanceof Text) {
-					i.translate(origin, ratio);
-					i.setSize((float) (i.getSize() * ratio));
-					done.add(i);
+					scaleText(origin, ratio, done, (Text) i);
 				}
 			}
@@ -1598,4 +1628,18 @@
 				current = Math.max(current + diff, Item.MINIMUM_THICKNESS);
 				dot.setThickness(current);
+			} else if (i.hasVector()) {
+				assert (item instanceof Text);
+				Text text = (Text) item;
+				AttributeValuePair avp = new AttributeValuePair(text.getText());
+				double scale = 1F;
+				try {
+					scale = avp.getDoubleValue();
+				} catch (Exception e) {
+				}
+				scale *= ratio;
+				NumberFormat nf = Vector.getNumberFormatter();
+				text.setAttributeValue(nf.format(scale));
+				text.translate(origin, ratio);
+				item.getParent().parse();
 			} else {
 				float oldSize = Math.abs(i.getSize());
@@ -1620,4 +1664,17 @@
 	}
 
+	/**
+	 * @param origin
+	 * @param ratio
+	 * @param done
+	 * @param source
+	 */
+	private static void scaleText(Point2D origin, double ratio,
+			Collection<Item> done, Text source) {
+		source.translate(origin, ratio);
+		source.setSize((float) (source.getSize() * ratio));
+		done.add(source);
+	}
+
 	private static void SetFillColor(Item item, boolean setTransparent) {
 		if (item == null)
@@ -1716,7 +1773,13 @@
 			// check permissions
 			if (!item.hasPermission(Permission.full)) {
-				MessageBay
-						.displayMessage("Insufficient permission to change that item's color");
-				return;
+				Item editTarget = item.getEditTarget();
+				if (editTarget != item
+						&& editTarget.hasPermission(Permission.full)) {
+					item = editTarget;
+				} else {
+					MessageBay
+							.displayMessage("Insufficient permission to change color");
+					return;
+				}
 			}
 			// Toggling color of circle center changes the circle fill color
Index: /trunk/src/org/expeditee/gui/FrameMouseActions.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameMouseActions.java	(revision 285)
+++ /trunk/src/org/expeditee/gui/FrameMouseActions.java	(revision 286)
@@ -2,4 +2,5 @@
 
 import java.awt.Point;
+import java.awt.Rectangle;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -10,4 +11,5 @@
 import java.awt.event.MouseWheelEvent;
 import java.awt.event.MouseWheelListener;
+import java.text.NumberFormat;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -683,7 +685,13 @@
 			// check item permissions
 			if (!clicked.hasPermission(Permission.followLinks)) {
-				MessageBay
-						.displayMessage("Insufficient permissions to perform action on item");
-				return;
+				Item editTarget = clicked.getEditTarget();
+				if (editTarget != clicked
+						&& editTarget.hasPermission(Permission.followLinks)) {
+					clicked = editTarget;
+				} else {
+					MessageBay
+							.displayMessage("Insufficient permission to perform action on item");
+					return;
+				}
 			}
 
@@ -869,7 +877,13 @@
 			// check permissions
 			if (!clicked.hasPermission(Permission.full)) {
-				MessageBay
-						.displayMessage("Insufficient permission to pick up item");
-				return;
+				Item editTarget = clicked.getEditTarget();
+				if (editTarget != clicked
+						&& editTarget.hasPermission(Permission.full)) {
+					clicked = editTarget;
+				} else {
+					MessageBay
+							.displayMessage("Insufficient permission to pick up item");
+					return;
+				}
 			}
 
@@ -1250,7 +1264,13 @@
 					}
 				} else if (!clicked.hasPermission(Permission.copy)) {
-					MessageBay
-							.displayMessage("Insufficient permission to copy");
-					return;
+					Item editTarget = clicked.getEditTarget();
+					if (editTarget != clicked
+							&& editTarget.hasPermission(Permission.copy)) {
+						clicked = editTarget;
+					} else {
+						MessageBay
+								.displayMessage("Insufficient permission to copy");
+						return;
+					}
 				}
 
@@ -1548,5 +1568,5 @@
 
 	private static boolean _controlDown;
-	
+
 	public static boolean isControlDown() {
 		return _controlDown;
@@ -1596,5 +1616,5 @@
 		MouseX = e.getX();
 		MouseY = e.getY();
-		//System.out.println(MouseX + "," + MouseY);
+		// System.out.println(MouseX + "," + MouseY);
 
 		// Moving the mouse a certain distance removes the last edited text if
@@ -1813,5 +1833,5 @@
 				// Item.SelectedMode.Connected);
 				// TODO: The method below is for the most part redundant
-				on = FrameGraphics.Highlight(on);
+				on = FrameGraphics.Highlight(on.getEditTarget());
 			}
 			// if the last item highlighted is still highlighted, clear it
@@ -2001,10 +2021,38 @@
 	 */
 	public static boolean tdfc(Item linker) throws RuntimeException {
-		// if (linker instanceof Line)
-		// return false;
-
 		// if this is a non-usable item
 		if (linker.getID() < 0)
 			return false;
+
+		// Check if its an image that can be resized to fit a box
+		// around it
+		String text = linker.getText();
+		if (text.equals("@v") || text.equals("@f")) {
+			Collection<Item> enclosure = FrameUtils.getEnclosingLineEnds(linker
+					.getPosition());
+			if (enclosure != null) {
+				for (Item i : enclosure) {
+					if (i.isLineEnd() && i.isEnclosed()) {
+						DisplayIO.getCurrentFrame().removeAllItems(enclosure);
+						Rectangle rect = i.getEnclosedRectangle();
+						long width = Math.round(rect.getWidth());
+						if (text.equals("@v")) {
+							NumberFormat nf = Vector.getNumberFormatter();
+							linker.setText("@v: "
+									+ nf.format((width / FrameGraphics
+											.getMaxFrameSize().getWidth())));
+						} else {
+							linker.setText("@f: " + width);
+						}
+
+						linker.setPosition(new Point(rect.x, rect.y));
+						linker.setThickness(i.getThickness());
+						linker.setBorderColor(i.getColor());
+						break;
+					}
+				}
+				FrameMouseActions.deleteItems(enclosure, false);
+			}
+		}
 
 		boolean mouseMoved;
@@ -2178,7 +2226,13 @@
 			// check permissions
 			if (!toDelete.hasPermission(Permission.full)) {
-				MessageBay
-						.displayMessage("Insufficient permission to delete item");
-				return;
+				Item editTarget = toDelete.getEditTarget();
+				if (editTarget != toDelete
+						&& editTarget.hasPermission(Permission.full)) {
+					toDelete = editTarget;
+				} else {
+					MessageBay
+							.displayMessage("Insufficient permission to delete item");
+					return;
+				}
 			}
 
@@ -2532,6 +2586,10 @@
 
 		if (!toGrab.hasPermission(Permission.full)) {
-			MessageBay
-					.displayMessage("Insufficient permission pickup the item");
+			if (toGrab.getEditTarget() != toGrab) {
+				pickup(toGrab.getEditTarget());
+			} else {
+				MessageBay
+						.displayMessage("Insufficient permission pickup the item");
+			}
 			return;
 		}
@@ -2539,6 +2597,8 @@
 		if (toGrab instanceof Circle)
 			toGrab.setHighlightMode(HighlightMode.Connected);
-		else
+		//Dont set the highlight mode if a vector is being picked up
+		else if(toGrab.isVisible()){
 			toGrab.setHighlightMode(HighlightMode.Normal);
+		}
 
 		// Brook: If the widget corner is being picked up. Instead refer to
@@ -2559,7 +2619,7 @@
 
 	public static void pickup(Collection<Item> toGrab) {
-		if(toGrab == null || toGrab.size() == 0)
+		if (toGrab == null || toGrab.size() == 0)
 			return;
-		
+
 		boolean bReparse = false;
 		Frame frame = DisplayIO.getCurrentFrame();
@@ -2594,6 +2654,8 @@
 				for (Item copy : copies) {
 					FreeItems.getInstance().add(copy);
+					copy.setEditTarget(i);
 					copy.setFloating(true);
 					copy.setParent(null);
+					//copy.setHighlightMode(HighlightMode.Connected);
 				}
 			}
@@ -2636,5 +2698,5 @@
 		} else {
 			MessageBay
-					.displayMessage("Insufficient permission pickup the items");
+					.displayMessage("Insufficient permission to pickup the items");
 		}
 		if (bReparse)
Index: /trunk/src/org/expeditee/gui/FrameUtils.java
===================================================================
--- /trunk/src/org/expeditee/gui/FrameUtils.java	(revision 285)
+++ /trunk/src/org/expeditee/gui/FrameUtils.java	(revision 286)
@@ -4,4 +4,5 @@
 import java.awt.Point;
 import java.awt.Polygon;
+import java.awt.Rectangle;
 import java.io.File;
 import java.util.ArrayList;
@@ -31,4 +32,5 @@
 import org.expeditee.items.widgets.WidgetCorner;
 import org.expeditee.items.widgets.WidgetEdge;
+import org.expeditee.network.PeerToPeer;
 import org.expeditee.stats.SessionStats;
 
@@ -580,4 +582,6 @@
 			else if (attribute.equals("mailsettings"))
 				MailSession.init(item.getChild());
+			else if (attribute.equals("peertopeersettings"))
+				PeerToPeer.init(item.getChild());
 			else if (attribute.equals("reminders"))
 				Reminders.init(item.getChild());
@@ -779,4 +783,6 @@
 				} else if (i.hasFormula()) {
 					i.setText(i.getFormula());
+				} else if (i.hasOverlay()) {
+					i.setVisible(true);
 				}
 			}
@@ -849,6 +855,7 @@
 						}
 						// check for new OVERLAY items
-						else if (!ignoreAnnotations && ItemUtils.startsWithTag(i,
-								ItemUtils.TAG_OVERLAY)
+						else if (!ignoreAnnotations
+								&& ItemUtils.startsWithTag(i,
+										ItemUtils.TAG_OVERLAY)
 								&& i.getLink() != null) {
 							if (i.getAbsoluteLink().equalsIgnoreCase(
@@ -872,6 +879,7 @@
 						}
 						// check for ACTIVE_OVERLAY items
-						else if (!ignoreAnnotations && ItemUtils.startsWithTag(i,
-								ItemUtils.TAG_ACTIVE_OVERLAY)
+						else if (!ignoreAnnotations
+								&& ItemUtils.startsWithTag(i,
+										ItemUtils.TAG_ACTIVE_OVERLAY)
 								&& i.getLink() != null) {
 							String link = i.getAbsoluteLink();
@@ -1028,7 +1036,7 @@
 			} catch (Exception e) {
 			}
-			Vector newVector = new Vector(vector, vectorPermission, i
-					.getPosition(), scale, i.getColor(), i.getBackgroundColor());
+			Vector newVector = new Vector(vector, vectorPermission, scale, i);
 			i.setOverlay(newVector);
+			i.setVisible(false);
 			vectors.add(newVector);
 		}
@@ -1451,4 +1459,33 @@
 			if (lastEdited != LastEdited) {
 				if (LastEdited.startsWith("@i")) {
+					// Check if its an image that can be resized to fit a box
+					// around it
+					String text = LastEdited.getText();
+					if (text.startsWith("@i:")
+							&& !Character.isDigit(text
+									.charAt(text.length() - 1))) {
+						Collection<Item> enclosure = FrameUtils
+								.getEnclosingLineEnds(LastEdited.getPosition());
+						if (enclosure != null) {
+							for (Item i : enclosure) {
+								if (i.isLineEnd() && i.isEnclosed()) {
+									DisplayIO.getCurrentFrame().removeAllItems(
+											enclosure);
+									Rectangle rect = i.getEnclosedRectangle();
+									LastEdited
+											.setText(LastEdited.getText()
+													+ " "
+													+ Math.round(rect
+															.getWidth()));
+									LastEdited.setPosition(new Point(rect.x,
+											rect.y));
+									LastEdited.setThickness(i.getThickness());
+									LastEdited.setBorderColor(i.getColor());
+									break;
+								}
+							}
+							FrameMouseActions.deleteItems(enclosure, false);
+						}
+					}
 					toReparse = LastEdited.getParent();
 				} else if (LastEdited.recalculateWhenChanged()) {
Index: /trunk/src/org/expeditee/gui/UserSettings.java
===================================================================
--- /trunk/src/org/expeditee/gui/UserSettings.java	(revision 285)
+++ /trunk/src/org/expeditee/gui/UserSettings.java	(revision 286)
@@ -71,4 +71,5 @@
 
 		UserSettings.FrameDirs.add(FrameIO.FRAME_PATH);
+		UserSettings.FrameDirs.add(FrameIO.PUBLIC_PATH);
 		UserSettings.FrameDirs.add(FrameIO.PROFILE_PATH);
 		UserSettings.FrameDirs.add(FrameIO.HELP_PATH);
Index: /trunk/src/org/expeditee/gui/Vector.java
===================================================================
--- /trunk/src/org/expeditee/gui/Vector.java	(revision 285)
+++ /trunk/src/org/expeditee/gui/Vector.java	(revision 286)
@@ -2,6 +2,9 @@
 
 import java.awt.Color;
+import java.awt.Dimension;
 import java.awt.Point;
+import java.text.NumberFormat;
 
+import org.expeditee.items.Item;
 import org.expeditee.items.Permission;
 
@@ -15,12 +18,17 @@
 
 	public Color Background;
+	
+	public Item Source;
+	
+	public Dimension Size;
 
-	public Vector(Frame overlay, Permission permission, Point origin,
-			Float scale, Color color, Color background) {
+	public Vector(Frame overlay, Permission permission,
+			Float scale, Item source) {
 		super(overlay, permission);
-		Origin = origin;
+		Origin = source.getPosition();
 		Scale = scale;
-		Foreground = color;
-		Background = background;
+		Foreground = source.getColor();
+		Background = source.getBackgroundColor();
+		Source = source;
 	}
 
@@ -54,3 +62,13 @@
 		return (y - Origin.y) / Scale;
 	}
+
+	public void setSize(int maxX, int maxY) {
+		Size = new Dimension(maxX, maxY);
+	}
+
+	public static NumberFormat getNumberFormatter() {
+		NumberFormat nf = NumberFormat.getInstance();
+		nf.setMaximumFractionDigits(4);
+		return nf;
+	}
 }
Index: /trunk/src/org/expeditee/io/DefaultFrameWriter.java
===================================================================
--- /trunk/src/org/expeditee/io/DefaultFrameWriter.java	(revision 285)
+++ /trunk/src/org/expeditee/io/DefaultFrameWriter.java	(revision 286)
@@ -6,4 +6,5 @@
 import java.lang.reflect.Method;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
 
@@ -12,4 +13,5 @@
 import org.expeditee.gui.FrameIO;
 import org.expeditee.items.Item;
+import org.expeditee.items.Line;
 import org.expeditee.items.Text;
 
@@ -63,6 +65,5 @@
 			_ItemTags.put("G", Item.class
 					.getMethod("getBackgroundColor", param));
-			_ItemTags.put("K", Item.class
-					.getMethod("getBorderColor", param));
+			_ItemTags.put("K", Item.class.getMethod("getBorderColor", param));
 			_ItemTags.put("H", Item.class.getMethod("getAnchorRight", param));
 			_ItemTags.put("I", Item.class.getMethod("getAnchorBottom", param));
@@ -83,5 +84,5 @@
 			_ItemTags.put("e", Item.class.getMethod("getFillColor", param));
 			_ItemTags.put("E", Item.class.getMethod("getGradientColor", param));
-			
+
 			_ItemTags.put("i", Item.class.getMethod("getFillPattern", param));
 			_ItemTags.put("o", Item.class.getMethod("getOwner", param));
@@ -96,6 +97,6 @@
 			_ItemTags.put("t", Text.class.getMethod("getSpacing", param));
 
-			//TODO set a boolean flag to indicate that the text is a formula
-			//Store the formula in the text property NOT the answer
+			// TODO set a boolean flag to indicate that the text is a formula
+			// Store the formula in the text property NOT the answer
 			_ItemTags.put("J", Item.class.getMethod("getFormula", param));
 			_ItemTags.put("T", Text.class.getMethod("getText", param));
@@ -138,5 +139,7 @@
 	/**
 	 * Called before writing out the body items of each frame.
-	 * @param starting the name of the frame currently being written out.
+	 * 
+	 * @param starting
+	 *            the name of the frame currently being written out.
 	 * @throws IOException
 	 */
@@ -152,5 +155,7 @@
 	/**
 	 * Called after writing out the body items of each frame.
-	 * @param ending the name of the frame currently being written out.
+	 * 
+	 * @param ending
+	 *            the name of the frame currently being written out.
 	 * @throws IOException
 	 */
@@ -160,5 +165,6 @@
 	protected void initialise(Frame start) throws IOException {
 		if (_filename == null)
-			_filename = FrameIO.EXPORTS_DIR + getValidFilename(start.getTitle()) + _format;
+			_filename = FrameIO.EXPORTS_DIR
+					+ getFileName(start) + _format;
 
 		if (_filename.equalsIgnoreCase(WriteTree.CLIPBOARD)) {
@@ -189,4 +195,8 @@
 	}
 
+	protected String getFileName(Frame start) {
+		return getValidFilename(start.getTitle());
+	}
+
 	public static String getValidFilename(String filename) {
 		return filename.replaceAll("[ \\.]", "_");
@@ -212,14 +222,22 @@
 		writeStartFrame(toWrite);
 
+		Collection<Item> done = new HashSet<Item>();
+
 		for (Item i : getItemsToWrite(toWrite)) {
-			if (_stop){
+			if (_stop) {
 				return;
 			}
+
+			if (i instanceof Line) {
+				if (done.contains(i)) {
+					continue;
+				}
+				done.addAll(i.getAllConnected());
+			}
 			writeItem(i);
 		}
-
 		writeEndFrame(toWrite);
 	}
-	
+
 	protected Collection<Item> getItemsToWrite(Frame toWrite) {
 		return toWrite.getItemsToSave();
Index: /trunk/src/org/expeditee/io/DefaultFramesetWriter.java
===================================================================
--- /trunk/src/org/expeditee/io/DefaultFramesetWriter.java	(revision 285)
+++ /trunk/src/org/expeditee/io/DefaultFramesetWriter.java	(revision 286)
@@ -8,6 +8,6 @@
 
 public class DefaultFramesetWriter extends DefaultFrameWriter {
-	private long  _firstFrame = 1;
-	private long _maxFrame = Long.MAX_VALUE;
+	protected long  _firstFrame = 1;
+	protected long _maxFrame = Long.MAX_VALUE;
 	
 	protected DefaultFramesetWriter(long firstFrame, long maxFrame){
Index: /trunk/src/org/expeditee/io/ItemWriter.java
===================================================================
--- /trunk/src/org/expeditee/io/ItemWriter.java	(revision 285)
+++ /trunk/src/org/expeditee/io/ItemWriter.java	(revision 286)
@@ -4,4 +4,5 @@
 import java.util.List;
 
+import org.expeditee.items.Circle;
 import org.expeditee.items.Dot;
 import org.expeditee.items.Item;
@@ -9,4 +10,6 @@
 import org.expeditee.items.Picture;
 import org.expeditee.items.Text;
+import org.expeditee.items.widgets.InteractiveWidget;
+import org.expeditee.items.widgets.WidgetEdge;
 
 public abstract class ItemWriter {
@@ -22,6 +25,9 @@
 
 	/**
-	 * Called for each item on each frame to write out the contents of the items.
-	 * @param toWrite the item to be written out.
+	 * Called for each item on each frame to write out the contents of the
+	 * items.
+	 * 
+	 * @param toWrite
+	 *            the item to be written out.
 	 * @throws IOException
 	 */
@@ -38,9 +44,16 @@
 			writePicture((Picture) toWrite);
 
-		if (toWrite instanceof Line)
+		if (toWrite instanceof Line) {
+			if (toWrite instanceof WidgetEdge) {
+				writeWidget(((WidgetEdge) toWrite).getWidgetSource());
+			}
 			writeLine((Line) toWrite);
+		}
 
 		if (toWrite instanceof Dot)
 			writeDot((Item) toWrite);
+
+		if (toWrite instanceof Circle)
+			writeCircle((Circle) toWrite);
 	}
 
@@ -52,6 +65,7 @@
 			writeAnnotationPicture((Picture) toWrite);
 
-		if (toWrite instanceof Line)
+		if (toWrite instanceof Line) {
 			writeAnnotationLine((Line) toWrite);
+		}
 
 		if (toWrite instanceof Dot)
@@ -80,4 +94,10 @@
 	}
 
+	protected void writeCircle(Circle toWrite) throws IOException {
+	}
+
+	protected void writeWidget(InteractiveWidget toWrite) throws IOException {
+	}
+
 	protected void writeDot(Item toWrite) throws IOException {
 	}
Index: /trunk/src/org/expeditee/io/PdfFramesetWriter.java
===================================================================
--- /trunk/src/org/expeditee/io/PdfFramesetWriter.java	(revision 285)
+++ /trunk/src/org/expeditee/io/PdfFramesetWriter.java	(revision 286)
@@ -1,5 +1,7 @@
 package org.expeditee.io;
 
+import java.awt.Color;
 import java.awt.Dimension;
+import java.awt.Graphics2D;
 import java.awt.Image;
 import java.io.FileOutputStream;
@@ -11,7 +13,10 @@
 import org.expeditee.gui.FrameGraphics;
 import org.expeditee.gui.UserSettings;
+import org.expeditee.items.Circle;
 import org.expeditee.items.Item;
+import org.expeditee.items.Line;
 import org.expeditee.items.Picture;
 import org.expeditee.items.Text;
+import org.expeditee.items.widgets.InteractiveWidget;
 
 import com.lowagie.text.Document;
@@ -26,5 +31,5 @@
  * 
  * @author root
- *
+ * 
  */
 public class PdfFramesetWriter extends DefaultFramesetWriter {
@@ -34,12 +39,25 @@
 	private PdfWriter _pdfWriter;
 
-	public PdfFramesetWriter(long firstFrame, long maxFrame) {
+	private boolean _showFrameNames;
+
+	public PdfFramesetWriter(long firstFrame, long maxFrame,
+			boolean showFrameNames) {
 		super(firstFrame, maxFrame);
 		Dimension d = FrameGraphics.getMaxSize();
 		_pdfDocument = new Document(new Rectangle(d.width, d.height));
+		_showFrameNames = showFrameNames;
 	}
-	
+
 	public PdfFramesetWriter() {
-		this(1, Long.MAX_VALUE);
+		this(1, Long.MAX_VALUE, false);
+	}
+
+	@Override
+	protected String getFileName(Frame start) {
+		String fileName = start.getFramesetName();
+		if (_maxFrame < Long.MAX_VALUE) {
+			fileName += "_" + _firstFrame + "-" + _maxFrame;
+		}
+		return fileName;
 	}
 
@@ -48,4 +66,5 @@
 		_format = ".pdf";
 		super.initialise(start);
+
 		try {
 			_pdfWriter = PdfWriter.getInstance(_pdfDocument,
@@ -68,5 +87,13 @@
 	}
 
+	protected void writeStartFrame(Frame starting) throws IOException {
+		// TODO color in the frame background color
+
+		super.writeStartFrame(starting);
+	}
+
 	protected void writeEndFrame(Frame ending) throws IOException {
+		if (_showFrameNames)
+			writeText((Text) ending.getNameItem());
 		super.writeEndFrame(ending);
 		// Move to the next page
@@ -108,5 +135,5 @@
 	protected void writePicture(Picture pic) throws IOException {
 		Image image = pic.getCroppedImage();
-		if(image == null)
+		if (image == null)
 			return;
 		try {
@@ -124,6 +151,42 @@
 
 	@Override
+	protected void writeLine(Line lineEnd) throws IOException {
+		PdfContentByte cb = _pdfWriter.getDirectContent();
+//		Color fill = lineEnd.getFillColor();
+//		if (fill != null) {
+//			cb.setColorFill(fill);
+//		}
+		Graphics2D g = cb.createGraphicsShapes(
+				FrameGraphics.getMaxSize().width,
+				FrameGraphics.getMaxSize().height);
+		lineEnd.paint(g);
+//		if (fill != null) {
+//			g.setPaint(fill);
+//		}
+//		lineEnd.paintFill(g);
+	}
+
+	@Override
 	protected Collection<Item> getItemsToWrite(Frame toWrite) {
 		return toWrite.getVisibleItems();
 	}
+	
+	@Override
+	protected void writeCircle(Circle toWrite) throws IOException {
+		PdfContentByte cb = _pdfWriter.getDirectContent();
+		Graphics2D g = cb.createGraphicsShapes(
+				FrameGraphics.getMaxSize().width,
+				FrameGraphics.getMaxSize().height);
+		toWrite.paint(g);
+	}
+	
+	
+	@Override
+	protected void writeWidget(InteractiveWidget toWrite) throws IOException {
+		PdfContentByte cb = _pdfWriter.getDirectContent();
+		Graphics2D g = cb.createGraphicsShapes(
+				FrameGraphics.getMaxSize().width,
+				FrameGraphics.getMaxSize().height);
+		toWrite.paint(g);
+	}
 }
Index: /trunk/src/org/expeditee/items/Item.java
===================================================================
--- /trunk/src/org/expeditee/items/Item.java	(revision 285)
+++ /trunk/src/org/expeditee/items/Item.java	(revision 286)
@@ -192,4 +192,7 @@
 		dest._overlay = source._overlay;
 		dest._mode = source._mode;// SelectedMode.None;
+		//dest._highlightColor = source._highlightColor;
+		//dest.setHighlight(source.getHighlight());
+		
 		dest._visible = source._visible;
 		Frame parent = source.getParentOrCurrentFrame();
@@ -234,4 +237,6 @@
 
 	private int _id;
+
+	private Item _editTarget = this;
 
 	private String _creationDate = null;
@@ -1831,4 +1836,11 @@
 
 	public int setHighlightColor(Color c) {
+		if (!this.isVisible() && this.hasVector()) {
+			for (Item i : this.getParentOrCurrentFrame().getVectorItems()) {
+				if (i.getEditTarget() == this) {
+					i.setHighlightColor(c);
+				}
+			}
+		}
 
 		_highlightThickness = DEFAULT_HIGHLIGHT_THICKNESS;
@@ -1890,5 +1902,6 @@
 	public void setHighlightMode(HighlightMode mode, Color color) {
 		setHighlightColor(color);
-		if (hasPermission(Permission.followLinks)) {
+		if (hasPermission(Permission.followLinks)
+				|| getEditTarget().hasPermission(Permission.followLinks)) {
 			if (_mode != mode) {
 				_mode = mode;
@@ -2666,3 +2679,20 @@
 		}
 	}
+
+	/**
+	 * Sets the item to be pickup when the user attempts to pick this item up.
+	 * EditTarget has a value of 'this' by default but may be set to other
+	 * values if this item is on a vector.
+	 * 
+	 * @param target
+	 *            the item to be copied or picked up when the user attempts to
+	 *            edit this item.
+	 */
+	public void setEditTarget(Item target) {
+		_editTarget = target;
+	}
+
+	public Item getEditTarget() {
+		return _editTarget;
+	}
 }
Index: /trunk/src/org/expeditee/items/ItemUtils.java
===================================================================
--- /trunk/src/org/expeditee/items/ItemUtils.java	(revision 285)
+++ /trunk/src/org/expeditee/items/ItemUtils.java	(revision 286)
@@ -457,5 +457,8 @@
 
 		for (Item i : toCopy) {
-
+			//Dont copy parts of a vector
+			if(!i.hasPermission(Permission.copy))
+				continue;
+			
 			// BROOK
 			if (i instanceof WidgetCorner) { // dont add these
Index: /trunk/src/org/expeditee/items/Text.java
===================================================================
--- /trunk/src/org/expeditee/items/Text.java	(revision 285)
+++ /trunk/src/org/expeditee/items/Text.java	(revision 286)
@@ -275,5 +275,7 @@
 
 	public void setAttributeValue(String value) {
-
+		AttributeValuePair avp = new AttributeValuePair(getText(),false);
+		avp.setValue(value);
+		setText(avp.toString());
 	}
 
Index: /trunk/src/org/expeditee/items/widgets/DataFrameWidget.java
===================================================================
--- /trunk/src/org/expeditee/items/widgets/DataFrameWidget.java	(revision 285)
+++ /trunk/src/org/expeditee/items/widgets/DataFrameWidget.java	(revision 286)
@@ -1,9 +1,10 @@
 package org.expeditee.items.widgets;
 
+import java.awt.Color;
+import java.awt.Graphics;
 import java.util.Collection;
 import java.util.HashSet;
 
 import javax.swing.JComponent;
-import javax.swing.JPanel;
 
 import org.expeditee.gui.Frame;
@@ -131,45 +132,11 @@
 		}
 	}
-	
-	//STUFF FROM HEAVY_DUTY_INTERACTIVE_WIDGET CLASS
-	
-//	@Override
-//	public int getLoadDelayTime() {
-//		// TODO Auto-generated method stub
-//		return 0;
-//	}
-//
-//	@Override
-//	protected float loadWidgetData() {
-//		// TODO Auto-generated method stub
-//		return 0;
-//	}
-//
-//	@Override
-//	protected void saveWidgetData() {
-//		// TODO Auto-generated method stub
-//		
-//	}
-//
-//	@Override
-//	protected void tempUnloadWidgetData() {
-//		// TODO Auto-generated method stub
-//		
-//	}
-//
-//	@Override
-//	protected void unloadWidgetData() {
-//		// TODO Auto-generated method stub
-//		
-//	}
-//
-//	public boolean doesNeedSaving() {
-//		// TODO Auto-generated method stub
-//		return false;
-//	}
-//
-//	public String getSaveName() {
-//		// TODO Auto-generated method stub
-//		return null;
-//	}
+
+	protected void paintInFreeSpace(Graphics g) {
+		super.paintInFreeSpace(g);
+		g.setFont(((Text)getSource()).getFont());
+		g.setColor(Color.WHITE);
+		g.drawString(this.getClass().getSimpleName(), getX() + 10, getY() + 20);
+
+	}
 }
Index: /trunk/src/org/expeditee/items/widgets/InteractiveWidget.java
===================================================================
--- /trunk/src/org/expeditee/items/widgets/InteractiveWidget.java	(revision 285)
+++ /trunk/src/org/expeditee/items/widgets/InteractiveWidget.java	(revision 286)
@@ -19,5 +19,5 @@
 import javax.swing.SwingUtilities;
 
-import org.expeditee.gui.AttributeUtils;
+import org.expeditee.actions.Actions;
 import org.expeditee.gui.Browser;
 import org.expeditee.gui.DisplayIO;
@@ -184,5 +184,5 @@
 		String classname = tokens[0];
 		if (classname.charAt(0) == '$')
-			classname = "org.expeditee.items.widgets." + classname.substring(1);
+			classname = Actions.getClassName(classname.substring(1));
 		// Attempt to locate the class using reflection
 		Class<?> iwclass = findIWidgetClass(classname);
Index: /trunk/src/org/expeditee/items/widgets/charts/TimeSeries.java
===================================================================
--- /trunk/src/org/expeditee/items/widgets/charts/TimeSeries.java	(revision 285)
+++ /trunk/src/org/expeditee/items/widgets/charts/TimeSeries.java	(revision 286)
@@ -211,5 +211,7 @@
 				.length()) {
 			df = new SimpleDateFormat(FrameKeyboardActions.LONG_DATE_FORMAT);
-		} else {
+		} else if (dateString.length() <= FrameKeyboardActions.TIME_DATE_FORMAT.length()) {
+			df = new SimpleDateFormat(FrameKeyboardActions.TIME_DATE_FORMAT);
+		}else {
 			df = new SimpleDateFormat(FrameKeyboardActions.SHORT_DATE_FORMAT);
 		}
Index: /trunk/src/org/expeditee/network/ConnectThread.java
===================================================================
--- /trunk/src/org/expeditee/network/ConnectThread.java	(revision 286)
+++ /trunk/src/org/expeditee/network/ConnectThread.java	(revision 286)
@@ -0,0 +1,15 @@
+package org.expeditee.network;
+
+
+public class ConnectThread extends Thread {
+	private PeerToPeer _session;
+
+	public ConnectThread(PeerToPeer session) {
+		_session = session;
+	}
+
+	@Override
+	public void run() {
+		_session.connectToPeers();
+	}
+}
Index: /trunk/src/org/expeditee/network/PeerToPeer.java
===================================================================
--- /trunk/src/org/expeditee/network/PeerToPeer.java	(revision 286)
+++ /trunk/src/org/expeditee/network/PeerToPeer.java	(revision 286)
@@ -0,0 +1,95 @@
+package org.expeditee.network;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.expeditee.gui.AttributeValuePair;
+import org.expeditee.gui.Frame;
+import org.expeditee.gui.MessageBay;
+import org.expeditee.items.Text;
+import org.net.p2p.Connection;
+import org.net.p2p.Protocol;
+import org.net.p2p.jnmp2p;
+
+
+public class PeerToPeer {
+	public static boolean _autoConnect = false;
+
+	private static PeerToPeer _theSession = null;
+
+	private Map<String, AttributeValuePair> _peers;
+	
+	private Map<String, Connection> _peerConnections;
+
+	private Boolean _bConnecting;
+
+	public static void init(Frame settingsFrame) {
+		if (settingsFrame == null)
+			return;
+
+		if (_theSession == null)
+			_theSession = new PeerToPeer(settingsFrame);
+	}
+	
+	private PeerToPeer(Frame settingsFrame) {
+		_bConnecting = false;
+
+		_peers = new HashMap<String, AttributeValuePair>();
+
+		// Set the settings
+		for (Text item : settingsFrame.getBodyTextItems(false)) {
+			if (item.getText().toLowerCase().trim().equals("autoconnect")) {
+				_autoConnect = true;
+				continue;
+			}
+			AttributeValuePair avp = new AttributeValuePair(item.getText());
+			if (!avp.hasPair())
+				continue;
+			String attributeFullCase = avp.getAttribute();
+			String attribute = attributeFullCase.toLowerCase();
+			
+			_peers.put(attribute, avp);
+		}
+
+		
+		try {
+			if (_autoConnect) {
+				connectThreaded();
+			}
+		} catch (Exception e) {
+			MessageBay.errorMessage("Error in PeerToPeer setup");
+		}
+	}
+
+	/**
+	 * Attempts to connect with peers.
+	 */
+	public static void connect() {
+		if (_theSession._bConnecting) {
+			MessageBay.errorMessage("Already connecting to peers");
+			return;
+		} else if (_theSession != null) {
+			_theSession.connectThreaded();
+		}
+	}
+
+	private void connectThreaded() {
+		Thread t = new ConnectThread(this);
+		t.start();
+	}
+
+	public synchronized void connectToPeers() {
+		_bConnecting = true;
+		
+		//Connect to peers
+		Protocol p = new Protocol(new Object());
+		
+		jnmp2p jnm = new jnmp2p(p, 3000);
+		
+		for(AttributeValuePair avp: _peers.values()){
+			_peerConnections.put(avp.getAttribute().toLowerCase(), jnm.connect(avp.getValue()));
+		}
+		
+		_bConnecting = false;
+	}
+}
