Index: /trunk/src/org/expeditee/items/Dot.java
===================================================================
--- /trunk/src/org/expeditee/items/Dot.java	(revision 1513)
+++ /trunk/src/org/expeditee/items/Dot.java	(revision 1514)
@@ -102,4 +102,29 @@
 		invalidateFill();
 	}
+	
+	@Override
+	public void setAnchorCenterX(Integer anchor) {
+		if (!isLineEnd()) {
+			super.setAnchorCenterX(anchor);
+			return;
+		}
+		
+		invalidateFill();
+		invalidateCommonTrait(ItemAppearence.PreMoved);
+		
+		this._anchoring.setCenterXAnchor(anchor);
+		
+		int oldX = getX();
+		if (anchor != null) {
+			int centreX = DisplayController.getFramePaintArea().getCentreX();
+			int alignedToLeft = centreX + anchor;
+			int alignedToCenter = alignedToLeft - (getBoundsWidth() / 2);
+			float deltaX = alignedToCenter - oldX;
+			anchorConnected(AnchorEdgeType.CenterX, deltaX);
+		}
+		
+		invalidateCommonTrait(ItemAppearence.PostMoved);
+		invalidateFill();
+	}
 
 	@Override
@@ -142,4 +167,27 @@
 		}
 
+		invalidateCommonTrait(ItemAppearence.PostMoved);
+		invalidateFill();
+	}
+	
+	@Override
+	public void setAnchorCenterY(Integer anchor) {
+		if (!isLineEnd()) {
+			super.setAnchorCenterY(anchor);
+			return;
+		}
+		invalidateFill();
+		invalidateCommonTrait(ItemAppearence.PreMoved);
+		
+		this._anchoring.setCenterYAnchor(anchor);
+		
+		int oldY = getY();
+		if (anchor != null) {
+			int alignedToTop = DisplayController.getFramePaintArea().getCentreY() + anchor;
+			float alignedToCenter = alignedToTop - (getBoundsHeight() / 2);
+			float deltaY = alignedToCenter - oldY;
+			anchorConnected(AnchorEdgeType.CenterY, deltaY);
+		}
+		
 		invalidateCommonTrait(ItemAppearence.PostMoved);
 		invalidateFill();
Index: /trunk/src/org/expeditee/items/Item.java
===================================================================
--- /trunk/src/org/expeditee/items/Item.java	(revision 1513)
+++ /trunk/src/org/expeditee/items/Item.java	(revision 1514)
@@ -98,5 +98,5 @@
 	/** Which edge of the window things are anchored to. */
 	public enum AnchorEdgeType {
-		None, Left, Right, Top, Bottom
+		None, Left, CenterY, Right, Top, CenterX, Bottom
 	}
 	
@@ -3925,41 +3925,89 @@
 			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());
-							}
+					switch (anchorEdgeType) {
+					case Left:
+						// Processing a Left anchor
+						// => Anything connected that is *not* anchored to the right or center should be moved by 'delta'
+						if (i.getAnchorRight() == null && i.getAnchorCenterX() == 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());
-							}
+						break;
+					case CenterX:
+						// Processing a CenterY anchor
+						// => Anything connected that is *not* anchored to the top or bottom should be moved by 'delta'
+						if (i.getAnchorTop()==null && i.getAnchorBottom()==null) {
+							i.setXY(i.getX() + delta, i.getY());
 						}
-
+						break;
+					case Right:
+						// Processing a Right anchor
+						// => Anything connected that is *not* anchored to the left or center should be moved by 'delta'
+						if (i.getAnchorLeft()==null && i.getAnchorCenterX() == null) {
+							i.setXY(i.getX() + delta, i.getY());
+						}
+						break;
+					case Top:
+						// Processing a Top anchor
+						// => Anything connected that is *not* anchored to the bottom or center should be moved by 'delta'
+						if (i.getAnchorBottom()==null && i.getAnchorCenterY() == null) {
+							i.setXY(i.getX(), i.getY() + delta);
+						}
+						break;
+					case CenterY:
+						// Processing a CenterX anchor
+						// => Anything connected that is *not* anchored to the left or right should be moved by 'delta'
+						if (i.getAnchorLeft() == null && i.getAnchorRight() == null) {
+							i.setXY(i.getX(), i.getY() + delta);
+						}
+						break;
+					case Bottom:
+						// Processing a Bottom anchor
+						// => Anything connected that is *not* anchored to the top or center should be moved by 'delta'
+						if (i.getAnchorTop()==null && i.getAnchorCenterY() == null) {
+							i.setXY(i.getX(), i.getY() + delta);
+						}
+						break;
+					case None:
+					default:
+						break;
+					
 					}
