Index: scribus/pdflib_core.cpp
===================================================================
--- scribus/pdflib_core.cpp	(revision 23071)
+++ scribus/pdflib_core.cpp	(working copy)
@@ -154,7 +154,7 @@
 		{
 			if (gl.glyph >= ScFace::CONTROL_GLYPHS)
 			{
-				current_x += gl.xadvance;
+				current_x += gl.xadvance * gl.scaleH;
 				continue;
 			}
 
@@ -249,7 +249,7 @@
 					}
 				}
 			}
-			current_x += gl.xadvance;
+			current_x += gl.xadvance * gl.scaleH;
 		}
 	}
 
@@ -263,7 +263,7 @@
 		{
 			if (gl.glyph >= ScFace::CONTROL_GLYPHS)
 			{
-				current_x += gl.xadvance;
+				current_x += gl.xadvance * gl.scaleH;
 				continue;
 			}
 
@@ -290,7 +290,7 @@
 
 				m_pathBuffer += "q\n";
 				m_pathBuffer += transformToStr(transform) + " cm\n";
-				m_pathBuffer += FToStr(fontSize()) + " 0 0 " + FToStr(fontSize()) + " " + FToStr(x() + gl.xoffset) + " " + FToStr((y() - fontSize() + gl.yoffset) * -1) + " cm\n";
+				m_pathBuffer += FToStr(fontSize()) + " 0 0 " + FToStr(fontSize()) + " " + FToStr(x() + gl.xoffset + current_x) + " " + FToStr((y() - fontSize() + gl.yoffset) * -1) + " cm\n";
 
 				if (gc.scaleV() != 1.0)
 					m_pathBuffer += "1 0 0 1 0 " + FToStr(((fontSize() - fontSize() * (gc.scaleV())) / fontSize()) * -1) + " cm\n";
@@ -456,7 +456,7 @@
 					}
 				}
 			}
-			current_x += gl.xadvance;
+			current_x += gl.xadvance * gl.scaleH;
 		}
 	}
 
Index: scribus/plugins/export/svgexplugin/svgexplugin.cpp
===================================================================
--- scribus/plugins/export/svgexplugin/svgexplugin.cpp	(revision 23071)
+++ scribus/plugins/export/svgexplugin/svgexplugin.cpp	(working copy)
@@ -1163,7 +1163,7 @@
 		{
 			if (gl.glyph >= ScFace::CONTROL_GLYPHS)
 			{
-				current_x += gl.xadvance;
+				current_x += gl.xadvance * gl.scaleH;
 				continue;
 			}
 
@@ -1178,7 +1178,7 @@
 			glyph.setAttribute("style", fill + stroke);
 			m_elem.appendChild(glyph);
 
-			current_x += gl.xadvance;
+			current_x += gl.xadvance * gl.scaleH;
 		}
 	}
 
@@ -1192,7 +1192,7 @@
 		{
 			if (gl.glyph >= ScFace::CONTROL_GLYPHS)
 			{
-				current_x += gl.xadvance;
+				current_x += gl.xadvance * gl.scaleH;
 				continue;
 			}
 
@@ -1210,7 +1210,7 @@
 			glyph.setAttribute("style", fill + stroke);
 			m_elem.appendChild(glyph);
 
-			current_x += gl.xadvance;
+			current_x += gl.xadvance * gl.scaleH;
 		}
 	}
 
Index: scribus/plugins/export/xpsexport/xpsexplugin.cpp
===================================================================
--- scribus/plugins/export/xpsexport/xpsexplugin.cpp	(revision 23071)
+++ scribus/plugins/export/xpsexport/xpsexplugin.cpp	(working copy)
@@ -838,15 +838,15 @@
 		{
 			if (gl.glyph >= ScFace::CONTROL_GLYPHS)
 			{
-				current_x += gl.xadvance;
+				current_x += gl.xadvance * gl.scaleH;
 				continue;
 			}
 
 			indices += QString("%1,%2,%3,%4;").arg(gl.glyph)
-					.arg(((gl.xadvance + current_x) * m_xps->conversionFactor) / size * 100)
+					.arg(((gl.xadvance * gl.scaleH + current_x) * m_xps->conversionFactor) / size * 100)
 					.arg((-gl.xoffset * m_xps->conversionFactor) / size * 100)
 					.arg((-gl.yoffset * m_xps->conversionFactor) / size * 100);
-			current_x += gl.xadvance;
+			current_x += gl.xadvance * gl.scaleH;
 		}
 		indices.chop(1);
 		glyph.setAttribute("Indices", QString("%1%2").arg(gcMap, indices));
