Index: src/net/refractions/udig/project/internal/render/impl/ViewportModelImpl.java
===================================================================
--- src/net/refractions/udig/project/internal/render/impl/ViewportModelImpl.java	(revision 31935)
+++ src/net/refractions/udig/project/internal/render/impl/ViewportModelImpl.java	(working copy)
@@ -31,6 +31,7 @@
 import net.refractions.udig.project.render.displayAdapter.MapDisplayEvent;
 import net.refractions.udig.ui.ProgressManager;
 
+import org.eclipse.core.runtime.Plugin;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 import org.eclipse.emf.common.util.EList;
@@ -832,14 +833,31 @@
         };
 
         if (Display.getCurrent() != null) {
-            Thread thread = new Thread(handler);
-            thread.setDaemon(true);
-            thread.start();
+        	/* ------------------------------------------------------------
+        	 * ISSUE UDIG-1726: Erroneous behavior
+        	 * ------------------------------------------------------------
+        	 * net.refractions.udig.project.render.Tile listens
+        	 * for notifications and then violated the SWT 
+        	 * multi-threading policy by disposing the
+        	 * SWT image is keeps internally for drawing the 
+        	 * tile on.
+        	 * ------------------------------------------------------------
+             * Thread thread = new Thread(handler);
+             * thread.setDaemon(true);
+             * thread.start();
+        	 * ------------------------------------------------------------
+        	 * ISSUE UDIG-1726: Solution
+        	 * ------------------------------------------------------------
+        	 * Honor the SWT multi-threading policy here 
+        	 * since we have no way of knowing if all notification
+        	 * listeners will honor it (they most likely will not) */
+        	Display.getCurrent().asyncExec(handler);
+        	
         } else {
             handler.run();
         }
     }
-
+    
     private void fireNotification( Envelope oldBounds ) {
         if (eNotificationRequired()) {
             eNotify(new ENotificationImpl(this, Notification.SET,
Index: src/net/refractions/udig/project/render/Tile.java
===================================================================
--- src/net/refractions/udig/project/render/Tile.java	(revision 31935)
+++ src/net/refractions/udig/project/render/Tile.java	(working copy)
@@ -25,6 +25,8 @@
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
 import org.geotools.geometry.jts.ReferencedEnvelope;
 
 
@@ -159,23 +161,78 @@
 	    this.listener = listener;
 	}
 	
+	private Display display;
+	
+    private Display getDisplay() {
+    	if ( display == null ) {
+        	Thread t = Thread.currentThread();
+        	if ( t != null ) {
+        		ThreadGroup g = t.getThreadGroup();
+        		if ( g != null) {
+            		int count = g.activeCount();
+            		if ( count > 0 ) {
+            			Thread[] active = new Thread[count];
+            			g.enumerate(active);
+            			for ( Thread it : active ) {
+            				Display d = Display.findDisplay(it);
+            				if ( d != null ) {
+            					display = d;
+            					break;
+            				}
+            			}
+            		}
+        		}
+        	}    		
+    	}
+    	return display;
+    }
+    
+	
 	/**
 	 * Disposes of the swt image.
 	 */
 	public void disposeSWTImage() {
+		
 		/**
 		 * synchronize this code to ensure we don't have concurrency issues
 		 */
 		synchronized (SWTLock) {
-			if (swtImage != null) {
-				swtImage.dispose();
-				swtImage = null;
-			}
+			
+			/* -----------------------------------------------
+			 * ISSUE UDIG-1726: Solution
+			 * ----------------------------------------------- 
+			 * Ensure that SWT image is disposed on the 
+			 * display thread if it exists. If not, it is 
+			 * very likely that a deadlock would occur due
+			 * to concurrent locking in the SWT OS class 
+			 * by the display thread.
+			 */
+			execute(new Runnable() {
+				
+				@Override
+				public void run() {
+					if (swtImage != null) {
+						swtImage.dispose();
+						swtImage = null;
+					}					
+				}
+			});
+			
 		}
+
 		//can we assume that once the image is disposed it is offscreen?
 		setScreenState(ScreenState.OFFSCREEN);
 	}
 	
+	private void execute(Runnable r) {
+		Display d = getDisplay();
+		if(d!=null) {
+			d.asyncExec(r);
+		} else {
+			r.run();
+		}		
+	}
+	
 	/**
 	 * Disposes of the tile.
 	 */
@@ -189,16 +246,46 @@
 	}
 	
 	/**
-	 * Gets the SWT image; if the image is null or disposed then
-	 * it tried to create it before it is returned.
-	 *
-	 * @return
+	 * Gets the reference to the internal SWT image. </p> 
+	 * If the image is <code>null</code> or disposed then
+	 * it tries to create it before it is returned. </p>
+	 * <b>WARNING</b>: The access to the {@link Image} instance must 
+	 * be synchronized to prevent deadlocks when calling 
+	 * {@link #disposeSWTImage()} and {@link #dispose()} in a 
+	 * multi-threaded environment. Deadlock prevention is 
+	 * ensured by only accessing the instance through 
+	 * this method. If one or more references are stored outside this
+	 * {@link Tile} instance, then access to the {@link Image} instance 
+	 * through these references, and the {@link #disposeSWTImage()} 
+	 * and {@link #dispose()} methods (which access the {@link Image} 
+	 * instance internally), must be all be synchronized to prevent
+	 * deadlocks.</p>
+	 * @return A reference to the internal {@link Image} instance.
 	 */
 	public org.eclipse.swt.graphics.Image getSWTImage() {
-		if (swtImage == null || swtImage.isDisposed()) {
-			createSWTImage();
-		}
-		return swtImage;
+		//synchronized(SWTLock) {
+			
+			/* -----------------------------------------------
+			 * ISSUE UDIG-1726: Solution
+			 * ----------------------------------------------- 
+			 * Ensure that SWT image is disposed on the 
+			 * display thread if it exists. If not, it is 
+			 * very likely that a deadlock would occur due
+			 * to concurrent locking in the SWT OS class 
+			 * by the display thread.
+			 */
+			execute(new Runnable() {
+				
+				@Override
+				public void run() {
+					if (swtImage == null || swtImage.isDisposed()) {
+						createSWTImage();
+					}
+				}
+			});			
+			
+			return swtImage;
+		//}
 	}
 	
 	/**
@@ -234,6 +321,7 @@
 	 * Creates an swt image from the tiles buffered image.
 	 */
 	private void createSWTImage() {
+		
 		/**
 		 * synchronize this code to prevent multiple threads from creating the
 		 * SWT image more times than needed
@@ -251,6 +339,7 @@
 	            ex.printStackTrace();
 	        }
 		}
+		
 	}
 
 	/**