-					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);
-								i.setXY(i.getX(), i.getY() + delta);
-							}
-						}
-					}		
+//					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);
+//								i.setXY(i.getX(), i.getY() + delta);
+//							}
+//						}
+//					}		
 				}
 			}
Index: /trunk/src/org/expeditee/items/Text.java
===================================================================
--- /trunk/src/org/expeditee/items/Text.java	(revision 1513)
+++ /trunk/src/org/expeditee/items/Text.java	(revision 1514)
@@ -2907,4 +2907,40 @@
 		}
 	}
+	
+	@Override
+	public void setAnchorCenterX(Integer anchor) {
+		if (!isLineEnd()) {
+			super.setAnchorCenterX(anchor);
+			// Subtract off the link width
+			if (anchor != null) {
+				int alignedToLeft = DisplayController.getFramePaintArea().getCentreX() + anchor;
+				int alignedToCenter = alignedToLeft - (getBoundsWidth() / 2);
+				setX(alignedToCenter);
+			}
+			return;
+		}
+		invalidateFill();
+		invalidateCommonTrait(ItemAppearence.PostMoved);
+		
+		this._anchoring.setCenterXAnchor(anchor);
+		
+		int oldX = getX();
+		if (anchor != null) {
+			float deltaX = DisplayController.getFramePaintArea().getCentreX() - anchor - getBoundsWidth() + getLeftMargin() - oldX;
+			anchorConnected(AnchorEdgeType.CenterY, deltaX);
+		}
+		
+		invalidateCommonTrait(ItemAppearence.PostMoved);
+		invalidateFill();
+		
+		if (isSurrogate()) {
+			surrogatePropertyInheritance.put(DefaultFrameWriter.ANCHOR_CENTERX_STR, false);
+			Item primary = getPrimary();
+			if (subjectToInheritanceCheckOnSave(DefaultFrameWriter.ANCHOR_CENTERX_STR)) {
+				EncryptionDetail inheritanceCheckOnSave = new EncryptionDetail(EncryptionDetail.Type.InheritanceCheckOnSave);
+				primary.primaryPropertyEncryption.put(DefaultFrameWriter.ANCHOR_CENTERX_STR, inheritanceCheckOnSave);
+			}
+		}
+	}
 
 	@Override
@@ -2983,4 +3019,36 @@
 				primary.primaryPropertyEncryption.put(DefaultFrameWriter.ANCHOR_TOP_STR, inheritanceCheckOnSave);
 			}
+		}
+	}
+	
+	@Override
+	public void setAnchorCenterY(Integer anchor) {
+		if (!isLineEnd()) {
+			super.setAnchorCenterY(anchor);
+			if (anchor != null) {
+				List<TextLayout> textLayouts = getTextLayouts();
+				if (!textLayouts.isEmpty()) {
+					int middle = textLayouts.size() / 2;
+					float heightFromTopOfTextItem = 0;
+					for (int i = 0; i <= middle; i++) {
+						TextLayout tl = textLayouts.get(i);
+						float ascent = tl.getAscent();
+						float descent = tl.getDescent();
+						heightFromTopOfTextItem += (ascent + descent);
+					}
+					heightFromTopOfTextItem -= textLayouts.get(middle).getDescent();
+					float anchorCalc = anchor + this.getBoundsHeight() - heightFromTopOfTextItem;
+					setY((DisplayController.getFramePaintAreaHeight() / 2) - anchorCalc);
+				} else if (this.getFont() != null) {
+					// p could be any character
+					TextLayout fakeLayout = TextLayout.getManager().layoutStringSimple("p", this.getFont());
+					float ascent = fakeLayout.getAscent();
+					float descent = fakeLayout.getDescent();
+					float middle = descent - ascent;
+					float anchorCalc = anchor + this.getBoundsHeight() - middle;
+					setY((DisplayController.getFramePaintAreaHeight() / 2) - anchorCalc);
+				}
+			}
+			return;
 		}
 	}
