Index: /trunk/src/org/expeditee/gui/AttributeUtils.java
===================================================================
--- /trunk/src/org/expeditee/gui/AttributeUtils.java	(revision 719)
+++ /trunk/src/org/expeditee/gui/AttributeUtils.java	(revision 720)
@@ -195,6 +195,10 @@
 			_Attrib.put("BorderColor",          Item.class.getMethod("getBorderColor"),
 			                                    Item.class.getMethod("setBorderColor", pColor));
+			_Attrib.put("AnchorLeft",           Item.class.getMethod("getAnchorLeft"),
+			                                    Item.class.getMethod("setAnchorLeft", pFloatO));
 			_Attrib.put("AnchorRight",          Item.class.getMethod("getAnchorRight"),
 			                                    Item.class.getMethod("setAnchorRight", pFloatO));
+			_Attrib.put("AnchorTop",            Item.class.getMethod("getAnchorTop"),
+			                                    Item.class.getMethod("setAnchorTop", pFloatO));
 			_Attrib.put("AnchorBottom",         Item.class.getMethod("getAnchorBottom"),
 			                                    Item.class.getMethod("setAnchorBottom", pFloatO));
@@ -288,5 +292,7 @@
 			_Attrib.alias("s",                  "size");
 			_Attrib.alias("l",                  "link");
+			_Attrib.alias("at",                 "anchortop");
 			_Attrib.alias("ab",                 "anchorbottom");
+			_Attrib.alias("al",                 "anchorleft");
 			_Attrib.alias("ar",                 "anchorright");
 			_Attrib.alias("t",                  "thickness");
Index: /trunk/src/org/expeditee/gui/Frame.java
===================================================================
--- /trunk/src/org/expeditee/gui/Frame.java	(revision 719)
+++ /trunk/src/org/expeditee/gui/Frame.java	(revision 720)
@@ -805,6 +805,17 @@
 		boolean bReparse = false;
 		for (Item i : getItems()) {
+			Float anchorLeft   = i.getAnchorLeft();
+			Float anchorRight  = i.getAnchorRight();
+			Float anchorTop    = i.getAnchorTop();
 			Float anchorBottom = i.getAnchorBottom();
-			Float anchorRight = i.getAnchorRight();
+	
+			
+			if (anchorLeft != null) {
+				i.setAnchorLeft(anchorLeft);
+				if (i.hasVector()) {
+					bReparse = true;
+				}
+			}
+			
 			if (anchorRight != null) {
 				i.setAnchorRight(anchorRight);
@@ -813,4 +824,12 @@
 				}
 			}
