Index: src/codegen/fonts/font-file.xsl
===================================================================
--- src/codegen/fonts/font-file.xsl	(revision 544088)
+++ src/codegen/fonts/font-file.xsl	(working copy)
@@ -116,8 +116,8 @@
         return lastChar;
     }
 
-    public int getWidth(int i,int size) {
-        return size * width[i];
+    public int getWidth(int i, int size, float stretch) {
+        return size * width[i] * stretch;
     }
 
     public int[] getWidths() {
Index: src/java/org/apache/fop/area/Trait.java
===================================================================
--- src/java/org/apache/fop/area/Trait.java	(revision 544088)
+++ src/java/org/apache/fop/area/Trait.java	(working copy)
@@ -23,6 +23,7 @@
 import java.io.Serializable;
 
 import org.apache.fop.fo.Constants;
+import org.apache.fop.fonts.FontSize;
 import org.apache.fop.fonts.FontTriplet;
 import org.apache.fop.image.FopImage;
 import org.apache.fop.traits.BorderProps;
@@ -227,7 +228,7 @@
         put(INTERNAL_LINK, new TraitInfo("internal-link", InternalLink.class));
         put(EXTERNAL_LINK, new TraitInfo("external-link", String.class));
         put(FONT,         new TraitInfo("font", FontTriplet.class));
-        put(FONT_SIZE,    new TraitInfo("font-size", Integer.class));
+        put(FONT_SIZE,    new TraitInfo("font-size", FontSize.class));
         put(COLOR, new TraitInfo("color", Color.class));
         put(PROD_ID, new TraitInfo("prod-id", String.class));
         put(BACKGROUND,   new TraitInfo("background", Background.class));
Index: src/java/org/apache/fop/fo/properties/CommonFont.java
===================================================================
--- src/java/org/apache/fop/fo/properties/CommonFont.java	(revision 544088)
+++ src/java/org/apache/fop/fo/properties/CommonFont.java	(working copy)
@@ -165,12 +165,44 @@
             default:
                 style = "normal";
             }
+            
+            float stretch = 1;
+            switch (fontStretch) {
+            case Constants.EN_ULTRA_CONDENSED:
+            	stretch = 0.5f;
+            	break;
+            case Constants.EN_EXTRA_CONDENSED:
+            	stretch = 0.6f;
+            	break;
+            case Constants.EN_CONDENSED:
+            	stretch = 0.7f;
+            	break;
+            case Constants.EN_SEMI_CONDENSED:
+            	stretch = 0.8f;
+            	break;
+            case Constants.EN_NORMAL:
+            	stretch = 1.0f;
+            	break;
+            case Constants.EN_SEMI_EXPANDED:
+            	stretch = 1.2f;
+            	break;
+            case Constants.EN_EXPANDED:
+            	stretch = 1.4f;
+            	break;
+            case Constants.EN_EXTRA_EXPANDED:
+            	stretch = 1.7f;
+            	break;
+            case Constants.EN_ULTRA_EXPANDED:
+            	stretch = 2.0f;
+            	break;
+            }
+            
             // NOTE: this is incomplete. font-size may be specified with
             // various kinds of keywords too
             //int fontVariant = propertyList.get("font-variant").getEnum();
             FontTriplet triplet = fontInfo.fontLookup(getFontFamily(), style,
                                                font_weight);
-            fontState = fontInfo.getFontInstance(triplet, fontSize.getValue(context));
+            fontState = fontInfo.getFontInstance(triplet, fontSize.getValue(context), stretch);
         }
         return fontState;
     }
Index: src/java/org/apache/fop/fonts/Font.java
===================================================================
--- src/java/org/apache/fop/fonts/Font.java	(revision 544088)
+++ src/java/org/apache/fop/fonts/Font.java	(working copy)
@@ -46,7 +46,7 @@
 
     private String fontName;
     private FontTriplet triplet;
-    private int fontSize;
+    private FontSize fontSize;
 
     /**
      * normal or small-caps font
@@ -62,7 +62,7 @@
      * @param met font metrics
      * @param fontSize font size
      */
