diff --git a/fop-core/src/main/java/org/apache/fop/fonts/GlyphMapping.java b/fop-core/src/main/java/org/apache/fop/fonts/GlyphMapping.java
index dce045c2ca..f2e106604d 100644
--- a/fop-core/src/main/java/org/apache/fop/fonts/GlyphMapping.java
+++ b/fop-core/src/main/java/org/apache/fop/fonts/GlyphMapping.java
@@ -249,25 +249,32 @@ public class GlyphMapping {
         int offset = 0;
         for (int currentChar : CharUtilities.codepointsIter(ics)) {
 
-            // character width
-            int charWidth = font.getCharWidth(currentChar);
-            wordIPD = wordIPD.plus(charWidth);
-
-            // kerning
-            if (kerning) {
-                int kern = 0;
-                if (offset > 0) {
-                    int previousChar = Character.codePointAt(ics, offset - 1);
-                    kern = font.getKernValue(previousChar, currentChar);
-                } else if (precedingChar != 0) {
-                    kern = font.getKernValue(precedingChar, currentChar);
-                }
-                if (kern != 0) {
-                    addToLetterAdjust(letterSpaceAdjustArray, startIndex + offset, kern);
-                    wordIPD = wordIPD.plus(kern);
+            if (currentChar != CharUtilities.SOFT_HYPHEN) {
+                // character width
+                int charWidth = font.getCharWidth(currentChar);
+                wordIPD = wordIPD.plus(charWidth);
+
+                // kerning
+                if (kerning) {
+                    int kern = 0;
+                    if (offset > 0) {
+                        int previousChar = Character.codePointAt(ics, offset - 1);
+                        for (int j = offset - 2; previousChar == CharUtilities.SOFT_HYPHEN && j >= 0; j--) {
+                            previousChar = Character.codePointAt(ics, j);
+                        }
+                        if (previousChar != CharUtilities.SOFT_HYPHEN) {
+                            kern = font.getKernValue(previousChar, currentChar);
+                        }
+                    } else if (precedingChar != 0) {
+                        kern = font.getKernValue(precedingChar, currentChar);
+                    }
+                    if (kern != 0) {
+                        addToLetterAdjust(letterSpaceAdjustArray, startIndex + offset, kern);
+                        wordIPD = wordIPD.plus(kern);
+                    }
                 }
+                offset++;
             }
-            offset++;
         }
         if (kerning
                 && (breakOpportunityChar != 0)
diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
index 3134ebb179..27a18c682c 100644
--- a/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
+++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
@@ -571,7 +571,10 @@ public class TextLayoutManager extends LeafNodeLayoutManager {
                 addWordLevels(getMappingBidiLevels(wordMapping));
             } else {
                 for (int i = s; i < e; i++) {
-                    wordChars.append(foText.charAt(i));
+                    char currentChar = foText.charAt(i);
+                    if (currentChar != CharUtilities.SOFT_HYPHEN) {
+                        wordChars.append(currentChar);
+                    }
                 }
                 addWordLevels(foText.getBidiLevels(s, e));
             }