+			
+			if (anchorTop != null) {
+				i.setAnchorTop(anchorTop);
+				if (i.hasVector()) {
+					bReparse = true;
+				}
+			}
+			
 			if (anchorBottom != null) {
 				i.setAnchorBottom(anchorBottom);
Index: /trunk/src/org/expeditee/io/DefaultFrameReader.java
===================================================================
--- /trunk/src/org/expeditee/io/DefaultFrameReader.java	(revision 719)
+++ /trunk/src/org/expeditee/io/DefaultFrameReader.java	(revision 720)
@@ -77,6 +77,10 @@
 			_ItemTags.put('K', Item.class.getMethod("setBorderColor",
 					pColor));
+
+			_ItemTags.put('R', Item.class.getMethod("setAnchorLeft", pFloatO));
 			_ItemTags.put('H', Item.class.getMethod("setAnchorRight", pFloatO));
+			_ItemTags.put('N', Item.class.getMethod("setAnchorTop", pFloatO));
 			_ItemTags.put('I', Item.class.getMethod("setAnchorBottom", pFloatO));
+
 			_ItemTags.put('P', Item.class.getMethod("setPosition", pPoint));
 			_ItemTags.put('F', Item.class.getMethod("setLink", pString));
Index: /trunk/src/org/expeditee/io/DefaultFrameWriter.java
===================================================================
--- /trunk/src/org/expeditee/io/DefaultFrameWriter.java	(revision 719)
+++ /trunk/src/org/expeditee/io/DefaultFrameWriter.java	(revision 720)
@@ -71,6 +71,10 @@
 			_ItemTags.put("G", Item.class.getMethod("getBackgroundColor", param));
 			_ItemTags.put("K", Item.class.getMethod("getBorderColor", param));
+
+			_ItemTags.put("R", Item.class.getMethod("getAnchorLeft", param));
 			_ItemTags.put("H", Item.class.getMethod("getAnchorRight", param));
+			_ItemTags.put("N", Item.class.getMethod("getAnchorTop", param));
 			_ItemTags.put("I", Item.class.getMethod("getAnchorBottom", param));
+
 			_ItemTags.put("P", Item.class.getMethod("getPosition", param));
 			_ItemTags.put("T", Text.class.getMethod("getText", param));
Index: /trunk/src/org/expeditee/items/Dot.java
===================================================================
--- /trunk/src/org/expeditee/items/Dot.java	(revision 719)
+++ /trunk/src/org/expeditee/items/Dot.java	(revision 720)
@@ -61,4 +61,23 @@
 
 	@Override
+	public void setAnchorTop(Float anchor) {
+		if (!isLineEnd()) {
+			super.setAnchorTop(anchor);
+			return;
+		}
+		invalidateFill();
+		invalidateCommonTrait(ItemAppearence.PreMoved);
+		int oldY = getY();
+		if (anchor != null) {
+			float deltaY = anchor - oldY;
+			anchorConnected(AnchorEdgeType.Top, deltaY);
+		}
+		this._anchorTop = anchor;
+		this._anchorBottom = null;
+		invalidateCommonTrait(ItemAppearence.PostMoved);
+		invalidateFill();
+	}
+
+	@Override
 	public void setAnchorBottom(Float anchor) {
 		if (!isLineEnd()) {
@@ -72,7 +91,30 @@
 			float deltaY = FrameGraphics.getMaxFrameSize().height - anchor
 					- getBoundsHeight() - oldY;
-			anchorConnected(null, deltaY);
+			anchorConnected(AnchorEdgeType.Bottom, deltaY);
 		}
 		this._anchorBottom = anchor;
+		this._anchorTop = null;
+		invalidateCommonTrait(ItemAppearence.PostMoved);
+		invalidateFill();
+	}
+
+
+	@Override
+	public void setAnchorLeft(Float anchor) {
+		if (!isLineEnd()) {
+			super.setAnchorLeft(anchor);
+			return;
+		}
+		invalidateFill();
+		invalidateCommonTrait(ItemAppearence.PreMoved);
+		int oldX = getX();
+		if (anchor != null) {
+			float deltaX = anchor - oldX;
+
+			anchorConnected(AnchorEdgeType.Left, deltaX);
+		}
+		this._anchorLeft = anchor;
+		this._anchorRight = null;
+		
 		invalidateCommonTrait(ItemAppearence.PostMoved);
 		invalidateFill();
@@ -92,7 +134,8 @@
 					- getBoundsWidth() - oldX;
 
-			anchorConnected(deltaX, null);
+			anchorConnected(AnchorEdgeType.Right, deltaX);
 		}
 		this._anchorRight = anchor;
+		this._anchorLeft = null;
 		invalidateCommonTrait(ItemAppearence.PostMoved);
 		invalidateFill();
Index: /trunk/src/org/expeditee/items/Item.java
===================================================================
--- /trunk/src/org/expeditee/items/Item.java	(revision 719)
+++ /trunk/src/org/expeditee/items/Item.java	(revision 720)
@@ -164,4 +164,8 @@
 	private static Item _tooltipOwner = null;
 
+	public enum AnchorEdgeType {
+		None, Left, Right, Top, Bottom
+	}
+
 	public static void DuplicateItem(Item source, Item dest) {
 		dest.setX(source.getX());
@@ -212,6 +216,8 @@
 		 * the user uses backspace to delete a text line end
 		 */
+		// dest._anchorLeft = source._anchorLeft;
+		// dest._anchorRight = source._anchorRight;
+		// dest._anchorTop = source._anchorTop;
 		// dest._anchorBottom = source._anchorBottom;
-		// dest._anchorRight = source._anchorRight;
 		dest.setFormula(source.getFormula());
 		dest._overlay = source._overlay;
@@ -276,6 +282,8 @@
 	}
 
+	protected Float _anchorLeft = null;
 	protected Float _anchorRight = null;
 
+	protected Float _anchorTop = null;
 	protected Float _anchorBottom = null;
 
@@ -285,5 +293,4 @@
 
 	protected float _x;
-
 	protected float _y;
 
@@ -2824,6 +2831,15 @@
 	}
 