@@ -863,7 +863,7 @@
 		{
 			if (gl.glyph >= ScFace::CONTROL_GLYPHS)
 			{
-				current_x += gl.xadvance;
+				current_x += gl.xadvance * gl.scaleH;
 				continue;
 			}
 
@@ -886,9 +886,9 @@
 				glyph.setAttribute("StrokeThickness", m_xps->FToStr(strokeWidth() * m_xps->conversionFactor));
 				glyph.setAttribute("Stroke", m_xps->SetColor(strokeColor().color, strokeColor().shade, 0));
 				m_group.appendChild(glyph);
-				qDebug() << "StrokeWidth XPS" << strokeWidth();
+				//qDebug() << "StrokeWidth XPS" << strokeWidth();
 			}
-			current_x += gl.xadvance;
+			current_x += gl.xadvance * gl.scaleH;
 		}
 	}
 
@@ -1090,11 +1090,44 @@
 					first = true;
 				}
 				grp2.appendChild(txtGrp.cloneNode(true));
+				continue;
 			}
+
+			if (first)
+			{
+				RenderTransform = txtGrp.attribute("RenderTransform");
+				FontRenderingEmSize = txtGrp.attribute("FontRenderingEmSize");
+				FontUri = txtGrp.attribute("FontUri");
+				Fill = txtGrp.attribute("Fill");
+				OriginX = txtGrp.attribute("OriginX");
+				OriginY = txtGrp.attribute("OriginY");
+				Indices = txtGrp.attribute("Indices");
+				UnicodeString = txtGrp.attribute("UnicodeString");
+				glyph = p_docu.createElement("Glyphs");
+				glyph.setAttribute("RenderTransform", RenderTransform);
+				glyph.setAttribute("BidiLevel", "0");
+				glyph.setAttribute("StyleSimulations", "None");
+				glyph.setAttribute("FontRenderingEmSize", FontRenderingEmSize);
+				glyph.setAttribute("FontUri", FontUri);
+				glyph.setAttribute("Fill", Fill);
+				glyph.setAttribute("OriginX", OriginX);
+				glyph.setAttribute("OriginY", OriginY);
+				glyph.setAttribute("Indices", Indices);
+				glyph.setAttribute("UnicodeString", UnicodeString);
+				grp2.appendChild(glyph);
+				first = false;
+			}
 			else
 			{
-				if (first)
+				if ((RenderTransform == txtGrp.attribute("RenderTransform")) && (FontRenderingEmSize == txtGrp.attribute("FontRenderingEmSize")) && (FontUri == txtGrp.attribute("FontUri")) && (OriginY == txtGrp.attribute("OriginY")) && (Fill == txtGrp.attribute("Fill")))
 				{
+					Indices.append(";" + txtGrp.attribute("Indices"));
+					UnicodeString.append(txtGrp.attribute("UnicodeString"));
+				}
+				else
+				{
+					glyph.setAttribute("Indices", Indices);
+					glyph.setAttribute("UnicodeString", UnicodeString);
 					RenderTransform = txtGrp.attribute("RenderTransform");
 					FontRenderingEmSize = txtGrp.attribute("FontRenderingEmSize");
 					FontUri = txtGrp.attribute("FontUri");
@@ -1117,46 +1150,13 @@
 					grp2.appendChild(glyph);
 					first = false;
 				}
-				else
-				{
-					if ((RenderTransform == txtGrp.attribute("RenderTransform")) && (FontRenderingEmSize == txtGrp.attribute("FontRenderingEmSize")) && (FontUri == txtGrp.attribute("FontUri")) && (OriginY == txtGrp.attribute("OriginY")) && (Fill == txtGrp.attribute("Fill")))
-					{
-						Indices.append(";" + txtGrp.attribute("Indices"));
-						UnicodeString.append(txtGrp.attribute("UnicodeString"));
-					}
-					else
-					{
-						glyph.setAttribute("Indices", Indices);
-						glyph.setAttribute("UnicodeString", UnicodeString);
-						RenderTransform = txtGrp.attribute("RenderTransform");
-						FontRenderingEmSize = txtGrp.attribute("FontRenderingEmSize");
-						FontUri = txtGrp.attribute("FontUri");
-						Fill = txtGrp.attribute("Fill");
-						OriginX = txtGrp.attribute("OriginX");
-						OriginY = txtGrp.attribute("OriginY");
-						Indices = txtGrp.attribute("Indices");
-						UnicodeString = txtGrp.attribute("UnicodeString");
-						glyph = p_docu.createElement("Glyphs");
-						glyph.setAttribute("RenderTransform", RenderTransform);
-						glyph.setAttribute("BidiLevel", "0");
-						glyph.setAttribute("StyleSimulations", "None");
-						glyph.setAttribute("FontRenderingEmSize", FontRenderingEmSize);
-						glyph.setAttribute("FontUri", FontUri);
-						glyph.setAttribute("Fill", Fill);
-						glyph.setAttribute("OriginX", OriginX);
-						glyph.setAttribute("OriginY", OriginY);
-						glyph.setAttribute("Indices", Indices);
-						glyph.setAttribute("UnicodeString", UnicodeString);
-						grp2.appendChild(glyph);
-						first = false;
-					}
-				}
-				if (txtGrp == grp.lastChildElement())
-				{
-					glyph.setAttribute("Indices", Indices);
-					glyph.setAttribute("UnicodeString", UnicodeString);
-				}
 			}
