Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 16252)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 16253)
@@ -88,4 +88,5 @@
 import org.openstreetmap.josm.tools.JosmRuntimeException;
 import org.openstreetmap.josm.tools.Logging;
+import org.openstreetmap.josm.tools.RotationAngle;
 import org.openstreetmap.josm.tools.ShapeClipper;
 import org.openstreetmap.josm.tools.Utils;
@@ -620,6 +621,6 @@
         Rectangle2D bounds = text.font.getStringBounds(s, frc);
 
-        double x = Math.round(p.getInViewX()) + bs.xOffset + bounds.getCenterX();
-        double y = Math.round(p.getInViewY()) + bs.yOffset + bounds.getCenterY();
+        double x = p.getInViewX() + bs.xOffset;
+        double y = p.getInViewY() + bs.yOffset;
         /**
          *
@@ -660,5 +661,13 @@
         }
 
-        displayText(n, text, s, bounds, new MapViewPositionAndRotation(mapState.getForView(x, y), 0));
+        final MapViewPoint viewPoint = mapState.getForView(x, y);
+        final AffineTransform at = new AffineTransform();
+        at.setToTranslation(
+                Math.round(viewPoint.getInViewX()),
+                Math.round(viewPoint.getInViewY()));
+        if (!RotationAngle.NO_ROTATION.equals(text.rotationAngle)) {
+            at.rotate(text.rotationAngle.getRotationAngle(n));
+        }
+        displayText(n, text, s, at);
         g.setFont(defaultFont);
     }
@@ -1188,11 +1197,18 @@
         if (Math.abs(center.getRotation()) < .01) {
             // Explicitly no rotation: move to full pixels.
-            at.setToTranslation(Math.round(center.getPoint().getInViewX() - nb.getCenterX()),
+            at.setToTranslation(
+                    Math.round(center.getPoint().getInViewX() - nb.getCenterX()),
                     Math.round(center.getPoint().getInViewY() - nb.getCenterY()));
         } else {
-            at.setToTranslation(center.getPoint().getInViewX(), center.getPoint().getInViewY());
+            at.setToTranslation(
+                    center.getPoint().getInViewX(),
+                    center.getPoint().getInViewY());
             at.rotate(center.getRotation());
             at.translate(-nb.getCenterX(), -nb.getCenterY());
         }
+        displayText(osm, text, name, at);
+    }
+
+    private void displayText(IPrimitive osm, TextLabel text, String name, AffineTransform at) {
         displayText(() -> {
             AffineTransform defaultTransform = g.getTransform();
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/StyleKeys.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/StyleKeys.java	(revision 16252)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/StyleKeys.java	(revision 16253)
@@ -92,4 +92,8 @@
     String ICON_ROTATION = "icon-rotation";
     /**
+     * MapCSS text-rotation property key
+     */
+    String TEXT_ROTATION = "text-rotation";
+    /**
      * MapCSS icon-width property key
      */
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java	(revision 16252)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java	(revision 16253)
@@ -88,12 +88,26 @@
      */
     public static RotationAngle createRotationAngle(Environment env) {
+        return createRotationAngle(env, ICON_ROTATION);
+    }
+
+    /**
+     * Reads the text-rotation property and creates a rotation angle from it.
+     * @param env The environment
+     * @return The angle
+     * @since 16253
+     */
+    public static RotationAngle createTextRotationAngle(Environment env) {
+        return createRotationAngle(env, TEXT_ROTATION);
+    }
+
+    private static RotationAngle createRotationAngle(Environment env, String key) {
         Cascade c = env.mc.getCascade(env.layer);
 
         RotationAngle rotationAngle = RotationAngle.NO_ROTATION;
-        final Float angle = c.get(ICON_ROTATION, null, Float.class, true);
+        final Float angle = c.get(key, null, Float.class, true);
         if (angle != null) {
             rotationAngle = RotationAngle.buildStaticRotation(angle);
         } else {
-            final Keyword rotationKW = c.get(ICON_ROTATION, null, Keyword.class);
+            final Keyword rotationKW = c.get(key, null, Keyword.class);
             if (rotationKW != null) {
                 if ("way".equals(rotationKW.val)) {
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/TextLabel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/TextLabel.java	(revision 16252)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/TextLabel.java	(revision 16253)
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.ColorHelper;
+import org.openstreetmap.josm.tools.RotationAngle;
 
 /**
@@ -40,4 +41,8 @@
     public Font font;
     /**
+     * The rotation angle to be used when rendering
+     */
+    public RotationAngle rotationAngle;
+    /**
      * The color to draw the text in, includes alpha.
      */
@@ -58,12 +63,14 @@
      * If null, no label is rendered.
      * @param font the font to be used. Must not be null.
+     * @param rotationAngle the rotation angle to be used. Must not be null.
      * @param color the color to be used. Must not be null
      * @param haloRadius halo radius
      * @param haloColor halo color
      */
-    protected TextLabel(LabelCompositionStrategy strategy, Font font, Color color, Float haloRadius,
-            Color haloColor) {
+    protected TextLabel(LabelCompositionStrategy strategy, Font font, RotationAngle rotationAngle,
+                        Color color, Float haloRadius, Color haloColor) {
         this.labelCompositionStrategy = strategy;
         this.font = Objects.requireNonNull(font, "font");
+        this.rotationAngle = Objects.requireNonNull(rotationAngle, "rotationAngle");
         this.color = Objects.requireNonNull(color, "color");
         this.haloRadius = haloRadius;
@@ -79,4 +86,5 @@
         this.labelCompositionStrategy = other.labelCompositionStrategy;
         this.font = other.font;
+        this.rotationAngle = other.rotationAngle;
         this.color = other.color;
         this.haloColor = other.haloColor;
@@ -137,4 +145,5 @@
         if (s == null) return null;
         Font font = StyleElement.getFont(c, s);
+        RotationAngle rotationAngle = NodeElement.createTextRotationAngle(env);
 
         Color color = c.get(TEXT_COLOR, defaultTextColor, Color.class);
@@ -153,5 +162,5 @@
         }
 
-        return new TextLabel(strategy, font, color, haloRadius, haloColor);
+        return new TextLabel(strategy, font, rotationAngle, color, haloRadius, haloColor);
     }
 
@@ -199,4 +208,5 @@
         sb.append("labelCompositionStrategy=").append(labelCompositionStrategy)
           .append(" font=").append(font)
+          .append(" rotationAngle=").append(rotationAngle)
           .append(" color=").append(ColorHelper.color2html(color));
         if (haloRadius != null) {
@@ -209,5 +219,5 @@
     @Override
     public int hashCode() {
-        return Objects.hash(labelCompositionStrategy, font, color, haloRadius, haloColor);
+        return Objects.hash(labelCompositionStrategy, font, rotationAngle, color, haloRadius, haloColor);
     }
 
@@ -219,4 +229,5 @@
         return Objects.equals(labelCompositionStrategy, textLabel.labelCompositionStrategy) &&
                 Objects.equals(font, textLabel.font) &&
+                Objects.equals(rotationAngle, textLabel.rotationAngle) &&
                 Objects.equals(color, textLabel.color) &&
                 Objects.equals(haloRadius, textLabel.haloRadius) &&