+	public void setAnchorLeft(Float anchor) {
+		this._anchorLeft = anchor;
+		this._anchorRight = null;
+		if (anchor != null) {
+		    setX(anchor);
+		}
+	}
+
 	public void setAnchorRight(Float anchor) {
 		this._anchorRight = anchor;
+		this._anchorLeft = null;
 		if (anchor != null)
 			setX(FrameGraphics.getMaxFrameSize().width - anchor
@@ -2831,12 +2847,30 @@
 	}
 
+	public void setAnchorTop(Float anchor) {
+		this._anchorTop = anchor;
+		this._anchorBottom = null;
+		if (anchor != null)
+			setY(anchor);
+	}
+
+
+	public void setAnchorBottom(Float anchor) {
+		this._anchorBottom = anchor;
+		this._anchorTop = null;
+		if (anchor != null)
+			setY(FrameGraphics.getMaxFrameSize().height - anchor);
+	}
+
+
+	public Float getAnchorLeft() {
+		return _anchorLeft;
+	}
+
 	public Float getAnchorRight() {
 		return _anchorRight;
 	}
 
-	public void setAnchorBottom(Float anchor) {
-		this._anchorBottom = anchor;
-		if (anchor != null)
-			setY(FrameGraphics.getMaxFrameSize().height - anchor);
+	public Float getAnchorTop() {
+		return _anchorTop;
 	}
 
@@ -2898,5 +2932,5 @@
 	}
 
-	protected void anchorConnected(Float deltaX, Float deltaY) {
+	protected void anchorConnectedRefactored(AnchorEdgeType anchorEdgeType, Float delta) {
 		// Check for a more efficient way to do this!!
 		// Invalidate all the items
@@ -2907,11 +2941,29 @@
 		for (Item i : this.getAllConnected()) {
 			if (i.isLineEnd()) {
-				if (deltaX != null) {
-					i.setAnchorRight(null);
-					i.setXY(i.getX() + deltaX, i.getY());
-				}
-				if (deltaY != null) {
-					i.setAnchorBottom(null);
-					i.setXY(i.getX(), i.getY() + deltaY);
+				if (delta != null) {
+					if ((anchorEdgeType == AnchorEdgeType.Left) || (anchorEdgeType == AnchorEdgeType.Right)) {
+						// 'delta' encodes a horizontal (x) move
+						if (anchorEdgeType == AnchorEdgeType.Left) {
+							i.setAnchorLeft(null);
+						}
+						else {
+							// must be Right
+							i.setAnchorRight(null);
+						}
+						
+						i.setXY(i.getX() + delta, i.getY());
+					}
+					if ((anchorEdgeType == AnchorEdgeType.Top) || (anchorEdgeType == AnchorEdgeType.Bottom)) {
+						// 'delta; encodes a vertical (y) move
+						if (anchorEdgeType == AnchorEdgeType.Top) {
+							i.setAnchorTop(null);
+						}
+						else {
+							// must be Bottom
+							i.setAnchorBottom(null);
+						}
+						i.setXY(i.getX(), i.getY() + delta);
+					}
+					
 				}
 			}
@@ -2924,4 +2976,62 @@
 	}
 
+	
+	protected void anchorConnected(AnchorEdgeType anchorEdgeType, Float delta) {
+		// Check for a more efficient way to do this!!
+		// Invalidate all the items
+		for (Item i : this.getAllConnected()) {
+			i.invalidateAll();
+		}
+		
+		// Move the items
+		for (Item i : this.getAllConnected()) {
+			if (i.isLineEnd()) {
+				if (delta != null) {
+					if ((anchorEdgeType == AnchorEdgeType.Left) || (anchorEdgeType == AnchorEdgeType.Right)) {
+						// 'delta' encodes a horizontal (x) move
+						if (anchorEdgeType == AnchorEdgeType.Left) {
+							// Processing a Left anchor
+							// => Anything connected that is *not* anchored to the right should be moved by 'delta'
+							if (i.getAnchorRight()==null) {
+								i.setXY(i.getX() + delta, i.getY());
+							}
+						}
+						else {
+							// Processing a Right anchor
+							// => Anything connected that is *not* anchored to the left should be moved by 'delta'
+							if (i.getAnchorLeft()==null) {
+								i.setXY(i.getX() + delta, i.getY());
+							}
+						}
+
+					}
+					if ((anchorEdgeType == AnchorEdgeType.Top) || (anchorEdgeType == AnchorEdgeType.Bottom)) {
+						// 'delta; encodes a vertical (y) move
+						if (anchorEdgeType == AnchorEdgeType.Top) {
+							// Processing a Top anchor
+							// => Anything connected that is *not* anchored to the bottom should be moved by 'delta'
+							if (i.getAnchorBottom()==null) {
+								i.setXY(i.getX(), i.getY() + delta);
+							}
+						}
+						else {
+							// Processing a Bottom anchor
+							// => Anything connected that is *not* anchored to the top should be moved by 'delta'
+							if (i.getAnchorTop()==null) {
+							// must be Bottom
+							i.setAnchorBottom(null);
+							}
+						}
+					}		
+				}
+			}
+		}
+		
+		// Invalidate them again!!
+		for (Item i : this.getAllConnected()) {
+			i.updatePolygon();
+			i.invalidateAll();
+		}
+	}
 	/**
 	 * Sets the item to pickup when the user attempts to pick this item up.
Index: /trunk/src/org/expeditee/items/Text.java
===================================================================
--- /trunk/src/org/expeditee/items/Text.java	(revision 719)
+++ /trunk/src/org/expeditee/items/Text.java	(revision 720)
@@ -2397,4 +2397,27 @@
 
 	@Override
+	public void setAnchorLeft(Float anchor) {
+		if (!isLineEnd()) {
+			super.setAnchorLeft(anchor);
+			// Subtract off the link width
+			if (anchor != null) {
+				setX(anchor + getLeftMargin());
+			}
+			return;
+		}
+		invalidateFill();
+		invalidateCommonTrait(ItemAppearence.PreMoved);
+		int oldX = getX();
+		if (anchor != null) {
+			float deltaX = anchor + getLeftMargin() - oldX;
+			anchorConnected(AnchorEdgeType.Left, deltaX);
+		}
+		this._anchorLeft = anchor;
+		this._anchorRight = null;
+		invalidateCommonTrait(ItemAppearence.PostMoved);
+		invalidateFill();
+	}
+
+	@Override
 	public void setAnchorRight(Float anchor) {
 		if (!isLineEnd()) {
@@ -2413,7 +2436,32 @@
 			float deltaX = FrameGraphics.getMaxFrameSize().width - anchor
 					- getBoundsWidth() + getLeftMargin() - oldX;
-			anchorConnected(deltaX, null);
+			anchorConnected(AnchorEdgeType.Right, deltaX);
 		}
 		this._anchorRight = anchor;
+		this._anchorLeft = null;
+		invalidateCommonTrait(ItemAppearence.PostMoved);
+		invalidateFill();
+	}
+
+
+
+	@Override
+	public void setAnchorTop(Float anchor) {
+		if (!isLineEnd()) {
+			super.setAnchorTop(anchor);
+			if (anchor != null) {
+				setY(anchor + getBoundsHeight());
+			}
+			return;
+		}
+		invalidateFill();
+		invalidateCommonTrait(ItemAppearence.PreMoved);
+		int oldY = getY();
+		if (anchor != null) {
+			float deltaY = anchor - oldY;
+			anchorConnected(AnchorEdgeType.Top, deltaY);
+		}
+		this._anchorTop = anchor;
+		this._anchorBottom = null;
 		invalidateCommonTrait(ItemAppearence.PostMoved);
 		invalidateFill();
@@ -2430,9 +2478,11 @@
 		int oldY = getY();
 		if (anchor != null) {
+
 			float deltaY = FrameGraphics.getMaxFrameSize().height - anchor
 					- oldY;
-			anchorConnected(null, deltaY);
+			anchorConnected(AnchorEdgeType.Bottom, deltaY);
 		}
 		this._anchorBottom = anchor;
+		this._anchorTop = null;
 		invalidateCommonTrait(ItemAppearence.PostMoved);
 		invalidateFill();
Index: /trunk/src/org/expeditee/items/XRayable.java
===================================================================
--- /trunk/src/org/expeditee/items/XRayable.java	(revision 719)
+++ /trunk/src/org/expeditee/items/XRayable.java	(revision 720)
@@ -135,12 +135,23 @@
 	
 	@Override
+	public Float getAnchorLeft() {
+	        return _source.getAnchorLeft();
+	}
+	
+	@Override
+	public Float getAnchorRight() {
+		return _source.getAnchorRight();
+	}
+
+	@Override
+	public Float getAnchorTop() {
+		return _source.getAnchorTop();
+	}
+
+	@Override
 	public Float getAnchorBottom() {
 		return _source.getAnchorBottom();
 	}
 	
-	@Override
-	public Float getAnchorRight() {
-		return _source.getAnchorRight();
-	}
 	
 	@Override
@@ -235,4 +246,11 @@
 	
 	@Override
+	public void setAnchorTop(Float anchor) {
+		_source.setAnchorTop(anchor);
+		if (anchor != null)
+			_source.setY(anchor + getHeight());
+	}
+
+	@Override
 	public void setAnchorBottom(Float anchor) {
 		_source.setAnchorBottom(anchor);
@@ -240,5 +258,11 @@
 			_source.setY(FrameGraphics.getMaxFrameSize().height - getHeight() - anchor);
 	}
-	
+
+	
+	@Override
+	public void setAnchorLeft(Float anchor) {
+		_source.setAnchorLeft(anchor);
+	}
+
 	@Override
 	public void setAnchorRight(Float anchor) {
Index: /trunk/src/org/expeditee/items/widgets/InteractiveWidget.java
===================================================================
--- /trunk/src/org/expeditee/items/widgets/InteractiveWidget.java	(revision 719)
+++ /trunk/src/org/expeditee/items/widgets/InteractiveWidget.java	(revision 720)
@@ -1705,14 +1705,24 @@
 	}
 
+	public void setAnchorTop(Float anchor) {
+		setPosition(getX(),Math.round(anchor));
+		getSource().setAnchorTop(anchor);
+	}
+
 	public void setAnchorBottom(Float anchor) {
 		setPosition(getX(),
-				Math.round(FrameGraphics.getMaxFrameSize().height - anchor - getHeight()));
+			    Math.round(FrameGraphics.getMaxFrameSize().height - anchor - getHeight()));
 		getSource().setAnchorBottom(anchor);
 	}
 
+	public void setAnchorLeft(Float anchor) {
+		setPosition(Math.round(anchor),
+			    getY());
+		getSource().setAnchorLeft(anchor);
+	}
+
 	public void setAnchorRight(Float anchor) {
-		setPosition(
-				Math.round(FrameGraphics.getMaxFrameSize().width - anchor - getWidth()),
-				getY());
+		setPosition(Math.round(FrameGraphics.getMaxFrameSize().width - anchor - getWidth()),
+			    getY());
 		getSource().setAnchorRight(anchor);
 	}
Index: /trunk/src/org/expeditee/items/widgets/WidgetCorner.java
===================================================================
--- /trunk/src/org/expeditee/items/widgets/WidgetCorner.java	(revision 719)
+++ /trunk/src/org/expeditee/items/widgets/WidgetCorner.java	(revision 720)
@@ -150,4 +150,9 @@
 
 	@Override
+	public void setAnchorTop(Float anchor) {
+		_widgetSource.setAnchorTop(anchor);
+	}
+
+	@Override
 	public void setAnchorBottom(Float anchor) {
 		_widgetSource.setAnchorBottom(anchor);
@@ -155,4 +160,9 @@
 
 	@Override
+	public void setAnchorLeft(Float anchor) {
+		_widgetSource.setAnchorLeft(anchor);
+	}
+
+	@Override
 	public void setAnchorRight(Float anchor) {
 		_widgetSource.setAnchorRight(anchor);
@@ -160,6 +170,16 @@
 
 	@Override
+	public Float getAnchorTop() {
+		return _widgetSource.getSource().getAnchorTop();
+	}
+
+	@Override
 	public Float getAnchorBottom() {
 		return _widgetSource.getSource().getAnchorBottom();
+	}
+
+	@Override
+	public Float getAnchorLeft() {
+		return _widgetSource.getSource().getAnchorLeft();
 	}
 
Index: /trunk/src/org/expeditee/items/widgets/WidgetEdge.java
===================================================================
--- /trunk/src/org/expeditee/items/widgets/WidgetEdge.java	(revision 719)
+++ /trunk/src/org/expeditee/items/widgets/WidgetEdge.java	(revision 720)
@@ -103,4 +103,9 @@
 	
 	@Override
+	public void setAnchorTop(Float anchor) {
+		_widgetSource.setAnchorTop(anchor);
+	}
+
+	@Override
 	public void setAnchorBottom(Float anchor) {
 		_widgetSource.setAnchorBottom(anchor);
@@ -108,4 +113,9 @@
 
 	@Override
+	public void setAnchorLeft(Float anchor) {
+		_widgetSource.setAnchorLeft(anchor);
+	}
+
+	@Override
 	public void setAnchorRight(Float anchor) {
 		_widgetSource.setAnchorRight(anchor);
@@ -113,8 +123,18 @@
 	
 	@Override
+	public Float getAnchorTop() {
+		return _widgetSource.getSource().getAnchorTop();
+	}
+
+	@Override
 	public Float getAnchorBottom() {
 		return _widgetSource.getSource().getAnchorBottom();
 	}
 	
+	@Override
+	public Float getAnchorLeft() {
+		return _widgetSource.getSource().getAnchorLeft();
+	}
+
 	@Override
 	public Float getAnchorRight() {