+
+			if (txtGrp == grp.lastChildElement())
+			{
+				glyph.setAttribute("Indices", Indices);
+				glyph.setAttribute("UnicodeString", UnicodeString);
+			}
 		}
 		parentElem.appendChild(grp2);
 	}
Index: scribus/pslib.cpp
===================================================================
--- scribus/pslib.cpp	(revision 23071)
+++ scribus/pslib.cpp	(working copy)
@@ -115,7 +115,7 @@
 	{
 		if (gl.glyph >= ScFace::CONTROL_GLYPHS)
 		{
-			current_x += gl.xadvance;
+			current_x += gl.xadvance * gl.scaleH;
 			continue;
 		}
 
@@ -129,7 +129,7 @@
 		m_ps->PS_showSub(gl.glyph, m_ps->FontSubsetMap[font().scName()], fontSize(), false);
 		m_ps->PS_restore();
 
-		current_x += gl.xadvance;
+		current_x += gl.xadvance * gl.scaleH;
 	}
 	m_ps->PS_restore();
 }
@@ -156,7 +156,7 @@
 	{
 		if (gl.glyph >= ScFace::CONTROL_GLYPHS)
 		{
-			current_x += gl.xadvance;
+			current_x += gl.xadvance * gl.scaleH;
 			continue;
 		}
 
@@ -166,11 +166,17 @@
 		chma.scale((fontSize() * gc.scaleH()) / 10.0, (fontSize() * gc.scaleV()) / 10.0);
 		gly.map(chma);
 		m_ps->PS_translate(gl.xoffset + current_x, -(fontSize() - fontSize() * gc.scaleV()) - gl.yoffset);
-		if (gc.scaleH() != 1.0 || gc.scaleV() != 1.0)
-			m_ps->PS_scale(gc.scaleH(), gc.scaleV());
+
 		if (fill)
+		{
+			m_ps->PS_save();
+			if (gc.scaleH() != 1.0 || gc.scaleV() != 1.0)
+				m_ps->PS_scale(gc.scaleH(), gc.scaleV());
 			m_ps->putColorNoDraw(fillColor().color, fillColor().shade);
-		m_ps->PS_showSub(gl.glyph, m_ps->FontSubsetMap[font().scName()], fontSize(), false);
+			m_ps->PS_showSub(gl.glyph, m_ps->FontSubsetMap[font().scName()], fontSize(), false);
+			m_ps->PS_restore();
+		}
+
 		m_ps->SetColor(strokeColor().color, strokeColor().shade, &h, &s, &v, &k);
 		m_ps->PS_setcmykcolor_stroke(h, s, v, k);
 		m_ps->SetClipPath(gly, true);
@@ -178,7 +184,7 @@
 		m_ps->putColor(strokeColor().color, strokeColor().shade, false);
 		m_ps->PS_restore();
 
-		current_x += gl.xadvance;
+		current_x += gl.xadvance * gl.scaleH;
 	}
 
 	m_ps->PS_restore();
