Upgrade to GEF 3.10
diff --git a/bundles/org.eclipse.rap.draw2d.compatibility/src/org/eclipse/draw2d/rap/swt/graphics/LineAttributes.java b/bundles/org.eclipse.rap.draw2d.compatibility/src/org/eclipse/draw2d/rap/swt/graphics/LineAttributes.java
index 76bf199..1ab0ddd 100644
--- a/bundles/org.eclipse.rap.draw2d.compatibility/src/org/eclipse/draw2d/rap/swt/graphics/LineAttributes.java
+++ b/bundles/org.eclipse.rap.draw2d.compatibility/src/org/eclipse/draw2d/rap/swt/graphics/LineAttributes.java
@@ -119,5 +119,23 @@
   public LineAttributes( final float width, final int cap, final int join ) {
     super(width,cap,join);
   }
-
+  
+  /**
+   * Create a new line attributes with the specified arguments.
+   * @param width
+   * @param cap
+   * @param join
+   * @param style
+   * @param dash
+   * @param dashOffset
+   * @param miterLimit
+   */
+  public LineAttributes(float width, int cap, int join, int style, float[] dash, float dashOffset, float miterLimit) {
+    this(width,cap,join);
+    this.style = style;
+    this.dash = dash;
+    this.dashOffset = dashOffset;
+    this.miterLimit = miterLimit;
+  }
+  
 }
diff --git a/bundles/org.eclipse.rap.draw2d/readme.txt b/bundles/org.eclipse.rap.draw2d/readme.txt
index fd7a66e..ce93b3c 100644
--- a/bundles/org.eclipse.rap.draw2d/readme.txt
+++ b/bundles/org.eclipse.rap.draw2d/readme.txt
@@ -1 +1 @@
-The source version of this port is: 3.9.200.qualifier
\ No newline at end of file
+The source version of this port is: 3.10.0.qualifier
\ No newline at end of file
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/BorderLayout.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/BorderLayout.java
index f28ddb3..62ac062 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/BorderLayout.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/BorderLayout.java
@@ -110,7 +110,7 @@
 	/**
 	 * @see AbstractLayout#calculatePreferredSize(IFigure, int, int)
 	 */
-	protected Dimension calculatePreferredSize(IFigure container, int wHint,
+	protected Dimension calculatePreferredSize(IFigure figure, int wHint,
 			int hHint) {
 		int minWHint = 0, minHHint = 0;
 		if (wHint < 0)
@@ -119,7 +119,7 @@
 		if (hHint < 0)
 			minHHint = -1;
 
-		Insets border = container.getInsets();
+		Insets border = figure.getInsets();
 		wHint = Math.max(minWHint, wHint - border.getWidth());
 		hHint = Math.max(minHHint, hHint - border.getHeight());
 		Dimension prefSize = new Dimension();
@@ -167,6 +167,7 @@
 		prefSize.width = Math.max(prefSize.width, middleRowWidth)
 				+ border.getWidth() + ((columns - 1) * hGap);
 
+		prefSize.union(getBorderPreferredSize(figure));
 		return prefSize;
 	}
 
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/ButtonModel.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/ButtonModel.java
index 7597cfd..bccaf90 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/ButtonModel.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/ButtonModel.java
@@ -451,7 +451,6 @@
 // RAPEND: [am]
 	}
 
-
 	/**
 	 * Sets the pressed property of this button.
 	 * 
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/DeferredUpdateManager.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/DeferredUpdateManager.java
index 2775b5c..664ef26 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/DeferredUpdateManager.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/DeferredUpdateManager.java
@@ -16,12 +16,12 @@
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.SWTException;
 import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.widgets.Display;
 
 import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.SWT;
 
 /**
  * An UpdateManager that asynchronously updates the affected figures.
@@ -147,7 +147,10 @@
 		return graphicsSource.getGraphics(region);
 	}
 
-	void paint(GC gc) {
+	/**
+	 * @since 3.10
+	 */
+	protected void paint(GC gc) {
 		if (!validating) {
 			SWTGraphics graphics = new SWTGraphics(gc);
 			if (!updating) {
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/GhostImageFigure.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/GhostImageFigure.java
index e39d597..2b6a820 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/GhostImageFigure.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/GhostImageFigure.java
@@ -93,4 +93,4 @@
 				getBounds().width, getBounds().height);
 		feedbackImage.dispose();
 	}
-}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/GridLayout.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/GridLayout.java
index 36aa063..1bab20e 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/GridLayout.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/GridLayout.java
@@ -22,13 +22,13 @@
 
 /**
  * Lays out children into a Grid arrangement in which overall aligment and
- * spacing can be configured, as well as specfic layout requirements for the
+ * spacing can be configured, as well as specific layout requirements for the
  * each individual member of the GridLayout. This layout is a Draw2D port of the
  * swt GridLayout.
  * 
  * <code>GridLayout</code> has a number of configuration fields, and the Figures
  * it lays out can have an associated layout data object, called
- * <code>GridData</code> (similar to the swt GridData object). The power of
+ * <code>GridData</code> (similar to the SWT GridData object). The power of
  * <code>GridLayout</code> lies in the ability to configure
  * <code>GridData</code> for each Figure in the layout.
  * <p>
@@ -225,7 +225,7 @@
 		// initChildren( container);
 		Rectangle rect = container.getClientArea();
 		layout(container, true, rect.x, rect.y, rect.width, rect.height, /* flushCache */
