diff --git a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/Font.java b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/Font.java
index 583b764..6d52440 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/Font.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/Font.java
@@ -274,47 +274,17 @@
 	int fontListEntry;
 	int[] fontStructPtr = new int[1];
 	int[] fontNamePtr = new int[1];
-	String[] xlfds = new String[0];
-	/* Go through each entry in the font list */
-	while ((fontListEntry = OS.XmFontListNextEntry(context)) != 0) {
-		int fontPtr = OS.XmFontListEntryGetFont(fontListEntry, buffer);
-		if (buffer[0] == OS.XmFONT_IS_FONT) { 
-			/* FontList contains a single font */
-			OS.memmove(fontStruct,fontPtr,20 * 4);
-			int propPtr = fontStruct.properties;
-			for (int i = 0; i < fontStruct.n_properties; i++) {
-				/* Reef through properties looking for XAFONT */
-				int[] prop = new int[2];
-				OS.memmove(prop, propPtr, 8);
-				if (prop[0] == OS.XA_FONT) {
-					/* Found it, prop[1] points to the string */
-					int ptr = OS.XmGetAtomName(xDisplay, prop[1]);
-					int length = OS.strlen(ptr);
-					byte[] nameBuf = new byte[length];
-					OS.memmove(nameBuf, ptr, length);
-					/* Use the character encoding for the default locale */
-					String xlfd = new String(Converter.mbcsToWcs(null, nameBuf)).toLowerCase();
-					/* Add the xlfd to the array */
-					String[] newXlfds = new String[xlfds.length + 1];
-					System.arraycopy(xlfds, 0, newXlfds, 0, xlfds.length);
-					newXlfds[newXlfds.length - 1] = xlfd;
-					xlfds = newXlfds;
-					OS.XtFree(ptr);
-					break;
-				}
-				propPtr += 8;
-			}
-		}
-		else { 
-			/* FontList contains a fontSet */
-			int nFonts = OS.XFontsOfFontSet(fontPtr,fontStructPtr,fontNamePtr);
-			int [] fontStructs = new int[nFonts];
-			OS.memmove(fontStructs,fontStructPtr[0],nFonts * 4);
-			for (int i = 0; i < nFonts; i++) { // Go through each fontStruct in the font set.
-				OS.memmove(fontStruct,fontStructs[i],20 * 4);
+	FontData[] data = new FontData[0];
+	try {
+		/* Go through each entry in the font list */
+		while ((fontListEntry = OS.XmFontListNextEntry(context)) != 0) {
+			int fontPtr = OS.XmFontListEntryGetFont(fontListEntry, buffer);
+			if (buffer[0] == OS.XmFONT_IS_FONT) { 
+				/* FontList contains a single font */
+				OS.memmove(fontStruct,fontPtr,20 * 4);
 				int propPtr = fontStruct.properties;
-				for (int j = 0; j < fontStruct.n_properties; j++) {
-					// Reef through properties looking for XAFONT
+				for (int i = 0; i < fontStruct.n_properties; i++) {
+					/* Look through properties for XAFONT */
 					int[] prop = new int[2];
 					OS.memmove(prop, propPtr, 8);
 					if (prop[0] == OS.XA_FONT) {
@@ -323,28 +293,71 @@
 						int length = OS.strlen(ptr);
 						byte[] nameBuf = new byte[length];
 						OS.memmove(nameBuf, ptr, length);
+						OS.XtFree(ptr);
+						/* Use the character encoding for the default locale */
 						String xlfd = new String(Converter.mbcsToWcs(null, nameBuf)).toLowerCase();
 						/* Add the xlfd to the array */
-						String[] newXlfds = new String[xlfds.length + 1];
-						System.arraycopy(xlfds, 0, newXlfds, 0, xlfds.length);
-						newXlfds[newXlfds.length - 1] = xlfd;
-						xlfds = newXlfds;
-						OS.XFree(ptr);
+						FontData[] newData = new FontData[data.length + 1];
+						System.arraycopy(data, 0, newData, 0, data.length);
+						newData[newData.length - 1] = FontData.motif_new(xlfd);
+						data = newData;
 						break;
 					}
 					propPtr += 8;
 				}
 			}
+			else { 
+				/* FontList contains a fontSet */
+				int nFonts = OS.XFontsOfFontSet(fontPtr,fontStructPtr,fontNamePtr);
+				int [] fontStructs = new int[nFonts];
+				OS.memmove(fontStructs,fontStructPtr[0],nFonts * 4);
+				for (int i = 0; i < nFonts; i++) { // Go through each fontStruct in the font set.
+					OS.memmove(fontStruct,fontStructs[i],20 * 4);
+					int propPtr = fontStruct.properties;
+					for (int j = 0; j < fontStruct.n_properties; j++) {
+						// Look through properties for XAFONT
+						int[] prop = new int[2];
+						OS.memmove(prop, propPtr, 8);
+						if (prop[0] == OS.XA_FONT) {
+							/* Found it, prop[1] points to the string */
+							int ptr = OS.XmGetAtomName(xDisplay, prop[1]);
+							int length = OS.strlen(ptr);
+							byte[] nameBuf = new byte[length];
+							OS.memmove(nameBuf, ptr, length);
+							OS.XFree(ptr);
+							String xlfd = new String(Converter.mbcsToWcs(null, nameBuf)).toLowerCase();
+							/* Add the xlfd to the array */
+							FontData[] newData = new FontData[data.length + 1];
+							System.arraycopy(data, 0, newData, 0, data.length);
+							try {
+								newData[newData.length - 1] = FontData.motif_new(xlfd);
+							} catch (Exception e) {
+								/*
+								 * Some font servers, for example, xfstt, do not pass
+								 * reasonable font properties to the client, so we
+								 * cannot construct a FontData for these. Use the font
+								 * name instead and return null if that fails.
+								 */
+								int[] fontName = new int[1];
+								OS.memmove(fontName, fontNamePtr [0] + (i * 4), 4);
+								ptr = fontName[0];
+								if (ptr != 0) {
+									length = OS.strlen(ptr);
+									nameBuf = new byte[length];
+									OS.memmove(nameBuf, ptr, length);
+									xlfd = new String(Converter.mbcsToWcs(null, nameBuf)).toLowerCase();
+									newData[newData.length - 1] = FontData.motif_new(xlfd);
+								}
+							}
+							data = newData;
+							break;
+						}
+						propPtr += 8;
+					}
+				}
+			}
 		}
-	}
-	OS.XmFontListFreeFontContext(context);
-	if (xlfds.length == 0) return null;
-	FontData[] fontData = new FontData[xlfds.length];
-	/* Construct each fontData out of the xlfd */
-	try {
-		for (int i = 0; i < xlfds.length; i++) {
-			fontData[i] = FontData.motif_new(xlfds[i]);
-		}
+		if (data.length == 0) return null;
 	} catch (Exception e) {
 		/*
 		 * Some font servers, for example, xfstt, do not pass
@@ -352,8 +365,10 @@
 		 * cannot construct a FontData for these. Return null.
 		 */
 		return null;
+	} finally {
+		OS.XmFontListFreeFontContext(context);
 	}
-	return fontData;
+	return data;
 }
 
 /**
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/GC.java b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/GC.java
index 028e1b6..c21fdc3 100755
--- a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/GC.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/graphics/GC.java
@@ -1843,24 +1843,23 @@
 			/* Calculate average character width */
 			int propPtr = fontStruct.properties;
 			for (int i = 0; i < fontStruct.n_properties; i++) {
-				/* Reef through properties looking for XAFONT */
+				/* Look through properties for XAFONT */
 				int[] prop = new int[2];
 				OS.memmove(prop, propPtr, 8);
 				if (prop[0] == OS.XA_FONT) {
 					/* Found it, prop[1] points to the string */
-					StringBuffer stringBuffer = new StringBuffer();
 					int ptr = OS.XmGetAtomName(xDisplay, prop[1]);
-					int strPtr = ptr;
-					byte[] c = new byte[1];
-					OS.memmove(c, strPtr, 1);
-					while (c[0] != 0) {
-						stringBuffer.append((char)c[0]);
-						strPtr++;
-						OS.memmove(c, strPtr, 1);
+					int length = OS.strlen(ptr);
+					byte[] nameBuf = new byte[length];
+					OS.memmove(nameBuf, ptr, length);
+					OS.XFree(ptr);
+					String xlfd = new String(Converter.mbcsToWcs(null, nameBuf)).toLowerCase();
+					int avg = 0;
+					try {
+						avg = FontData.motif_new(xlfd).averageWidth / 10;
+					} catch (Exception e) {
+						// leave avg unchanged so that it will be computed below
 					}
-					String xlfd = stringBuffer.toString().toLowerCase();
-					int avg = FontData.motif_new(xlfd).averageWidth / 10;
-					OS.XtFree(ptr);
 					if (avg == 0) {
 						/*
 						 * Not all fonts have average character width encoded
@@ -1916,24 +1915,42 @@
 				/* Calculate average character width */
 				int propPtr = fontStruct.properties;
 				for (int j = 0; j < fontStruct.n_properties; j++) {
-					/* Reef through properties looking for XAFONT */
+					/* Look through properties for XAFONT */
 					int[] prop = new int[2];
 					OS.memmove(prop, propPtr, 8);
 					if (prop[0] == OS.XA_FONT) {
 						/* Found it, prop[1] points to the string */
-						StringBuffer stringBuffer = new StringBuffer();
 						int ptr = OS.XmGetAtomName(xDisplay, prop[1]);
-						int strPtr = ptr;
-						byte[] c = new byte[1];
-						OS.memmove(c, strPtr, 1);
-						while (c[0] != 0) {
-							stringBuffer.append((char)c[0]);
-							strPtr++;
-							OS.memmove(c, strPtr, 1);
-						}
-						String xlfd = stringBuffer.toString().toLowerCase();
-						int avg = FontData.motif_new(xlfd).averageWidth / 10;
+						int length = OS.strlen(ptr);
+						byte[] nameBuf = new byte[length];
+						OS.memmove(nameBuf, ptr, length);
 						OS.XFree(ptr);
+						String xlfd = new String(Converter.mbcsToWcs(null, nameBuf)).toLowerCase();
+						int avg = 0;
+						try {
+							avg = FontData.motif_new(xlfd).averageWidth / 10;
+						} catch (Exception e) {
+							/*
+							 * Some font servers, for example, xfstt, do not pass
+							 * reasonable font properties to the client, so we
+							 * cannot construct a FontData for these. Use the font
+							 * name instead.
+							 */
+							int[] fontName = new int[1];
+							OS.memmove(fontName, fontNamePtr [0] + (i * 4), 4);
+							ptr = fontName[0];
+							if (ptr != 0 ) {
+								length = OS.strlen(ptr);
+								nameBuf = new byte[length];
+								OS.memmove(nameBuf, ptr, length);
+								xlfd = new String(Converter.mbcsToWcs(null, nameBuf)).toLowerCase();
+								try {
+									avg = FontData.motif_new(xlfd).averageWidth / 10;
+								} catch (Exception ex) {
+									// leave avg unchanged (0) so that it will be computed below
+								}
+							}
+						}
 						if (avg == 0) {
 							/*
 							 * Not all fonts have average character width encoded