Index: scribus/scpageoutput.cpp
===================================================================
--- scribus/scpageoutput.cpp	(revision 23071)
+++ scribus/scpageoutput.cpp	(working copy)
@@ -1002,7 +1002,7 @@
 			if (outline.size() > 3)
 				m_painter->fillPath();
 			m_painter->restore();
-			m_painter->translate(gl.xadvance, 0.0);
+			m_painter->translate(gl.xadvance * gl.scaleH, 0.0);
 		}
 
 		m_painter->setFillMode(fm);
@@ -1030,9 +1030,11 @@
 			m_painter->translate(gl.xoffset + current_x, -(fontSize() * gc.scaleV()) + gl.yoffset);
 
 			FPointArray outline = font().glyphOutline(gl.glyph);
-			double scaleH = gc.scaleH() * fontSize() / 10.0;
-			double scaleV = gc.scaleV() * fontSize() / 10.0;
-			m_painter->scale(scaleH, scaleV);
+			double scaleH = gl.scaleH * fontSize() / 10.0;
+			double scaleV = gl.scaleV * fontSize() / 10.0;
+			QTransform trans;
+			trans.scale(scaleH, scaleV);
+			outline.map(trans);
 			m_painter->setupPolygon(&outline, true);
 			if (outline.size() > 3)
 			{
@@ -1040,7 +1042,7 @@
 				m_painter->strokePath();
 			}
 			m_painter->restore();
-			current_x += gl.xadvance;
+			current_x += gl.xadvance * gl.scaleH;
 		}
 
 		m_painter->setFillRule(fr);
Index: scribus/text/screenpainter.cpp
===================================================================
--- scribus/text/screenpainter.cpp	(revision 23071)
+++ scribus/text/screenpainter.cpp	(working copy)
@@ -86,7 +86,7 @@
 			cairo_scale(cr, gl.scaleH, gl.scaleV);
 			cairo_glyph_t glyph = { gl.glyph, gl.xoffset + current_x, gl.yoffset };
 			cairo_show_glyphs(cr, &glyph, 1);
-			current_x += gl.xadvance;
+			current_x += gl.xadvance * gl.scaleH;
 		}
 		m_painter->restore();
 		return;
@@ -227,7 +227,7 @@
 			if (outline.size() > 3)
 				m_painter->fillPath();
 			m_painter->restore();
-			m_painter->translate(gl.xadvance, 0.0);
+			m_painter->translate(gl.xadvance * gl.scaleH, 0.0);
 		}
 	}
 	m_painter->setFillRule(fr);
@@ -239,6 +239,7 @@
 {
 	if (fill)
 		drawGlyph(gc);
+
 	m_painter->save();
 	bool fr = m_painter->fillRule();
 	m_painter->setFillRule(false);
@@ -249,6 +250,7 @@
 	{
 		m_painter->save();
 		m_painter->translate(gl.xoffset + current_x, - (fontSize() * gl.scaleV) + gl.yoffset );
+
 		FPointArray outline = font().glyphOutline(gl.glyph);
 		double scaleHv = gl.scaleH * fontSize() / 10.0;
 		double scaleVv = gl.scaleV * fontSize() / 10.0;
@@ -262,12 +264,11 @@
 			m_painter->strokePath();
 		}
 		m_painter->restore();
-		current_x += gl.xadvance;
+		current_x += gl.xadvance * gl.scaleH;
 	}
 
 	m_painter->setFillRule(fr);
 	m_painter->restore();
-
 }
 
 void ScreenPainter::drawLine(QPointF start, QPointF end)