-    public Font(String key, FontTriplet triplet, FontMetrics met, int fontSize) {
+    public Font(String key, FontTriplet triplet, FontMetrics met, FontSize fontSize) {
         this.fontName = key;
         this.triplet = triplet;
         this.metric = met;
@@ -74,7 +74,7 @@
      * @return the ascender
      */
     public int getAscender() {
-        return metric.getAscender(fontSize) / 1000;
+        return metric.getAscender(fontSize.getSize()) / 1000;
     }
 
     /**
@@ -82,7 +82,7 @@
      * @return the capital height
      */
     public int getCapHeight() {
-        return metric.getCapHeight(fontSize) / 1000;
+        return metric.getCapHeight(fontSize.getSize()) / 1000;
     }
 
     /**
@@ -90,7 +90,7 @@
      * @return the descender
      */
     public int getDescender() {
-        return metric.getDescender(fontSize) / 1000;
+        return metric.getDescender(fontSize.getSize()) / 1000;
     }
 
     /**
@@ -110,7 +110,7 @@
      * Returns the font size
      * @return the font size
      */
-    public int getFontSize() {
+    public FontSize getFontSize() {
         return fontSize;
     }
 
@@ -119,7 +119,7 @@
      * @return the XHeight
      */
     public int getXHeight() {
-        return metric.getXHeight(fontSize) / 1000;
+        return metric.getXHeight(fontSize.getSize()) / 1000;
     }
 
     /** @return true if the font has kerning info */
@@ -163,7 +163,7 @@
      */
     public int getWidth(int charnum) {
         // returns width of given character number in millipoints
-        return (metric.getWidth(charnum, fontSize) / 1000);
+        return (metric.getWidth(charnum, fontSize.getSize(), fontSize.getStretch()) / 1000);
     }
 
     /**
@@ -246,7 +246,7 @@
             if (width <= 0) {
                 // Estimate the width of spaces not represented in
                 // the font
-                int em = getFontSize(); //http://en.wikipedia.org/wiki/Em_(typography)
+                int em = getFontSize().getSize(); //http://en.wikipedia.org/wiki/Em_(typography)
                 int en = em / 2; //http://en.wikipedia.org/wiki/En_(typography)
 
                 if (c == ' ') {
@@ -258,7 +258,7 @@
                 } else if (c == '\u2002') {
                     width = em / 2;
                 } else if (c == '\u2003') {
-                    width = getFontSize();
+                    width = getFontSize().getSize();
                 } else if (c == '\u2004') {
                     width = em / 3;
                 } else if (c == '\u2005') {
Index: src/java/org/apache/fop/fonts/FontInfo.java
===================================================================
--- src/java/org/apache/fop/fonts/FontInfo.java	(revision 544088)
+++ src/java/org/apache/fop/fonts/FontInfo.java	(working copy)
@@ -197,19 +197,38 @@
      * @return the requested Font instance
      */
     public Font getFontInstance(FontTriplet triplet, int fontSize) {
+    	return getFontInstance(triplet, fontSize, 0);
+    }
+    
+    /**
+     * Retrieves a (possibly cached) Font instance based on a FontTriplet and a font size. 
+     * @param triplet the font triplet designating the requested font
+     * @param fontSize the font size
+     * @return the requested Font instance
+     */
+    public Font getFontInstance(FontTriplet triplet, int fontSize, float fontStretch) {
+    	return getFontInstance(triplet, new FontSize(fontSize, fontStretch));
+    }
+    
+    /**
+     * Retrieves a (possibly cached) Font instance based on a FontTriplet and a font size. 
+     * @param triplet the font triplet designating the requested font
+     * @param fontSize the font size
+     * @return the requested Font instance
+     */
+    public Font getFontInstance(FontTriplet triplet, FontSize fontSize) {
         Map sizes = (Map)fontInstanceCache.get(triplet);
         if (sizes == null) {
             sizes = new java.util.HashMap();
             fontInstanceCache.put(triplet, sizes);
         }
-        Integer size = new Integer(fontSize);
-        Font font = (Font)sizes.get(size);
+        Font font = (Font)sizes.get(fontSize);
         if (font == null) {
             String fname = getInternalFontKey(triplet);
             useFont(fname);
             FontMetrics metrics = getMetricsFor(fname);
             font = new Font(fname, triplet, metrics, fontSize);
-            sizes.put(size, font);
+            sizes.put(fontSize, font);
         }
         return font;
     }
Index: src/java/org/apache/fop/fonts/FontMetrics.java
===================================================================
--- src/java/org/apache/fop/fonts/FontMetrics.java	(revision 544088)
+++ src/java/org/apache/fop/fonts/FontMetrics.java	(working copy)
@@ -87,9 +87,10 @@
      * code point i.
      * @param i code point index
      * @param size font size
+     * @param float horizontal scaling
      * @return the width of the character
      */
-    int getWidth(int i, int size);
+    int getWidth(int i, int size, float stretch);
 
     /**
      * Return the array of widths.
Index: src/java/org/apache/fop/fonts/FontSize.java
===================================================================
--- src/java/org/apache/fop/fonts/FontSize.java	(revision 0)
+++ src/java/org/apache/fop/fonts/FontSize.java	(revision 0)
@@ -0,0 +1,64 @@
+package org.apache.fop.fonts;
+
+/**
+ * FontSize contains the size (in points) and the horizontal stretch factor of a font
+ */
+public class FontSize {
+	
+	private int size;
+	private float stretch;
+	
+	/**
+	 * Creates a font size
+	 * @param size
+	 * @param stretch
+	 */
+	public FontSize(int size, float stretch) {
+		this.size = size;
+		this.stretch = stretch;
+	}
+	
+	/**
+	 * @return the font size
+	 */
+	public int getSize() {
+		return size;
+	}
+	
+	/**
+	 * @return the horizontal stretch
+	 */
+	public float getStretch() {
+		return stretch;
+	}
+	
+	/**
+	 * Utility function: scales a horizontal length to the size of the font 
+	 * @param i the length to scale
+	 * @return i * size * stretch, cast to an int
+	 */
+	public int scale(int i) {
+		return (int) (i * size * stretch);
+	}
+	
+	/**
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object that) {
+		return that instanceof FontSize && equals((FontSize) that);
+	}
+	public boolean equals(FontSize that) {
+		return this.size == that.size && this.stretch == that.stretch;
+	}
+	
+	/**
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		int hashCode = 0;
+		hashCode = 31 * hashCode + size;
+		hashCode = 31 * hashCode + Float.floatToIntBits(stretch);
+		return hashCode;
+	}
+
+}
Index: src/java/org/apache/fop/fonts/LazyFont.java
===================================================================
--- src/java/org/apache/fop/fonts/LazyFont.java	(revision 544088)
+++ src/java/org/apache/fop/fonts/LazyFont.java	(working copy)
@@ -233,9 +233,9 @@
     /**
      * @see org.apache.fop.fonts.FontMetrics#getWidth(int, int)
      */
-    public int getWidth(int i, int size) {
+    public int getWidth(int i, int size, float stretch) {
         load(true);
-        return realFont.getWidth(i, size);
+        return realFont.getWidth(i, size, stretch);
     }
 
     /**
Index: src/java/org/apache/fop/fonts/MultiByteFont.java
===================================================================
--- src/java/org/apache/fop/fonts/MultiByteFont.java	(revision 544088)
+++ src/java/org/apache/fop/fonts/MultiByteFont.java	(working copy)
@@ -152,13 +152,12 @@
     /**
      * @see org.apache.fop.fonts.FontMetrics#getWidth(int, int)
      */
-    public int getWidth(int i, int size) {
+    public int getWidth(int i, int size, float stretch) {
         if (isEmbeddable()) {
             Integer idx = (Integer)usedGlyphsIndex.get(new Integer(i));
-            return size * width[idx.intValue()];
-        } else {
-            return size * width[i];
+            i = idx.intValue();
         }
+        return (int)(size * width[i] * stretch);
     }
 
     /**
Index: src/java/org/apache/fop/fonts/SingleByteFont.java
===================================================================
--- src/java/org/apache/fop/fonts/SingleByteFont.java	(revision 544088)
+++ src/java/org/apache/fop/fonts/SingleByteFont.java	(working copy)
@@ -71,8 +71,8 @@
     /**
      * @see org.apache.fop.fonts.FontMetrics#getWidth(int, int)
      */
-    public int getWidth(int i, int size) {
-        return size * width[i];
+    public int getWidth(int i, int size, float stretch) {
+        return (int)(size * width[i] * stretch);
     }
 
     /**
Index: src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java
===================================================================
--- src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java	(revision 544088)
+++ src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java	(working copy)
@@ -112,7 +112,7 @@
 
         // TODO: may need some special handling for fo:character
         alignmentContext = new AlignmentContext(font
-                                    , font.getFontSize()
+                                    , font.getFontSize().getSize()
                                     , fobj.getAlignmentAdjust()
                                     , fobj.getAlignmentBaseline()
                                     , fobj.getBaselineShift()
Index: src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
===================================================================
--- src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java	(revision 544088)
+++ src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java	(working copy)
@@ -608,10 +608,10 @@
                             int kern = 0;
                             if (i > iThisStart) {
                                 char previous = textArray[i - 1];
-                                kern = font.getKernValue(previous, c) * font.getFontSize() / 1000;
+                                kern = font.getFontSize().scale(font.getKernValue(previous, c)) / 1000;
                             } else if (prevAi != null && !prevAi.isSpace && prevAi.iBreakIndex > 0) {
                                 char previous = textArray[prevAi.iBreakIndex - 1];
-                                kern = font.getKernValue(previous, c) * font.getFontSize() / 1000;
+                                kern = font.getFontSize().scale(font.getKernValue(previous, c)) / 1000;
                             }
                             if (kern != 0) {
                                 //log.info("Kerning between " + previous + " and " + c + ": " + kern);
@@ -621,7 +621,7 @@
                         }
                     }
                     if (kerning && breakOpportunity && !isSpace(ch) && lastIndex > 0 && textArray[lastIndex] == CharUtilities.SOFT_HYPHEN) {
-                        int kern = font.getKernValue(textArray[lastIndex - 1], ch) * font.getFontSize() / 1000;
+                        int kern = font.getFontSize().scale(font.getKernValue(textArray[lastIndex - 1], ch)) / 1000;
                         if (kern != 0) {
                             addToLetterAdjust(lastIndex, kern);
                         }
@@ -733,10 +733,10 @@
                     int kern = 0;
                     if (i > iThisStart) {
                         char previous = textArray[i - 1];
-                        kern = font.getKernValue(previous, c) * font.getFontSize() / 1000;
+                        kern = font.getFontSize().scale(font.getKernValue(previous, c)) / 1000;
                     } else if (prevAi != null && !prevAi.isSpace) {
                         char previous = textArray[prevAi.iBreakIndex - 1];
-                        kern = font.getKernValue(previous, c) * font.getFontSize() / 1000;
+                        kern = font.getFontSize().scale(font.getKernValue(previous, c)) / 1000;
                     }
                     if (kern != 0) {
                         //log.info("Kerning between " + previous + " and " + c + ": " + kern);
Index: src/java/org/apache/fop/layoutmgr/TraitSetter.java
===================================================================
--- src/java/org/apache/fop/layoutmgr/TraitSetter.java	(revision 544088)
+++ src/java/org/apache/fop/layoutmgr/TraitSetter.java	(working copy)
@@ -468,7 +468,7 @@
      */
     public static void addFontTraits(Area area, Font font) {
         area.addTrait(Trait.FONT, font.getFontTriplet());
-        area.addTrait(Trait.FONT_SIZE, new Integer(font.getFontSize()));
+        area.addTrait(Trait.FONT_SIZE, font.getFontSize());
     }
     
     /**
Index: src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
===================================================================
--- src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java	(revision 544088)
+++ src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java	(working copy)
@@ -36,6 +36,7 @@
 import org.apache.fop.area.inline.Viewport;
 import org.apache.fop.fo.Constants;
 import org.apache.fop.fonts.FontMetrics;
+import org.apache.fop.fonts.FontSize;
 import org.apache.fop.image.FopImage;
 import org.apache.fop.traits.BorderProps;
 import org.w3c.dom.Document;
Index: src/java/org/apache/fop/render/afp/AFPRenderer.java
===================================================================
--- src/java/org/apache/fop/render/afp/AFPRenderer.java	(revision 544088)
+++ src/java/org/apache/fop/render/afp/AFPRenderer.java	(working copy)
@@ -54,6 +54,7 @@
 import org.apache.fop.fo.extensions.ExtensionAttachment;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontMetrics;
+import org.apache.fop.fonts.FontSize;
 import org.apache.fop.fonts.FontTriplet;
 import org.apache.fop.fonts.base14.Courier;
 import org.apache.fop.fonts.base14.Helvetica;
@@ -181,6 +182,11 @@
     private int _currentFontSize = 0;
 
     /**
+     * The current font stretch
+     */
+    private float _currentFontStretch = 1;
+
+    /**
      * The Options to be set on the AFPRenderer
      */
     private Map _afpOptions = null;
@@ -1121,12 +1127,12 @@
         renderInlineAreaBackAndBorders(text);
 
         String name = getInternalFontNameForArea(text);
-        _currentFontSize = ((Integer) text.getTrait(Trait.FONT_SIZE)).intValue();
+        _currentFontSize = ((FontSize) text.getTrait(Trait.FONT_SIZE)).getSize();
         AFPFont tf = (AFPFont) fontInfo.getFonts().get(name);
 
         Color col = (Color) text.getTrait(Trait.COLOR);
 
-        int vsci = mpts2units(tf.getWidth(' ', _currentFontSize) / 1000
+        int vsci = mpts2units(tf.getWidth(' ', _currentFontSize, _currentFontStretch) / 1000
                                 + text.getTextWordSpaceAdjust()
                                 + text.getTextLetterSpaceAdjust());
 
@@ -1199,7 +1205,7 @@
      */
     public void renderWord(WordArea word) {
         String name = getInternalFontNameForArea(word.getParentArea());
-        int size = ((Integer) word.getParentArea().getTrait(Trait.FONT_SIZE)).intValue();
+        FontSize size = (FontSize) word.getParentArea().getTrait(Trait.FONT_SIZE);
         AFPFont tf = (AFPFont) fontInfo.getFonts().get(name);
 
         String s = word.getWord();
@@ -1214,7 +1220,7 @@
      */
     public void renderSpace(SpaceArea space) {
         String name = getInternalFontNameForArea(space.getParentArea());
-        int size = ((Integer) space.getParentArea().getTrait(Trait.FONT_SIZE)).intValue();
+        FontSize size = (FontSize) space.getParentArea().getTrait(Trait.FONT_SIZE);
         AFPFont tf = (AFPFont) fontInfo.getFonts().get(name);
 
         String s = space.getSpace();
Index: src/java/org/apache/fop/render/afp/fonts/FopCharacterSet.java
===================================================================
--- src/java/org/apache/fop/render/afp/fonts/FopCharacterSet.java	(revision 544088)
+++ src/java/org/apache/fop/render/afp/fonts/FopCharacterSet.java	(working copy)
@@ -125,7 +125,7 @@
      * @return the width of the character
      */
     public int width(int character) {
-        return _characterSet.getWidth(character, _size);
+        return _characterSet.getWidth(character, _size, 1);
     }
 
     /**
Index: src/java/org/apache/fop/render/afp/fonts/OutlineFont.java
===================================================================
--- src/java/org/apache/fop/render/afp/fonts/OutlineFont.java	(revision 544088)
+++ src/java/org/apache/fop/render/afp/fonts/OutlineFont.java	(working copy)
@@ -138,9 +138,9 @@
     /**
      * Obtain the width of the character for the specified point size.
      */
-    public int getWidth(int character, int size) {
+    public int getWidth(int character, int size, float stretch) {
 
-        return _characterSet.width(character) / 1000 * size;
+        return (int) (_characterSet.width(character) / 1000 * size * stretch);
 
     }
 
Index: src/java/org/apache/fop/render/afp/fonts/RasterFont.java
===================================================================
--- src/java/org/apache/fop/render/afp/fonts/RasterFont.java	(revision 544088)
+++ src/java/org/apache/fop/render/afp/fonts/RasterFont.java	(working copy)
@@ -192,9 +192,9 @@
     /**
      * Obtain the width of the character for the specified point size.
      */
-    public int getWidth(int character, int size) {
+    public int getWidth(int character, int size, float stretch) {
 
-        return getCharacterSet(size).width(character);
+        return (int) (getCharacterSet(size).width(character) * stretch);
 
     }
 
Index: src/java/org/apache/fop/render/java2d/FontMetricsMapper.java
===================================================================
--- src/java/org/apache/fop/render/java2d/FontMetricsMapper.java	(revision 544088)
+++ src/java/org/apache/fop/render/java2d/FontMetricsMapper.java	(working copy)
@@ -124,8 +124,8 @@
     /**
      * @see org.apache.fop.fonts.FontMetrics#getWidth(int, int)
      */
-    public int getWidth(int i, int size) {
-        return metric.width(i, family, style, size);
+    public int getWidth(int i, int size, float stretch) {
+        return metric.width(i, family, style, size, stretch);
     }
 
 
Index: src/java/org/apache/fop/render/java2d/Java2DFontMetrics.java
===================================================================
--- src/java/org/apache/fop/render/java2d/Java2DFontMetrics.java	(revision 544088)
+++ src/java/org/apache/fop/render/java2d/Java2DFontMetrics.java	(working copy)
@@ -218,10 +218,10 @@
      * @param size font size
      * @return character width in millipoints
      */
-    public int width(int i, String family, int style, int size) {
+    public int width(int i, String family, int style, int size, float stretch) {
         int w;
         setFont(family, style, size);
-        w = internalCharWidth(i) * 1000;
+        w = (int)(internalCharWidth(i) * 1000 * stretch);
         return w;
     }
 
Index: src/java/org/apache/fop/render/java2d/Java2DRenderer.java
===================================================================
--- src/java/org/apache/fop/render/java2d/Java2DRenderer.java	(revision 544088)
+++ src/java/org/apache/fop/render/java2d/Java2DRenderer.java	(working copy)
@@ -68,6 +68,7 @@
 import org.apache.fop.fo.Constants;
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.FontInfo;
+import org.apache.fop.fonts.FontSize;
 import org.apache.fop.fonts.Typeface;
 import org.apache.fop.image.FopImage;
 import org.apache.fop.image.ImageFactory;
@@ -699,7 +700,7 @@
         int saveIP = currentIPPosition;
 
         Font font = getFontFromArea(text);
-        state.updateFont(font.getFontName(), font.getFontSize());
+        state.updateFont(font.getFontName(), font.getFontSize().getSize());
         saveGraphicsState();
         AffineTransform at = new AffineTransform();
         at.translate(rx / 1000f, bl / 1000f);
@@ -712,7 +713,7 @@
 
         // rendering text decorations
         Typeface tf = (Typeface) fontInfo.getFonts().get(font.getFontName());
-        int fontsize = text.getTraitAsInteger(Trait.FONT_SIZE);
+        int fontsize = ((FontSize)text.getTrait(Trait.FONT_SIZE)).getSize();
         renderTextDecoration(tf, fontsize, text, bl, rx);
     }
 
Index: src/java/org/apache/fop/render/pcl/PCLRenderer.java
===================================================================
--- src/java/org/apache/fop/render/pcl/PCLRenderer.java	(revision 544088)
+++ src/java/org/apache/fop/render/pcl/PCLRenderer.java	(working copy)
@@ -75,6 +75,7 @@
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontMetrics;
+import org.apache.fop.fonts.FontSize;
 import org.apache.fop.image.EPSImage;
 import org.apache.fop.image.FopImage;
 import org.apache.fop.image.ImageFactory;
@@ -550,7 +551,7 @@
         renderInlineAreaBackAndBorders(text);
         
         String fontname = getInternalFontNameForArea(text);
-        final int fontsize = text.getTraitAsInteger(Trait.FONT_SIZE);
+        final int fontsize = ((FontSize)text.getTrait(Trait.FONT_SIZE)).getSize();
 
         //Determine position
         int saveIP = currentIPPosition;
@@ -589,10 +590,10 @@
                 final int baseline = text.getBaselineOffset();
                 
                 //for cursive fonts, so the text isn't clipped
-                int extraWidth = font.getFontSize() / 3;
+                int extraWidth = font.getFontSize().getSize() / 3;
                 final FontMetricsMapper mapper = (FontMetricsMapper)fontInfo.getMetricsFor(
                         font.getFontName());
-                int maxAscent = mapper.getMaxAscent(font.getFontSize()) / 1000;
+                int maxAscent = mapper.getMaxAscent(font.getFontSize().getSize()) / 1000;
                 final int additionalBPD = maxAscent - baseline;
                 
                 Graphics2DAdapter g2a = getGraphics2DAdapter();
@@ -609,7 +610,7 @@
                 Graphics2DImagePainter painter = new Graphics2DImagePainter() {
 
                     public void paint(Graphics2D g2d, Rectangle2D area) {
-                        g2d.setFont(mapper.getFont(font.getFontSize()));
+                        g2d.setFont(mapper.getFont(font.getFontSize().getSize()));
                         g2d.translate(0, baseline + additionalBPD);
                         g2d.scale(1000, 1000);
                         g2d.setColor(col);
Index: src/java/org/apache/fop/render/pdf/PDFRenderer.java
===================================================================
--- src/java/org/apache/fop/render/pdf/PDFRenderer.java	(revision 544088)
+++ src/java/org/apache/fop/render/pdf/PDFRenderer.java	(working copy)
@@ -65,6 +65,7 @@
 import org.apache.fop.area.inline.InlineParent;
 import org.apache.fop.area.inline.WordArea;
 import org.apache.fop.area.inline.SpaceArea;
+import org.apache.fop.fonts.FontSize;
 import org.apache.fop.fonts.Typeface;
 import org.apache.fop.fonts.Font;
 import org.apache.fop.image.FopImage;
@@ -245,6 +246,8 @@
     protected String currentFontName = "";
     /** Size of currently selected font */
     protected int currentFontSize = 0;
+    /** Stretch of currently selected font */
+    protected float currentFontStretch = 1;
     /** page height */
     protected int pageHeight;
 
@@ -1403,13 +1406,13 @@
         StringBuffer pdf = new StringBuffer();
 
         String fontName = getInternalFontNameForArea(text);
-        int size = ((Integer) text.getTrait(Trait.FONT_SIZE)).intValue();
+        FontSize size = (FontSize) text.getTrait(Trait.FONT_SIZE);
         
         // This assumes that *all* CIDFonts use a /ToUnicode mapping
         Typeface tf = (Typeface) fontInfo.getFonts().get(fontName);
         boolean useMultiByte = tf.isMultiByte();
         
-        updateFont(fontName, size, pdf);
+        updateFont(fontName, size.getSize(), size.getStretch(), pdf);
         Color ct = (Color) text.getTrait(Trait.COLOR);
         updateColor(ct, true, pdf);
 
@@ -1430,7 +1433,7 @@
 
         currentStream.add("] TJ\n");
         
-        renderTextDecoration(tf, size, text, bl, rx);
+        renderTextDecoration(tf, size.getSize(), text, bl, rx);
     }
     
     /**
@@ -1472,7 +1475,7 @@
                          - 2 * textArea.getTextLetterSpaceAdjust();
 
             if (tws != 0) {
-                pdf.append(format(tws / (font.getFontSize() / 1000f)));
+                pdf.append(format(tws / (font.getFontSize().getSize() / 1000f)));
                 pdf.append(" ");
             }
         }
@@ -1509,7 +1512,7 @@
 
         int l = s.length();
 
-        float fontSize = fs.getFontSize() / 1000f;
+        float fontSize = fs.getFontSize().getSize() / 1000f;
         boolean startPending = true;
         for (int i = 0; i < l; i++) {
             char orgChar = s.charAt(i);
@@ -1631,16 +1634,22 @@
         updateColor(col, fill, null);
     }
     
-    private void updateFont(String name, int size, StringBuffer pdf) {
-        if ((!name.equals(this.currentFontName))
-                || (size != this.currentFontSize)) {
-            closeText();
-
+    private void updateFont(String name, int size, float stretch, StringBuffer pdf) {
+    	boolean tf = (!name.equals(this.currentFontName)) || (size != this.currentFontSize);
+    	boolean tz = stretch != this.currentFontStretch;
+        if (tf) {
+    		closeText();
             this.currentFontName = name;
             this.currentFontSize = size;
             pdf = pdf.append("/" + name + " " + format((float) size / 1000f)
                               + " Tf\n");
+        	this.currentFontStretch = stretch;
+        	pdf = pdf.append(format(stretch * 100) + " Tz\n");
         }
+        else if (tz) {
+        	this.currentFontStretch = stretch;
+        	pdf = pdf.append(format(stretch * 100) + " Tz\n");
+        }
     }
 
     /**
Index: src/java/org/apache/fop/render/PrintRenderer.java
===================================================================
--- src/java/org/apache/fop/render/PrintRenderer.java	(revision 544088)
+++ src/java/org/apache/fop/render/PrintRenderer.java	(working copy)
@@ -26,6 +26,7 @@
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontResolver;
 import org.apache.fop.fonts.FontSetup;
+import org.apache.fop.fonts.FontSize;
 import org.apache.fop.fonts.FontTriplet;
 import org.w3c.dom.Document;
 
@@ -94,7 +95,7 @@
      */
     protected Font getFontFromArea(Area area) {
         FontTriplet triplet = (FontTriplet)area.getTrait(Trait.FONT);
-        int size = ((Integer)area.getTrait(Trait.FONT_SIZE)).intValue();
+        FontSize size = (FontSize)area.getTrait(Trait.FONT_SIZE);
         return fontInfo.getFontInstance(triplet, size);
     }
     
Index: src/java/org/apache/fop/render/ps/NativeTextHandler.java
===================================================================
--- src/java/org/apache/fop/render/ps/NativeTextHandler.java	(revision 544088)
+++ src/java/org/apache/fop/render/ps/NativeTextHandler.java	(working copy)
@@ -170,12 +170,12 @@
 
     private void establishCurrentFont() throws IOException {
         if ((currentFontName != this.font.getFontName()) 
-                || (currentFontSize != this.font.getFontSize())) {
+                || (currentFontSize != this.font.getFontSize().getSize())) {
             PSGenerator gen = getPSGenerator();
             gen.writeln(this.font.getFontName() + " " 
-                    + gen.formatDouble(font.getFontSize() / 1000f) + " F");
+                    + gen.formatDouble(font.getFontSize().getSize() / 1000f) + " F");
             currentFontName = this.font.getFontName();
-            currentFontSize = this.font.getFontSize();
+            currentFontSize = this.font.getFontSize().getSize();
         }
     }
 
Index: src/java/org/apache/fop/render/ps/PSRenderer.java
===================================================================
--- src/java/org/apache/fop/render/ps/PSRenderer.java	(revision 544088)
+++ src/java/org/apache/fop/render/ps/PSRenderer.java	(working copy)
@@ -59,6 +59,7 @@
 import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.extensions.ExtensionAttachment;
 import org.apache.fop.fonts.Font;
+import org.apache.fop.fonts.FontSize;
 import org.apache.fop.fonts.LazyFont;
 import org.apache.fop.fonts.Typeface;
 import org.apache.fop.image.EPSImage;
@@ -993,7 +994,7 @@
     public void renderText(TextArea area) {
         renderInlineAreaBackAndBorders(area);
         String fontname = getInternalFontNameForArea(area);
-        int fontsize = area.getTraitAsInteger(Trait.FONT_SIZE);
+        int fontsize = ((FontSize) area.getTrait(Trait.FONT_SIZE)).getSize();
 
         // This assumes that *all* CIDFonts use a /ToUnicode mapping
         Typeface tf = (Typeface) fontInfo.getFonts().get(fontname);
@@ -1078,7 +1079,7 @@
                 } else {
                     wordSpace = 0;
                 }
-                int cw = tf.getWidth(mapped, font.getFontSize()) / 1000;
+                int cw = tf.getWidth(mapped, font.getFontSize().getSize(), font.getFontSize().getStretch()) / 1000;
                 int ladj = (letterAdjust != null && i < textLen - 1 ? letterAdjust[i + 1] : 0);
                 int tls = (i < textLen - 1 ? area.getTextLetterSpaceAdjust() : 0); 
                 offsets[i] = cw + ladj + tls + wordSpace;
Index: src/java/org/apache/fop/render/ps/PSTextPainter.java
===================================================================
--- src/java/org/apache/fop/render/ps/PSTextPainter.java	(revision 544088)
+++ src/java/org/apache/fop/render/ps/PSTextPainter.java	(working copy)
@@ -418,7 +418,7 @@
             fStyle |= java.awt.Font.ITALIC;
         }
         return new java.awt.Font(font.getFontName(), fStyle,
-                             (int)(font.getFontSize() / 1000));
+                             (int)(font.getFontSize().getSize() / 1000));
     }
 
     private float getStringWidth(String str, Font font) {
Index: src/java/org/apache/fop/svg/PDFDocumentGraphics2D.java
===================================================================
--- src/java/org/apache/fop/svg/PDFDocumentGraphics2D.java	(revision 544088)
+++ src/java/org/apache/fop/svg/PDFDocumentGraphics2D.java	(working copy)
@@ -311,6 +311,7 @@
 
         currentFontName = "";
         currentFontSize = 0;
+        currentFontStretch = 1;
 
         if (currentStream == null) {
             currentStream = new StringWriter();
Index: src/java/org/apache/fop/svg/PDFGraphics2D.java
===================================================================
--- src/java/org/apache/fop/svg/PDFGraphics2D.java	(revision 544088)
+++ src/java/org/apache/fop/svg/PDFGraphics2D.java	(working copy)
@@ -168,6 +168,11 @@
     protected float currentFontSize;
 
     /**
+     * the current font stretch in %
+     */
+    protected float currentFontStretch;
+
+    /**
      * The output stream for the pdf document.
      * If this is set then it can progressively output
      * the pdf document objects to reduce memory.
@@ -1439,8 +1444,10 @@
         }
         String name;
         float size;
+        float stretch;
         name = fontState.getFontName();
-        size = (float)fontState.getFontSize() / 1000f;
+        size = (float)fontState.getFontSize().getSize() / 1000f;
+        stretch = fontState.getFontSize().getStretch();
 
         if ((!name.equals(this.currentFontName))
                 || (size != this.currentFontSize)) {
@@ -1449,6 +1456,11 @@
             currentStream.write("/" + name + " " + size + " Tf\n");
 
         }
+        
+        if (stretch != this.currentFontStretch) {
+        	this.currentFontStretch = stretch;
+        	currentStream.write("" + stretch + " Tz\n");
+        }
 
         currentStream.write("q\n");
 
@@ -1637,7 +1649,8 @@
             //Map attr = iterator.getAttributes();
 
             String name = fontState.getFontName();
-            int size = fontState.getFontSize();
+            int size = fontState.getFontSize().getSize();
+            float stretch = fontState.getFontSize().getStretch();
             if ((!name.equals(this.currentFontName))
                     || (size != this.currentFontSize)) {
                 this.currentFontName = name;
@@ -1646,6 +1659,10 @@
                                     + " Tf\n");
 
             }
+            if (stretch != this.currentFontStretch) {
+            	this.currentFontStretch = stretch;
+            	currentStream.write("" + stretch + " Tz\n");
+            }
 
             currentStream.write(PDFNumber.doubleOut(vals[0], DEC) + " "
                                 + PDFNumber.doubleOut(vals[1], DEC) + " "
Index: src/java/org/apache/fop/svg/PDFTextPainter.java
===================================================================
--- src/java/org/apache/fop/svg/PDFTextPainter.java	(revision 544088)
+++ src/java/org/apache/fop/svg/PDFTextPainter.java	(working copy)
@@ -210,7 +210,7 @@
             }
         }
         java.awt.Font font = new java.awt.Font(fontFamily, fStyle,
-                             (int)(fontState.getFontSize() / 1000));
+                             (int)(fontState.getFontSize().getSize() / 1000));
 
         g2d.setFont(font);
 