-		true);
+				true);
 
 	}
 
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/PopUpHelper.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/PopUpHelper.java
index 31e0822..acb2bfa 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/PopUpHelper.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/PopUpHelper.java
@@ -10,13 +10,13 @@
  *******************************************************************************/
 package org.eclipse.draw2d;
 
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Shell;
 
 import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.swt.SWT;
 
 /**
  * Provides abstract support for classes that manage popups. Popups in Draw2d
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/PrintFigureOperation.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/PrintFigureOperation.java
index 68b12dc..d745f15 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/PrintFigureOperation.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/PrintFigureOperation.java
@@ -7,23 +7,23 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
- *     Sven M�ller - Added tiling support
+ *     Sven Müller - Added tiling support
  *******************************************************************************/
 package org.eclipse.draw2d;
 
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.printing.Printer;
 import org.eclipse.swt.widgets.Display;
 
 import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.SWT;
 
 /**
  * Class responsible for printing Figures.
  * 
  * @author Dan Lee
  * @author Eric Bordeau
- * @author Sven M�ller
+ * @author Sven Müller
  */
 public class PrintFigureOperation extends PrintOperation {
 
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/PrintOperation.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/PrintOperation.java
index 8cc91e0..6b27580 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/PrintOperation.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/PrintOperation.java
@@ -10,12 +10,12 @@
  *******************************************************************************/
 package org.eclipse.draw2d;
 
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.printing.Printer;
 
 import org.eclipse.draw2d.geometry.Insets;
 import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.SWT;
 
 /**
  * Implementation of draw2d's printing capabilities.
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/Shape.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/Shape.java
index afcd0f1..2031839 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/Shape.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/Shape.java
@@ -363,7 +363,7 @@
 		// synchronize line style which may have been assigned
 		// to lineStyle field for backwards compatibility
 		if (lineStyle != lastLineStyle) {
-		lineAttributes.style = lineStyle;
+			lineAttributes.style = lineStyle;
 			lastLineStyle = lineStyle;
 		}
 
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/TitleBarBorder.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/TitleBarBorder.java
index a258985..e6ddc76 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/TitleBarBorder.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/TitleBarBorder.java
@@ -12,6 +12,7 @@
 package org.eclipse.draw2d;
 
 import org.eclipse.swt.graphics.Color;
+
 import org.eclipse.draw2d.geometry.Dimension;
 import org.eclipse.draw2d.geometry.Insets;
 import org.eclipse.draw2d.geometry.Rectangle;
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/ToolTipHelper.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/ToolTipHelper.java
index 98305f7..b4bbeb9 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/ToolTipHelper.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/ToolTipHelper.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13,11 +13,12 @@
 import java.util.Timer;
 import java.util.TimerTask;
 
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseTrackAdapter;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.widgets.Display;
 
 import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.swt.SWT;
 
 /**
  * This class is used by SWTEventDispatcher as support to display Figure
@@ -31,6 +32,7 @@
 
 	private Timer timer;
 	private IFigure currentTipSource;
+	private int hideDelay = 5000;
 
 	/**
 	 * Constructs a ToolTipHelper to be associated with Control <i>c</i>.
@@ -70,6 +72,18 @@
 	}
 
 	/**
+	 * Sets the tooltip hide delay, which is the amount in ms, after which the
+	 * tooltip will disappear again.
+	 * 
+	 * @param hideDelay
+	 *            The delay after which the tooltip is hidden again, in ms.
+	 * @since 3.10
+	 */
+	public void setHideDelay(int hideDelay) {
+		this.hideDelay = hideDelay;
+	}
+
+	/**
 	 * Sets the LightWeightSystem's contents to the passed tooltip, and displays
 	 * the tip. The tip will be displayed only if the tip source is different
 	 * than the previously viewed tip source. (i.e. The cursor has moved off of
@@ -105,11 +119,10 @@
 					Display.getDefault().asyncExec(new Runnable() {
 						public void run() {
 							hide();
-							timer.cancel();
 						}
 					});
 				}
-			}, 5000);
+			}, hideDelay);
 		}
 	}
 
@@ -120,27 +133,30 @@
 	 */
 	public void dispose() {
 		if (isShowing()) {
-			timer.cancel();
 			hide();
 		}
 		getShell().dispose();
 	}
 
+	protected void hide() {
+		if (timer != null) {
+			timer.cancel();
+		}
+		super.hide();
+	}
+
 	/**
 	 * @see PopUpHelper#hookShellListeners()
 	 */
 	protected void hookShellListeners() {
 		// Close the tooltip window if the mouse enters the tooltip
-		// UNSUPPORTED - api not implemented in RAP
-		// getShell().addMouseTrackListener(new MouseTrackAdapter() {
-		// public void mouseEnter(org.eclipse.swt.events.MouseEvent e) {
-		// hide();
-		// currentTipSource = null;
-		// if (timer != null) {
-		// timer.cancel();
-		// }
-		// }
-		// });
+	    // UNSUPPORTED - api not implemented in RAP
+//		getShell().addMouseTrackListener(new MouseTrackAdapter() {
+//			public void mouseEnter(org.eclipse.swt.events.MouseEvent e) {
+//				hide();
+//				currentTipSource = null;
+//			}
+//		});
 	}
 
 	/**
@@ -166,14 +182,12 @@
 		if (figureUnderMouse == null) {
 			if (isShowing()) {
 				hide();
-				timer.cancel();
 			}
 		}
 		// Makes tooltip appear without a hover event if a tip is currently
 		// being displayed
 		if (isShowing() && figureUnderMouse != currentTipSource) {
 			hide();
-			timer.cancel();
 			displayToolTipNear(figureUnderMouse, tip, eventX, eventY);
 		} else if (!isShowing() && figureUnderMouse != currentTipSource)
 			currentTipSource = null;
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/ViewportAwareConnectionLayerClippingStrategy.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/ViewportAwareConnectionLayerClippingStrategy.java
index 455c262..56c4620 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/ViewportAwareConnectionLayerClippingStrategy.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/ViewportAwareConnectionLayerClippingStrategy.java
@@ -105,14 +105,14 @@
 			// compute if source and target anchor are visible
 			// within the nearest common enclosing viewport (which may
 			// itself be nested in other viewports).
-			Rectangle sourceClipRect = getAbsoluteBoundsAsCopy(sourceFigure);
+			Rectangle sourceClipRect = clipRect.getCopy();
 			if (nearestEnclosingSourceViewport != nearestEnclosingCommonViewport) {
 				clipAtViewports(sourceClipRect,
 						ViewportUtilities.getViewportsPath(
 								nearestEnclosingSourceViewport,
 								nearestEnclosingCommonViewport, false));
 			}
-			Rectangle targetClipRect = getAbsoluteBoundsAsCopy(targetFigure);
+			Rectangle targetClipRect = clipRect.getCopy();
 			if (nearestEnclosingTargetViewport != nearestEnclosingCommonViewport) {
 				clipAtViewports(targetClipRect,
 						ViewportUtilities.getViewportsPath(
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/parts/Thumbnail.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/parts/Thumbnail.java
index cfbec60..8246378 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/parts/Thumbnail.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/parts/Thumbnail.java
@@ -6,20 +6,13 @@
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
- * IBM Corporation - initial API and implementation
+ *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.draw2d.parts;
 
 import java.util.Iterator;
 import java.util.Map;
 
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.widgets.Display;
-
 import org.eclipse.draw2d.Figure;
 import org.eclipse.draw2d.Graphics;
 import org.eclipse.draw2d.IFigure;
@@ -29,6 +22,10 @@
 import org.eclipse.draw2d.geometry.Dimension;
 import org.eclipse.draw2d.geometry.Rectangle;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
 
 /**
  * A Thumbnail is a Figure that displays an image of its source Figure at a
@@ -47,12 +44,18 @@
 		static final int MAX_BUFFER_SIZE = 256;
 		private int currentHTile, currentVTile;
 		private int hTiles, vTiles;
+		private Dimension tileSize;
 		private boolean isActive = true;
 
 		private boolean isRunning = false;
+		private Image tileImage;
+		private Dimension tileImageSize;
+		// GC and Graphics to let the source figure paint on the tile image
+		private GC tileGC;
+		private SWTGraphics tileGCGraphics;
+		private ScaledGraphics tileGraphics;
+		// GC used to copy from the tile image into the thumbnail image
 		private GC thumbnailGC;
-		private ScaledGraphics thumbnailGraphics;
-		private Dimension tileSize;
 
 		/**
 		 * Stops the updater and disposes of any resources.
@@ -146,7 +149,7 @@
 		 * required, {@link #stop()} is called.
 		 */
 		public void run() {
-			if (!isActive() || !isRunning() || thumbnailGraphics == null)
+			if (!isActive() || !isRunning() || tileGraphics == null)
 				return;
 			int v = getCurrentVTile();
 			int sy1 = v * tileSize.height;
@@ -157,16 +160,29 @@
 			int sx1 = h * tileSize.width;
 			int sx2 = Math.min((h + 1) * tileSize.width,
 					getSourceRectangle().width);
+
+			tileGraphics.pushState();
+			// clear the background (by filling with the background color)
+			Rectangle rect = new Rectangle(0, 0, sx2 - sx1, sy2 - sy1);
+			tileGraphics.fillRectangle(rect);
+
+			// let the source figure paint into the tile image
+			// IMPORTANT (fix for bug #309912): we do not let the source figure
+			// paint directly into the thumbnail image, because we cannot ensure
+			// that it paints completely inside the current tile area (it may
+			// set its own clip inside paint(Graphics) and overwrite areas of
+			// tile that have already been rendered. By providing an own tile
+			// image and copying from it into the thumbnail image, we are safe.
 			org.eclipse.draw2d.geometry.Point p = getSourceRectangle()
 					.getLocation();
+			tileGraphics.translate(-p.x - sx1, -p.y - sy1);
+			tileGraphics.scale(getScaleX());
+			sourceFigure.paint(tileGraphics);
+			tileGraphics.popState();
 
-			Rectangle rect = new Rectangle(sx1 + p.x, sy1 + p.y, sx2 - sx1, sy2
-					- sy1);
-			thumbnailGraphics.pushState();
-			thumbnailGraphics.setClip(rect);
-			thumbnailGraphics.fillRectangle(rect);
-			sourceFigure.paint(thumbnailGraphics);
-			thumbnailGraphics.popState();
+			// copy the painted tile image into the thumbnail image
+			thumbnailGC.drawImage(tileImage, 0, 0, sx2 - sx1, sy2 - sy1, sx1,
+					sy1, sx2 - sx1, sy2 - sy1);
 
 			if (getCurrentHTile() < (hTiles - 1))
 				setCurrentHTile(getCurrentHTile() + 1);
@@ -232,6 +248,7 @@
 
 			isRunning = true;
 			setDirty(false);
+
 			resetTileValues();
 
 			if (!targetSize.equals(thumbnailImageSize)) {
@@ -240,23 +257,28 @@
 
 			if (targetSize.isEmpty())
 				return;
+
 			// UNSUPPORTED - image constructor not implemented in RAP
-			// thumbnailGC = new GC(thumbnailImage,
-			// sourceFigure.isMirrored() ? SWT.RIGHT_TO_LEFT : SWT.NONE);
-			thumbnailGC = new GC(thumbnailImage.getDevice(),
+            // thumbnailGC = new GC(thumbnailImage, SWT.NONE);
+            thumbnailGC = new GC(thumbnailImage.getDevice(),SWT.NONE);
+			
+			if (!tileSize.equals(tileImageSize)) {
+				resetTileImage();
+			}
+
+			//tileGC = new GC(tileImage,
+			tileGC = new GC(tileImage.getDevice(),
 					sourceFigure.isMirrored() ? org.eclipse.draw2d.rap.swt.SWT.RIGHT_TO_LEFT : SWT.NONE);
-			thumbnailGraphics = new ScaledGraphics(new SWTGraphics(thumbnailGC));
-			thumbnailGraphics.scale(getScaleX());
-			thumbnailGraphics.translate(getSourceRectangle().getLocation()
-					.negate());
+			tileGCGraphics = new SWTGraphics(tileGC);
+			tileGraphics = new ScaledGraphics(tileGCGraphics);
 
 			Color color = sourceFigure.getForegroundColor();
 			if (color != null)
-				thumbnailGraphics.setForegroundColor(color);
+				tileGraphics.setForegroundColor(color);
 			color = sourceFigure.getBackgroundColor();
 			if (color != null)
-				thumbnailGraphics.setBackgroundColor(color);
-			thumbnailGraphics.setFont(sourceFigure.getFont());
+				tileGraphics.setBackgroundColor(color);
+			tileGraphics.setFont(sourceFigure.getFont());
 
 			setScales(targetSize.width / (float) getSourceRectangle().width,
 					targetSize.height / (float) getSourceRectangle().height);
@@ -264,10 +286,6 @@
 			Display.getCurrent().asyncExec(this);
 		}
 
-		/**
-		 * 
-		 * @since 3.2
-		 */
 		private void resetThumbnailImage() {
 			if (thumbnailImage != null)
 				thumbnailImage.dispose();
@@ -282,23 +300,49 @@
 			}
 		}
 
+		private void resetTileImage() {
+			if (tileImage != null)
+				tileImage.dispose();
+
+			if (!tileSize.isEmpty()) {
+				tileImage = new Image(Display.getDefault(), tileSize.width,
+						tileSize.height);
+				tileImageSize = new Dimension(tileSize);
+			} else {
+				tileImage = null;
+				tileImageSize = new Dimension(0, 0);
+			}
+		}
+
 		/**
 		 * Stops this updater. Also disposes of resources (except the thumbnail
 		 * image which is still needed for painting).
 		 */
 		public void stop() {
 			isRunning = false;
-			if (thumbnailGraphics != null) {
-				thumbnailGraphics.dispose();
-				thumbnailGraphics = null;
+			if (tileGraphics != null) {
+				tileGraphics.dispose();
+				tileGraphics = null;
+			}
+			if (tileGCGraphics != null) {
+				tileGCGraphics.dispose();
+				tileGCGraphics = null;
+			}
+			if (tileGC != null) {
+				tileGC.dispose();
+				tileGC = null;
 			}
 			if (thumbnailGC != null) {
 				thumbnailGC.dispose();
 				thumbnailGC = null;
 			}
+			if (tileImage != null) {
+				tileImage.dispose();
+				tileImage = null;
+				tileImageSize = null;
+			}
 			// Don't dispose of the thumbnail image since it is needed to paint
-			// the
-			// figure when the source is not dirty (i.e. showing/hiding the
+			// the figure when the source is not dirty (i.e. showing/hiding the
 			// dock).
 		}
 	}
@@ -310,6 +354,7 @@
 	private IFigure sourceFigure;
 	Dimension targetSize = new Dimension(0, 0);
 	private Image thumbnailImage;
+
 	private Dimension thumbnailImageSize;
 	private ThumbnailUpdater updater = new ThumbnailUpdater();
 
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/text/BlockFlowLayout.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/text/BlockFlowLayout.java
index 093892e..640a14c 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/text/BlockFlowLayout.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/text/BlockFlowLayout.java
@@ -12,11 +12,11 @@
 
 import java.util.List;
 
+import org.eclipse.swt.SWT;
 
 import org.eclipse.draw2d.Figure;
 import org.eclipse.draw2d.PositionConstants;
 import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.swt.SWT;
 
 /**
  * The layout for {@link BlockFlow} figures.
diff --git a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/text/InlineFlow.java b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/text/InlineFlow.java
index 4457c75..85705da 100644
--- a/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/text/InlineFlow.java
+++ b/bundles/org.eclipse.rap.draw2d/src/org/eclipse/draw2d/text/InlineFlow.java
@@ -14,12 +14,12 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.eclipse.swt.SWT;
 
 import org.eclipse.draw2d.Border;
 import org.eclipse.draw2d.ColorConstants;
 import org.eclipse.draw2d.Graphics;
 import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.SWT;
 
 /**
  * A <code>FlowFigure</code> represented by multiple <code>LineBox</code>
diff --git a/bundles/org.eclipse.rap.gef/plugin.xml b/bundles/org.eclipse.rap.gef/plugin.xml
index 2025010..61e0c7e 100644
--- a/bundles/org.eclipse.rap.gef/plugin.xml
+++ b/bundles/org.eclipse.rap.gef/plugin.xml
Binary files differ
diff --git a/bundles/org.eclipse.rap.gef/readme.txt b/bundles/org.eclipse.rap.gef/readme.txt
index b347ccc..ce93b3c 100644
--- a/bundles/org.eclipse.rap.gef/readme.txt
+++ b/bundles/org.eclipse.rap.gef/readme.txt
@@ -1 +1 @@
-The source version of this port is: 3.9.100.qualifier
\ No newline at end of file
+The source version of this port is: 3.10.0.qualifier
\ No newline at end of file
diff --git a/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/commands/Command.java b/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/commands/Command.java
index 7789847..e4bb3d5 100644
--- a/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/commands/Command.java
+++ b/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/commands/Command.java
@@ -39,6 +39,15 @@
 	}
 
 	/**
+	 * @return <code>true</code> if the command can be redone. This method
+	 *         should only be called after <code>undo()</code> has been called.
+	 * @since 3.10
+	 */
+	public boolean canRedo() {
+		return canExecute();
+	}
+
+	/**
 	 * @return <code>true</code> if the command can be executed
 	 */
 	public boolean canExecute() {
@@ -90,7 +99,7 @@
 	}
 
 	/**
-	 * executes the Command. This method should not be called if the Command is
+	 * Executes the Command. This method should not be called if the Command is
 	 * not executable.
 	 */
 	public void execute() {
diff --git a/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/commands/CommandStack.java b/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/commands/CommandStack.java
index e49f4fe..a9efcce 100644
--- a/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/commands/CommandStack.java
+++ b/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/commands/CommandStack.java
@@ -153,7 +153,9 @@
 	 * @return <code>true</code> if it is appropriate to call {@link #redo()}.
 	 */
 	public boolean canRedo() {
-		return !redoable.isEmpty();
+		if (redoable.size() == 0)
+			return false;
+		return ((Command) redoable.peek()).canRedo();
 	}
 
 	/**
@@ -162,7 +164,7 @@
 	public boolean canUndo() {
 		if (undoable.size() == 0)
 			return false;
-		return ((Command) undoable.lastElement()).canUndo();
+		return ((Command) undoable.peek()).canUndo();
 	}
 
 	/**
@@ -388,6 +390,8 @@
 	 * should only be called when {@link #canUndo()} returns <code>true</code>.
 	 */
 	public void undo() {
+		if (!canUndo())
+			return;
 		// Assert.isTrue(canUndo());
 		Command command = (Command) undoable.pop();
 		notifyListeners(command, PRE_UNDO);
diff --git a/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/commands/CompoundCommand.java b/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/commands/CompoundCommand.java
index 2ce00bc..e3c11fc 100644
--- a/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/commands/CompoundCommand.java
+++ b/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/commands/CompoundCommand.java
@@ -60,6 +60,24 @@
 	}
 
 	/**
+	 * @see org.eclipse.gef.commands.Command#canRedo()
+	 * 
+	 * @since 3.10
+	 */
+	public boolean canRedo() {
+		if (commandList.size() == 0)
+			return false;
+		for (int i = 0; i < commandList.size(); i++) {
+			Command cmd = (Command) commandList.get(i);
+			if (cmd == null)
+				return false;
+			if (!cmd.canRedo())
+				return false;
+		}
+		return true;
+	}
+
+	/**
 	 * @see org.eclipse.gef.commands.Command#canExecute()
 	 */
 	public boolean canExecute() {
diff --git a/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/editparts/ScalableFreeformRootEditPart.java b/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/editparts/ScalableFreeformRootEditPart.java
index 8dbcd02..8ce3bc0 100644
--- a/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/editparts/ScalableFreeformRootEditPart.java
+++ b/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/editparts/ScalableFreeformRootEditPart.java
@@ -92,6 +92,19 @@
 	}
 
 	/**
+	 * Responsible of creating a {@link ZoomManager} to be used by this
+	 * {@link ScalableRootEditPart}.
+	 * 
+	 * @return A new {@link ZoomManager} bound to the given
+	 *         {@link ScalableFigure} and {@link Viewport}.
+	 * @since 3.10
+	 */
+	protected ZoomManager createZoomManager(ScalableFigure scalableFigure,
+			Viewport viewport) {
+		return new ZoomManager(scalableFigure, viewport);
+	}
+
+	/**
 	 * @see FreeformGraphicalRootEditPart#createLayers(LayeredPane)
 	 */
 	protected void createLayers(LayeredPane layeredPane) {
diff --git a/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/requests/GroupRequest.java b/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/requests/GroupRequest.java
index 68226a2..5b70ee0 100644
--- a/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/requests/GroupRequest.java
+++ b/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/requests/GroupRequest.java
@@ -64,7 +64,7 @@
 	 *            The EditPart making the request.
 	 */
 	public void setEditParts(EditPart part) {
-		parts = new ArrayList();
+		parts = new ArrayList(1);
 		parts.add(part);
 	}
 
diff --git a/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/tools/ResizeTracker.java b/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/tools/ResizeTracker.java
index 343d154..504773e 100644
--- a/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/tools/ResizeTracker.java
+++ b/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/tools/ResizeTracker.java
@@ -49,7 +49,7 @@
 	 * Key modifier for centered resizing. It's ALT on the Mac and MOD1 on all
 	 * other platforms.
 	 */
-	static final int MODIFIER_CENTERED_RESIZE = SWT.ALT;
+	static final int MODIFIER_CENTERED_RESIZE = SWT.MOD1;
 
 	/**
 	 * Key modifier for constrained resizing. It's SHIFT on all platforms.
diff --git a/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/ui/parts/SelectionSynchronizer.java b/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/ui/parts/SelectionSynchronizer.java
index f7c551c..f3186c0 100644
--- a/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/ui/parts/SelectionSynchronizer.java
+++ b/bundles/org.eclipse.rap.gef/src/org/eclipse/gef/ui/parts/SelectionSynchronizer.java
@@ -103,12 +103,24 @@
 		}
 	}
 
-	private void syncSelection(EditPartViewer source, ISelection selection) {
+	/**
+	 * Synchronizes the given selection to all registered viewers except the one
+	 * serving as selectionSource, by delegating to
+	 * {@link #applySelection(EditPartViewer, ISelection)}.
+	 * 
+	 * @param selectionSource
+	 *            The viewer from which the selection originated.
+	 * @param selection
+	 *            The selection to apply to the other viewers.
+	 * @since 3.10
+	 */
+	protected void syncSelection(EditPartViewer selectionSource,
+			ISelection selection) {
 		isDispatching = true;
 		for (int i = 0; i < viewers.size(); i++) {
-			if (viewers.get(i) != source) {
+			if (viewers.get(i) != selectionSource) {
 				EditPartViewer viewer = (EditPartViewer) viewers.get(i);
-				setViewerSelection(viewer, selection);
+				applySelection(viewer, selection);
 			}
 		}
 		isDispatching = false;
@@ -130,7 +142,23 @@
 		}
 	}
 
-	private void setViewerSelection(EditPartViewer viewer, ISelection selection) {
+	/**
+	 * Applies the given EditPart selection from another viewer to the given
+	 * viewer. It will first compute a new selection of {@link EditPart}s for
+	 * the given viewer by searching those that control the same model elements
+	 * as the {@link EditPart}s in the given selection (via
+	 * {@link #convert(EditPartViewer, EditPart)}), apply this new selection to
+	 * the given viewer, and reveal the last part in the new selection.
+	 * 
+	 * @param viewer
+	 *            The viewer to apply the given selection to.
+	 * @param selection
+	 *            The selection to apply, which has to be an
+	 *            {@link IStructuredSelection} of {@link EditPart}s of another
+	 *            viewer.
+	 * @since 3.10
+	 */
+	protected void applySelection(EditPartViewer viewer, ISelection selection) {
 		ArrayList result = new ArrayList();
 		Iterator iter = ((IStructuredSelection) selection).iterator();
 		while (iter.hasNext()) {
diff --git a/bundles/org.eclipse.rap.zest.core/readme.txt b/bundles/org.eclipse.rap.zest.core/readme.txt
index c8582cc..82168f0 100644
--- a/bundles/org.eclipse.rap.zest.core/readme.txt
+++ b/bundles/org.eclipse.rap.zest.core/readme.txt
@@ -1 +1 @@
-The source version of this port is: 1.5.100.qualifier
\ No newline at end of file
+The source version of this port is: 1.5.200.qualifier
\ No newline at end of file
diff --git a/bundles/org.eclipse.rap.zest.core/src/org/eclipse/zest/core/viewers/GraphViewer.java b/bundles/org.eclipse.rap.zest.core/src/org/eclipse/zest/core/viewers/GraphViewer.java
index 242406a..27a5769 100644
--- a/bundles/org.eclipse.rap.zest.core/src/org/eclipse/zest/core/viewers/GraphViewer.java
+++ b/bundles/org.eclipse.rap.zest.core/src/org/eclipse/zest/core/viewers/GraphViewer.java
@@ -35,7 +35,6 @@
 import org.eclipse.zest.core.viewers.internal.ZoomManager;
 import org.eclipse.zest.core.widgets.Graph;
 import org.eclipse.zest.core.widgets.GraphItem;
-import org.eclipse.zest.core.widgets.ZestStyles;
 import org.eclipse.zest.layouts.LayoutAlgorithm;
 
 /*
@@ -46,7 +45,8 @@
  * 
  * @author Chris Callendar
  */
-public class GraphViewer extends AbstractStructuredGraphViewer implements ISelectionProvider {
+public class GraphViewer extends AbstractStructuredGraphViewer implements
+		ISelectionProvider {
 
 	protected Graph graph = null;
 	private IStylingGraphModelFactory modelFactory = null;
@@ -57,14 +57,9 @@
 	 * Initializes the viewer.
 	 * 
 	 * @param composite
+	 *            The parent composite.
 	 * @param style
-	 *            the style for the viewer and for the layout algorithm
-	 * @see ZestStyles#LAYOUT_GRID
-	 * @see ZestStyles#LAYOUT_TREE
-	 * @see ZestStyles#LAYOUT_RADIAL
-	 * @see ZestStyles#LAYOUT_SPRING
-	 * @see ZestStyles#NO_OVERLAPPING_NODES
-	 * @see ZestStyles#NODES_HIGHLIGHT_ADJACENT
+	 *            The style for the viewer and the related Graph.
 	 * @see SWT#V_SCROLL
 	 * @see SWT#H_SCROLL
 	 */
@@ -89,10 +84,12 @@
 				Iterator iterator = selectionChangedListeners.iterator();
 
 				ISelection structuredSelection = getSelection();
-				SelectionChangedEvent event = new SelectionChangedEvent(GraphViewer.this, structuredSelection);
+				SelectionChangedEvent event = new SelectionChangedEvent(
+						GraphViewer.this, structuredSelection);
 
 				while (iterator.hasNext()) {
-					ISelectionChangedListener listener = (ISelectionChangedListener) iterator.next();
+					ISelectionChangedListener listener = (ISelectionChangedListener) iterator
+							.next();
 					listener.selectionChanged(event);
 				}
 				firePostSelectionChanged(event);
@@ -103,7 +100,8 @@
 		control.addMouseListener(new MouseListener() {
 
 			public void mouseDoubleClick(MouseEvent e) {
-				DoubleClickEvent doubleClickEvent = new DoubleClickEvent(GraphViewer.this, getSelection());
+				DoubleClickEvent doubleClickEvent = new DoubleClickEvent(
+						GraphViewer.this, getSelection());
 				fireDoubleClick(doubleClickEvent);
 			}
 
@@ -130,7 +128,8 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#getGraphControl()
+	 * @see org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#
+	 * getGraphControl()
 	 */
 	public Graph getGraphControl() {
 		return super.getGraphControl();
@@ -151,7 +150,8 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#setLayoutAlgorithm(org.eclipse.zest.layouts.LayoutAlgorithm)
+	 * @see org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#
+	 * setLayoutAlgorithm(org.eclipse.zest.layouts.LayoutAlgorithm)
 	 */
 	public void setLayoutAlgorithm(LayoutAlgorithm algorithm) {
 		super.setLayoutAlgorithm(algorithm);
@@ -160,7 +160,9 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.zest.core.viewers.AbstractStructuredGraphViewer#setNodeStyle(int)
+	 * @see
+	 * org.eclipse.zest.core.viewers.AbstractStructuredGraphViewer#setNodeStyle
+	 * (int)
 	 */
 	public void setNodeStyle(int nodeStyle) {
 		super.setNodeStyle(nodeStyle);
@@ -178,7 +180,8 @@
 			modelFactory = null;
 			super.setContentProvider(contentProvider);
 		} else {
-			throw new IllegalArgumentException("Invalid content provider, only IGraphContentProvider, IGraphEntityContentProvider, or IGraphEntityRelationshipContentProvider are supported.");
+			throw new IllegalArgumentException(
+					"Invalid content provider, only IGraphContentProvider, IGraphEntityContentProvider, or IGraphEntityRelationshipContentProvider are supported.");
 		}
 	}
 
@@ -198,7 +201,8 @@
 	 */
 	public GraphItem findGraphItem(Object element) {
 		Widget[] result = findItems(element);
-		return (result.length == 0 || !(result[0] instanceof GraphItem)) ? null : (GraphItem) result[0];
+		return (result.length == 0 || !(result[0] instanceof GraphItem)) ? null
+				: (GraphItem) result[0];
 	}
 
 	/**
@@ -228,7 +232,9 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#reveal(java.lang.Object)
+	 * @see
+	 * org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#reveal
+	 * (java.lang.Object)
 	 */
 	public void reveal(Object element) {
 		super.reveal(element);
@@ -237,7 +243,8 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#setConnectionStyle(int)
+	 * @see org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#
+	 * setConnectionStyle(int)
 	 */
 	public void setConnectionStyle(int connectionStyle) {
 		super.setConnectionStyle(connectionStyle);
@@ -246,7 +253,9 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#unReveal(java.lang.Object)
+	 * @see
+	 * org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#unReveal
+	 * (java.lang.Object)
 	 */
 	public void unReveal(Object element) {
 		super.unReveal(element);
@@ -258,7 +267,8 @@
 		}
 	}
 
-	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+	public void removeSelectionChangedListener(
+			ISelectionChangedListener listener) {
 		if (selectionChangedListeners.contains(listener)) {
 			selectionChangedListeners.remove(listener);
 		}
@@ -268,7 +278,8 @@
 	// for new actions.
 	protected ZoomManager getZoomManager() {
 		if (zoomManager == null) {
-			zoomManager = new ZoomManager(getGraphControl().getRootLayer(), getGraphControl().getViewport());
+			zoomManager = new ZoomManager(getGraphControl().getRootLayer(),
+					getGraphControl().getViewport());
 		}
 		return zoomManager;
 	}
@@ -276,7 +287,8 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.zest.core.viewers.AbstractStructuredGraphViewer#getFactory()
+	 * @see
+	 * org.eclipse.zest.core.viewers.AbstractStructuredGraphViewer#getFactory()
 	 */
 	protected IStylingGraphModelFactory getFactory() {
 		if (modelFactory == null) {
@@ -294,7 +306,8 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.zest.core.viewers.AbstractStructuredGraphViewer#getLayoutAlgorithm()
+	 * @see org.eclipse.zest.core.viewers.AbstractStructuredGraphViewer#
+	 * getLayoutAlgorithm()
 	 */
 	protected LayoutAlgorithm getLayoutAlgorithm() {
 		return graph.getLayoutAlgorithm();
diff --git a/bundles/org.eclipse.rap.zest.core/src/org/eclipse/zest/core/widgets/internal/XYScaledGraphics.java b/bundles/org.eclipse.rap.zest.core/src/org/eclipse/zest/core/widgets/internal/XYScaledGraphics.java
index ca7c3ac..8c057a5 100644
--- a/bundles/org.eclipse.rap.zest.core/src/org/eclipse/zest/core/widgets/internal/XYScaledGraphics.java
+++ b/bundles/org.eclipse.rap.zest.core/src/org/eclipse/zest/core/widgets/internal/XYScaledGraphics.java
@@ -40,7 +40,8 @@
  */
 public class XYScaledGraphics extends ScaledGraphics {
 
-	public static final double MAX_TEXT_SIZE = 0.45; // MAX size, when to stop zooming text
+	public static final double MAX_TEXT_SIZE = 0.45; // MAX size, when to stop
+														// zooming text
 
 	private static class FontHeightCache {
 		Font font;
@@ -81,7 +82,7 @@
 		private double appliedY;
 		private Font font;
 		private int lineWidth;
-		//private double zoom;  // This has been replaced with xZoom and yZoom
+		// private double zoom; // This has been replaced with xZoom and yZoom
 		private double xZoom;
 		private double yZoom;
 
@@ -106,7 +107,8 @@
 		 * @param lineWidth
 		 *            the line width
 		 */
-		protected State(double xZoom, double yZoom, double x, double y, Font font, int lineWidth) {
+		protected State(double xZoom, double yZoom, double x, double y,
+				Font font, int lineWidth) {
 			this.xZoom = xZoom;
 			this.yZoom = yZoom;
 			this.appliedX = x;
@@ -129,7 +131,8 @@
 		 * @param lineWidth
 		 *            the line width
 		 */
-		protected void setValues(double xZoom, double yZoom, double x, double y, Font font, int lineWidth) {
+		protected void setValues(double xZoom, double yZoom, double x,
+				double y, Font font, int lineWidth) {
 			this.xZoom = xZoom;
 			this.yZoom = yZoom;
 			this.appliedX = x;
@@ -149,7 +152,7 @@
 	}
 
 	private boolean allowText = true;
-	//	private static final Point PT = new Point();
+	// private static final Point PT = new Point();
 	private Map fontCache = new HashMap();
 	private Map fontDataCache = new HashMap();
 	private FontKey fontKey = new FontKey();
@@ -190,12 +193,12 @@
 
 	/** @see Graphics#dispose() */
 	public void dispose() {
-		//Remove all states from the stack
+		// Remove all states from the stack
 		while (stackPointer > 0) {
 			popState();
 		}
 
-		//Dispose fonts
+		// Dispose fonts
 		Iterator iter = fontCache.values().iterator();
 		while (iter.hasNext()) {
 			Font font = ((Font) iter.next());
@@ -222,22 +225,31 @@
 	public void drawImage(Image srcImage, int x, int y) {
 		org.eclipse.swt.graphics.Rectangle size = srcImage.getBounds();
 		double imageZoom = Math.min(xZoom, yZoom);
-		graphics.drawImage(srcImage, 0, 0, size.width, size.height, (int) (Math.floor((x * xZoom + fractionalX))), (int) (Math.floor((y * yZoom + fractionalY))), (int) (Math.floor((size.width * imageZoom + fractionalX))), (int) (Math.floor((size.height * imageZoom + fractionalY))));
+		graphics.drawImage(srcImage, 0, 0, size.width, size.height,
+				(int) (Math.floor((x * xZoom + fractionalX))),
+				(int) (Math.floor((y * yZoom + fractionalY))),
+				(int) (Math.floor((size.width * imageZoom + fractionalX))),
+				(int) (Math.floor((size.height * imageZoom + fractionalY))));
 	}
 
 	/** @see Graphics#drawImage(Image, int, int, int, int, int, int, int, int) */
-	public void drawImage(Image srcImage, int sx, int sy, int sw, int sh, int tx, int ty, int tw, int th) {
-		//"t" == target rectangle, "s" = source
+	public void drawImage(Image srcImage, int sx, int sy, int sw, int sh,
+			int tx, int ty, int tw, int th) {
+		// "t" == target rectangle, "s" = source
 
 		Rectangle t = zoomRect(tx, ty, tw, th);
 		if (!t.isEmpty()) {
-			graphics.drawImage(srcImage, sx, sy, sw, sh, t.x, t.y, t.width, t.height);
+			graphics.drawImage(srcImage, sx, sy, sw, sh, t.x, t.y, t.width,
+					t.height);
 		}
 	}
 
 	/** @see Graphics#drawLine(int, int, int, int) */
 	public void drawLine(int x1, int y1, int x2, int y2) {
-		graphics.drawLine((int) (Math.floor((x1 * xZoom + fractionalX))), (int) (Math.floor((y1 * yZoom + fractionalY))), (int) (Math.floor((x2 * xZoom + fractionalX))), (int) (Math.floor((y2 * yZoom + fractionalY))));
+		graphics.drawLine((int) (Math.floor((x1 * xZoom + fractionalX))),
+				(int) (Math.floor((y1 * yZoom + fractionalY))),
+				(int) (Math.floor((x2 * xZoom + fractionalX))),
+				(int) (Math.floor((y2 * yZoom + fractionalY))));
 	}
 
 	/** @see Graphics#drawOval(int, int, int, int) */
@@ -247,7 +259,8 @@
 
 	/** @see Graphics#drawPoint(int, int) */
 	public void drawPoint(int x, int y) {
-		graphics.drawPoint((int) Math.floor(x * xZoom + fractionalX), (int) Math.floor(y * yZoom + fractionalY));
+		graphics.drawPoint((int) Math.floor(x * xZoom + fractionalX),
+				(int) Math.floor(y * yZoom + fractionalY));
 	}
 
 	/**
@@ -281,7 +294,8 @@
 
 	/** @see Graphics#drawRoundRectangle(Rectangle, int, int) */
 	public void drawRoundRectangle(Rectangle r, int arcWidth, int arcHeight) {
-		graphics.drawRoundRectangle(zoomRect(r.x, r.y, r.width, r.height), (int) (arcWidth * xZoom), (int) (arcHeight * yZoom));
+		graphics.drawRoundRectangle(zoomRect(r.x, r.y, r.width, r.height),
+				(int) (arcWidth * xZoom), (int) (arcHeight * yZoom));
 	}
 
 	/** @see Graphics#drawString(String, int, int) */
@@ -311,9 +325,14 @@
 	 * @see Graphics#drawTextLayout(TextLayout, int, int, int, int, Color,
 	 *      Color)
 	 */
-	public void drawTextLayout(TextLayout layout, int x, int y, int selectionStart, int selectionEnd, Color selectionForeground, Color selectionBackground) {
+	public void drawTextLayout(TextLayout layout, int x, int y,
+			int selectionStart, int selectionEnd, Color selectionForeground,
+			Color selectionBackground) {
 		TextLayout scaled = zoomTextLayout(layout);
-		graphics.drawTextLayout(scaled, (int) Math.floor(x * xZoom + fractionalX), (int) Math.floor(y * yZoom + fractionalY), selectionStart, selectionEnd, selectionBackground, selectionForeground);
+		graphics.drawTextLayout(scaled,
+				(int) Math.floor(x * xZoom + fractionalX),
+				(int) Math.floor(y * yZoom + fractionalY), selectionStart,
+				selectionEnd, selectionForeground, selectionBackground);
 		scaled.dispose();
 	}
 
@@ -355,7 +374,8 @@
 
 	/** @see Graphics#fillRoundRectangle(Rectangle, int, int) */
 	public void fillRoundRectangle(Rectangle r, int arcWidth, int arcHeight) {
-		graphics.fillRoundRectangle(zoomFillRect(r.x, r.y, r.width, r.height), (int) (arcWidth * xZoom), (int) (arcHeight * yZoom));
+		graphics.fillRoundRectangle(zoomFillRect(r.x, r.y, r.width, r.height),
+				(int) (arcWidth * xZoom), (int) (arcHeight * yZoom));
 	}
 
 	/** @see Graphics#fillString(String, int, int) */
@@ -525,9 +545,11 @@
 		State s;
 		if (stack.size() > stackPointer) {
 			s = (State) stack.get(stackPointer);
-			s.setValues(xZoom, yZoom, fractionalX, fractionalY, getLocalFont(), localLineWidth);
+			s.setValues(xZoom, yZoom, fractionalX, fractionalY, getLocalFont(),
+					localLineWidth);
 		} else {
-			stack.add(new State(xZoom, yZoom, fractionalX, fractionalY, getLocalFont(), localLineWidth));
+			stack.add(new State(xZoom, yZoom, fractionalX, fractionalY,
+					getLocalFont(), localLineWidth));
 		}
 		stackPointer++;
 
@@ -555,7 +577,7 @@
 
 	/** @see Graphics#scale(double) */
 	public void scale(double amount) {
-		//setScale(zoom * amount);
+		// setScale(zoom * amount);
 		throw new RuntimeException("Operation not supported, use scale(x, y)");
 	}
 
@@ -682,7 +704,7 @@
 
 	/** @see Graphics#translate(int, int) */
 	public void translate(int dx, int dy) {
-		// fractionalX/Y is the fractional part left over from previous 
+		// fractionalX/Y is the fractional part left over from previous
 		// translates that gets lost in the integer approximation.
 		double dxFloat = dx * xZoom + fractionalX;
 		double dyFloat = dy * yZoom + fractionalY;
@@ -694,16 +716,20 @@
 	private Rectangle zoomClipRect(Rectangle r) {
 		tempRECT.x = (int) (Math.floor(r.x * xZoom + fractionalX));
 		tempRECT.y = (int) (Math.floor(r.y * yZoom + fractionalY));
-		tempRECT.width = (int) (Math.ceil(((r.x + r.width) * xZoom + fractionalX))) - tempRECT.x;
-		tempRECT.height = (int) (Math.ceil(((r.y + r.height) * yZoom + fractionalY))) - tempRECT.y;
+		tempRECT.width = (int) (Math
+				.ceil(((r.x + r.width) * xZoom + fractionalX))) - tempRECT.x;
+		tempRECT.height = (int) (Math
+				.ceil(((r.y + r.height) * yZoom + fractionalY))) - tempRECT.y;
 		return tempRECT;
 	}
 
 	private Rectangle zoomFillRect(int x, int y, int w, int h) {
 		tempRECT.x = (int) (Math.floor((x * xZoom + fractionalX)));
 		tempRECT.y = (int) (Math.floor((y * yZoom + fractionalY)));
-		tempRECT.width = (int) (Math.floor(((x + w - 1) * xZoom + fractionalX))) - tempRECT.x + 1;
-		tempRECT.height = (int) (Math.floor(((y + h - 1) * yZoom + fractionalY))) - tempRECT.y + 1;
+		tempRECT.width = (int) (Math.floor(((x + w - 1) * xZoom + fractionalX)))
+				- tempRECT.x + 1;
+		tempRECT.height = (int) (Math
+				.floor(((y + h - 1) * yZoom + fractionalY))) - tempRECT.y + 1;
 		return tempRECT;
 	}
 
@@ -757,7 +783,8 @@
 		// Scale the points
 		for (int i = 0; (i + 1) < points.length; i += 2) {
 			scaled[i] = (int) (Math.floor((points[i] * xZoom + fractionalX)));
-			scaled[i + 1] = (int) (Math.floor((points[i + 1] * yZoom + fractionalY)));
+			scaled[i + 1] = (int) (Math
+					.floor((points[i + 1] * yZoom + fractionalY)));
 		}
 		return scaled;
 	}
@@ -765,8 +792,10 @@
 	private Rectangle zoomRect(int x, int y, int w, int h) {
 		tempRECT.x = (int) (Math.floor(x * xZoom + fractionalX));
 		tempRECT.y = (int) (Math.floor(y * yZoom + fractionalY));
-		tempRECT.width = (int) (Math.floor(((x + w) * xZoom + fractionalX))) - tempRECT.x;
-		tempRECT.height = (int) (Math.floor(((y + h) * yZoom + fractionalY))) - tempRECT.y;
+		tempRECT.width = (int) (Math.floor(((x + w) * xZoom + fractionalX)))
+				- tempRECT.x;
+		tempRECT.height = (int) (Math.floor(((y + h) * yZoom + fractionalY)))
+				- tempRECT.y;
 		return tempRECT;
 	}
 
@@ -799,13 +828,16 @@
 			int start = 0, offset = 1;
 			TextStyle style = null, lastStyle = layout.getStyle(0);
 			for (; offset <= length; offset++) {
-				if (offset != length && (style = layout.getStyle(offset)) == lastStyle) {
+				if (offset != length
+						&& (style = layout.getStyle(offset)) == lastStyle) {
 					continue;
 				}
 				int end = offset - 1;
 
 				if (lastStyle != null) {
-					TextStyle zoomedStyle = new TextStyle(zoomFont(lastStyle.font), lastStyle.foreground, lastStyle.background);
+					TextStyle zoomedStyle = new TextStyle(
+							zoomFont(lastStyle.font), lastStyle.foreground,
+							lastStyle.background);
 					zoomed.setStyle(zoomedStyle, start, end);
 				}
 				lastStyle = style;
@@ -817,7 +849,7 @@
 
 	private Point zoomTextPoint(int x, int y) {
 		if (localCache.font != localFont) {
-			//Font is different, re-calculate its height
+			// Font is different, re-calculate its height
 			FontMetrics metric = FigureUtilities.getFontMetrics(localFont);
 			// UNSUPPORTED - getDescent() not implemented in RAP
 //			localCache.height = metric.getHeight() - metric.getDescent();
@@ -831,7 +863,9 @@
 //			targetCache.height = metric.getHeight() - metric.getDescent();
 			targetCache.height = metric.getHeight();
 		}
-		return new Point(((int) (Math.floor((x * xZoom) + fractionalX))), (int) (Math.floor((y + localCache.height - 1) * yZoom - targetCache.height + 1 + fractionalY)));
+		return new Point(((int) (Math.floor((x * xZoom) + fractionalX))),
+				(int) (Math.floor((y + localCache.height - 1) * yZoom
+						- targetCache.height + 1 + fractionalY)));
 	}
 
 }
diff --git a/bundles/org.eclipse.rap.zest.layouts/readme.txt b/bundles/org.eclipse.rap.zest.layouts/readme.txt
index f7d6424..c45857f 100644
--- a/bundles/org.eclipse.rap.zest.layouts/readme.txt
+++ b/bundles/org.eclipse.rap.zest.layouts/readme.txt
@@ -1 +1 @@
-The source version of this port is: 1.1.100.qualifier
\ No newline at end of file
+The source version of this port is: 1.1.200.qualifier
\ No newline at end of file
diff --git a/tests/org.eclipse.draw2d.test/src/org/eclipse/draw2d/test/AdvancedGraphicsTests.java b/tests/org.eclipse.draw2d.test/src/org/eclipse/draw2d/test/AdvancedGraphicsTests.java
new file mode 100644
index 0000000..7a415f4
--- /dev/null
+++ b/tests/org.eclipse.draw2d.test/src/org/eclipse/draw2d/test/AdvancedGraphicsTests.java
@@ -0,0 +1,457 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.draw2d.test;
+
+import java.util.Stack;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.SWTGraphics;
+import org.eclipse.draw2d.rap.swt.graphics.LineAttributes;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.PaletteData;
+import org.eclipse.swt.graphics.Path;
+import org.eclipse.swt.graphics.Pattern;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Resource;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+public class AdvancedGraphicsTests extends AbstractFixtureTestCase {
+
+	static final int LINE[] = new int[] { 5, 5, 20, 20, 35, 5, 50, 5 };
+	static final int POLY[] = new int[] { 5, 5, 45, 15, 20, 30, 20, 20, 45, 35,
+			5, 45 };
+	private static final int PREVIEW_DELAY = 250;
+	private SWTGraphics g;
+
+	private Image image;
+	private GC imageGC;
+	private Path path1;
+	private Path path2;
+	private Stack resources = new Stack();
+
+	private void assertImageEquality(int width, int height) {
+		ImageData data = image.getImageData();
+		int src, dst;
+		PaletteData palette = data.palette;
+		for (int y = 0; y < height; y++)
+			for (int x = 0; x < width; x++) {
+				src = data.getPixel(x, y);
+				dst = data.getPixel(x, y + height);
+
+				if (src != dst) {
+					RGB rgb1 = palette.getRGB(src);
+					RGB rgb2 = palette.getRGB(dst);
+					// HACK, image operations seem to differ by as much as 4
+					if (Math.abs(rgb1.red - rgb2.red) > 4
+							|| Math.abs(rgb1.green - rgb2.green) > 4
+							|| Math.abs(rgb1.blue - rgb2.blue) > 4)
+						assertEquals("Discrepancy at coordinates <" + x + ", "
+								+ y + ">", rgb1, rgb2);
+				}
+			}
+	}
+
+	private void displayImage() {
+		final Shell shell = new Shell(SWT.DIALOG_TRIM);
+		shell.addPaintListener(new PaintListener() {
+			public void paintControl(PaintEvent e) {
+				e.gc.drawImage(image, 0, 0);
+			}
+		});
+		shell.setBounds(100, 100, 800, 600);
+		shell.open();
+		Display d = shell.getDisplay();
+		d.timerExec(PREVIEW_DELAY, new Runnable() {
+			public void run() {
+				if (!shell.isDisposed())
+					shell.close();
+			}
+		});
+		while (!shell.isDisposed())
+			while (!d.readAndDispatch())
+				d.sleep();
+
+	}
+
+	private void performTestcase(Runnable painter, Runnable tests[]) {
+		g.pushState();
+		painter.run();
+		for (int i = 0; i < tests.length; i++) {
+			g.translate(100, 0);
+			tests[i].run();
+			g.pushState();
+			painter.run();
+		}
+
+		for (int i = 0; i <= tests.length; i++) {
+			g.popState();
+			g.translate(0, 100);
+			painter.run();
+		}
+
+		displayImage();
+		assertImageEquality(100 * tests.length, 100);
+	}
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		path1 = new Path(null);
+		path1.moveTo(20, 5);
+		path1.quadTo(40, 5, 50, 25);
+		path1.quadTo(20, 25, 20, 45);
+		path1.lineTo(0, 25);
+		path1.close();
+
+		path2 = new Path(null);
+		path2.moveTo(15, 30);
+		path2.cubicTo(50, 0, 50, 30, 20, 60);
+		path2.close();
+
+		image = new Image(Display.getDefault(), 800, 600);
+		imageGC = new GC(image.getDevice(), SWT.NONE);
+		g = new SWTGraphics(imageGC);
+
+		resources.push(path1);
+		resources.push(path2);
+		resources.push(image);
+		resources.push(imageGC);
+	}
+
+	protected void tearDown() throws Exception {
+		g.dispose();
+		while (!resources.isEmpty())
+			((Resource) resources.pop()).dispose();
+		super.tearDown();
+	}
+
+	public void testAntialias() {
+		class AntialiasSettings implements Runnable {
+			private final Color color;
+			private final int normal;
+			private final int text;
+
+			AntialiasSettings(int text, int normal, Color color) {
+				this.text = text;
+				this.normal = normal;
+				this.color = color;
+			}
+
+			public void run() {
+				g.setAntialias(normal);
+				g.setTextAntialias(text);
+				g.setForegroundColor(color);
+			}
+		}
+
+		g.setLineWidthFloat(9);
+		g.pushState();
+
+		Runnable tests[] = new Runnable[4];
+		tests[0] = new AntialiasSettings(SWT.ON, SWT.ON, ColorConstants.red);
+		tests[1] = new AntialiasSettings(SWT.OFF, SWT.OFF, ColorConstants.blue);
+		tests[2] = new AntialiasSettings(SWT.DEFAULT, SWT.ON,
+				ColorConstants.black);
+		tests[3] = new AntialiasSettings(SWT.ON, SWT.DEFAULT,
+				ColorConstants.darkGreen);
+		performTestcase(new Runnable() {
+			public void run() {
+				g.drawPolyline(LINE);
+				g.drawString("OWVO", 35, 20);
+			}
+		}, tests);
+	}
+
+	public void testFillRules() {
+
+		class FillRules implements Runnable {
+			private final int aa;
+			private final int rule;
+
+			FillRules(int rule, int aa) {
+				this.rule = rule;
+				this.aa = aa;
+			}
+
+			public void run() {
+				g.setFillRule(rule);
+				// $TODO
+				g.setAntialias(aa);
+			}
+		}
+		g.setBackgroundColor(ColorConstants.red);
+		g.pushState();
+
+		Runnable tests[] = new Runnable[3];
+		tests[0] = new FillRules(org.eclipse.draw2d.rap.swt.SWT.FILL_EVEN_ODD,
+				SWT.ON);
+		tests[1] = new FillRules(org.eclipse.draw2d.rap.swt.SWT.FILL_WINDING,
+				SWT.OFF);
+		tests[2] = new FillRules(org.eclipse.draw2d.rap.swt.SWT.FILL_EVEN_ODD,
+				SWT.DEFAULT);
+		performTestcase(new Runnable() {
+			public void run() {
+				g.fillPolygon(POLY);
+			}
+		}, tests);
+	}
+
+	// public void testInterpolation() {
+	// class InterpolationSettings implements Runnable {
+	// private final int level;
+	// InterpolationSettings (int level) {
+	// this.level = level;
+	// }
+	// public void run() {
+	// g.setInterpolation(level);
+	// }
+	// }
+	//
+	// g.pushState();
+	//
+	// Runnable tests[] = new Runnable[4];
+	// tests[0] = new InterpolationSettings(SWT.HIGH);
+	// tests[1] = new InterpolationSettings(SWT.LOW);
+	// tests[2] = new InterpolationSettings(SWT.NONE);
+	// tests[3] = new InterpolationSettings(SWT.DEFAULT);
+	// performTestcase(new Runnable() {
+	// public void run() {
+	// g.drawImage(TestImages.depth_24, 0, 0, 400, 400, 0, 0, 75, 75);
+	// }
+	// }, tests);
+	// }
+
+	public void testLineJoinCap() {
+
+		class LineSettings implements Runnable {
+			private final int cap;
+			private final int style;
+			private final int join;
+
+			LineSettings(int join, int cap, int style) {
+				this.join = join;
+				this.cap = cap;
+				this.style = style;
+			}
+
+			public void run() {
+				g.setLineCap(cap);
+				g.setLineJoin(join);
+				g.setLineStyle(style);
+			}
+		}
+
+		g.setLineWidthFloat(9);
+		g.pushState();
+
+		Runnable[] tests = new Runnable[] {
+				new LineSettings(SWT.JOIN_ROUND, SWT.CAP_ROUND,
+						org.eclipse.draw2d.rap.swt.SWT.LINE_DASH),
+				new LineSettings(SWT.JOIN_BEVEL, SWT.CAP_FLAT,
+						org.eclipse.draw2d.rap.swt.SWT.LINE_DOT),
+				new LineSettings(SWT.JOIN_ROUND, SWT.CAP_SQUARE,
+						org.eclipse.draw2d.rap.swt.SWT.LINE_SOLID) };
+
+		performTestcase(new Runnable() {
+			public void run() {
+				g.drawPolyline(LINE);
+			}
+		}, tests);
+	}
+
+	public void testLineJoinCapAA() {
+		g.setAntialias(SWT.ON);
+		testLineJoinCap();
+	}
+
+	public void testLineAttributes() {
+		class LineSettings implements Runnable {
+			private LineAttributes attributes;
+
+			public LineSettings(LineAttributes attributes) {
+				this.attributes = attributes;
+			}
+
+			public void run() {
+				g.setLineAttributes(attributes);
+			}
+		}
+
+		float[] dash = new float[] { 2.5f, 3, 8 };
+
+		Runnable[] tests = new Runnable[] {
+				new LineSettings(new LineAttributes(0.0f, SWT.CAP_FLAT,
+						SWT.JOIN_MITER,
+						org.eclipse.draw2d.rap.swt.SWT.LINE_SOLID, null, 0, 10)),
+				new LineSettings(new LineAttributes(1.0f, SWT.CAP_FLAT,
+						SWT.JOIN_MITER,
+						org.eclipse.draw2d.rap.swt.SWT.LINE_SOLID, null, 0, 10)),
+				new LineSettings(new LineAttributes(2.5f, SWT.CAP_FLAT,
+						SWT.JOIN_MITER,
+						org.eclipse.draw2d.rap.swt.SWT.LINE_SOLID, null, 0, 10)),
+				new LineSettings(new LineAttributes(5.0f, SWT.CAP_FLAT,
+						SWT.JOIN_MITER,
+						org.eclipse.draw2d.rap.swt.SWT.LINE_DASH, null, 0, 10)),
+				new LineSettings(new LineAttributes(5.0f, SWT.CAP_FLAT,
+						SWT.JOIN_ROUND,
+						org.eclipse.draw2d.rap.swt.SWT.LINE_DASHDOTDOT, null,
+						0, 10)),
+				new LineSettings(new LineAttributes(4.5f, SWT.CAP_FLAT,
+						SWT.JOIN_MITER,
+						org.eclipse.draw2d.rap.swt.SWT.LINE_SOLID, null, 0, 10)),
+				new LineSettings(
+						new LineAttributes(9.0f, SWT.CAP_FLAT, SWT.JOIN_ROUND,
+								org.eclipse.draw2d.rap.swt.SWT.LINE_CUSTOM,
+								dash, 0, 10)),
+				new LineSettings(
+						new LineAttributes(9.5f, SWT.CAP_FLAT, SWT.JOIN_ROUND,
+								org.eclipse.draw2d.rap.swt.SWT.LINE_CUSTOM,
+								dash, 5, 10)), };
+
+		performTestcase(new Runnable() {
+			public void run() {
+				g.drawPolyline(LINE);
+			}
+		}, tests);
+	}
+
+	public void testLineAttributesAA() {
+		g.setAntialias(SWT.ON);
+		testLineAttributes();
+	}
+
+	// public void testPathDraw() {
+	//
+	// class PathSettings implements Runnable {
+	// private final int antialias;
+	// private final Color color;
+	// private final int style;
+	// private final int width;
+	// PathSettings(int antialias, int width, int style, Color color) {
+	// this.antialias = antialias;
+	// this.width = width;
+	// this.style = style;
+	// this.color = color;
+	// }
+	// public void run() {
+	// g.setAntialias(antialias);
+	// g.setLineWidth(width);
+	// g.setLineStyle(style);
+	// g.setForegroundColor(color);
+	// }
+	// }
+	//
+	// g.setBackgroundColor(ColorConstants.darkBlue);
+	//
+	// Runnable tests[] = new Runnable[5];
+	// tests[0] = new PathSettings(SWT.ON, 3, SWT.LINE_SOLID,
+	// ColorConstants.darkBlue);
+	// tests[1] = new PathSettings(SWT.OFF, 0, SWT.LINE_DOT,
+	// ColorConstants.red);
+	// tests[2] = new PathSettings(SWT.DEFAULT, 1, SWT.LINE_DOT,
+	// ColorConstants.darkBlue);
+	// tests[3] = new PathSettings(SWT.DEFAULT, 2, SWT.LINE_DOT,
+	// ColorConstants.darkGreen);
+	// tests[4] = new PathSettings(SWT.ON, 2, SWT.LINE_DASHDOTDOT,
+	// ColorConstants.black);
+	// performTestcase(new Runnable() {
+	// public void run() {
+	// g.drawPath(path1);
+	// g.drawPath(path2);
+	// }
+	// }, tests);
+	//
+	// path1.dispose();
+	// }
+
+	// public void testPathFill() {
+	//
+	// class PathSettings implements Runnable {
+	// private final int antialias;
+	// private final int alpha;
+	// PathSettings(int antialias, int alpha) {
+	// this.antialias = antialias;
+	// this.alpha = alpha;
+	// }
+	// public void run() {
+	// g.setAntialias(antialias);
+	// g.setAlpha(alpha);
+	// }
+	// }
+	//
+	// g.setBackgroundColor(ColorConstants.darkBlue);
+	//
+	// Runnable tests[] = new Runnable[4];
+	// tests[0] = new PathSettings(SWT.ON, 200);
+	// tests[1] = new PathSettings(SWT.OFF, 100);
+	// tests[2] = new PathSettings(SWT.DEFAULT, 200);
+	// tests[3] = new PathSettings(SWT.ON, 150);
+	// performTestcase(new Runnable() {
+	// public void run() {
+	// g.setFillRule(SWT.FILL_EVEN_ODD);
+	// g.fillPath(path1);
+	// g.fillPath(path2);
+	// }
+	// }, tests);
+	//
+	// path1.dispose();
+	// }
+
+	public void testPatterns() {
+
+		class SetPattern implements Runnable {
+			private final Pattern bg;
+			private final Pattern fg;
+
+			SetPattern(Pattern bg, Pattern fg) {
+				this.bg = bg;
+				this.fg = fg;
+			}
+
+			public void run() {
+				g.setBackgroundPattern(bg);
+				g.setForegroundPattern(fg);
+			}
+		}
+
+		// Initial state
+		Font f = new Font(null, "Helvetica", 50, SWT.BOLD);
+		resources.push(f);
+		g.setFont(f);
+		g.setBackgroundColor(ColorConstants.yellow);
+		g.pushState();
+
+		Pattern gradient = new Pattern(null, 0, 0, 80, 40, ColorConstants.gray,
+				ColorConstants.black);
+		Pattern image = new Pattern(null, TestImages.depth_24);
+
+		resources.push(gradient);
+		resources.push(image);
+
+		Runnable tests[] = new Runnable[1];
+		tests[0] = new SetPattern(image, gradient);
+		performTestcase(new Runnable() {
+			public void run() {
+				g.fillText("W", 0, 0);
+			}
+		}, tests);
+
+	}
+
+}
\ No newline at end of file
diff --git a/tests/org.eclipse.draw2d.test/src/org/eclipse/draw2d/test/TextualTests.java b/tests/org.eclipse.draw2d.test/src/org/eclipse/draw2d/test/TextualTests.java
index 915aa1f..83d2c5a 100644
--- a/tests/org.eclipse.draw2d.test/src/org/eclipse/draw2d/test/TextualTests.java
+++ b/tests/org.eclipse.draw2d.test/src/org/eclipse/draw2d/test/TextualTests.java
@@ -48,7 +48,7 @@
 
 		// TODO enhance verification
 		List boldFragments = bold.getFragments();
-		assertEquals(3, boldFragments.size());
+		assertTrue(boldFragments.size() == 3);
 		List italicFragments = italics.getFragments();
 		assertTrue(italicFragments.size() == 2);
 	}
diff --git a/tests/org.eclipse.zest.tests/src/org/eclipse/zest/tests/IFigureProviderTests.java b/tests/org.eclipse.zest.tests/src/org/eclipse/zest/tests/IFigureProviderTests.java
index 4ffd985..8885006 100644
--- a/tests/org.eclipse.zest.tests/src/org/eclipse/zest/tests/IFigureProviderTests.java
+++ b/tests/org.eclipse.zest.tests/src/org/eclipse/zest/tests/IFigureProviderTests.java
@@ -78,9 +78,12 @@
 					.getText());

 		}

 		String string = buffer.toString();

-		assertTrue("Label 1 should be in figure labels", string.contains("1"));

-		assertTrue("Label 2 should be in figure labels", string.contains("2"));

-		assertTrue("Label 3 should be in figure labels", string.contains("3"));

+		assertTrue("Label 1 should be in figure labels",

+				string.indexOf("1") >= 0);

+		assertTrue("Label 2 should be in figure labels",

+				string.indexOf("2") >= 0);

+		assertTrue("Label 3 should be in figure labels",

+				string.indexOf("3") >= 0);

 	}

 

 	private class DestinationContentProvider implements IGraphContentProvider {