diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GPar.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GPar.java
index 6f69df073cbb3035caf1effbb0d77ef62ec23009..04932a5a8ba4ec01e6699608507e05d231975017 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GPar.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GPar.java
@@ -64,7 +64,8 @@ public final class GPar {
     private static final int GP_LINEJOIN = 12;
     private static final int GP_LINEMITRE = 13;
     private static final int GP_LEX = 14;
-    private static final int GP_FONTFACE = 15;
+
+    // Note: there is last slot "fontface" which is either unused at all, or only used in R code
     private static final int GP_LENGTH = 16;
     private static final String[] NAMES = new String[]{
                     "fill",
@@ -82,7 +83,7 @@ public final class GPar {
                     "linejoin",
                     "linemitre",
                     "lex",
-                    "fontface"  // TODO: could not find this name in grid sources
+                    "fontface"
     };
     private static final RStringVector NAMES_VECTOR = (RStringVector) RDataFactory.createStringVector(NAMES, RDataFactory.COMPLETE_VECTOR).makeSharedPermanent();
 
@@ -169,6 +170,16 @@ public final class GPar {
             return asDouble(data[GP_FONTSIZE]) * asDouble(data[GP_CEX]);
         }
 
+        @Override
+        public GridFontStyle getFontStyle() {
+            return GridFontStyle.fromInt(RRuntime.asInteger(data[GP_FONT]));
+        }
+
+        @Override
+        public String getFontFamily() {
+            return RRuntime.asString(data[GP_FONTFAMILY]);
+        }
+
         @Override
         public double getLineHeight() {
             return asDouble(data[GP_LINEHEIGHT]);
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LPoints.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LPoints.java
index d4b71e0a5baadde23ac35c280a5362ba0fe7f908..51747552cbc27315d0292368bc2c10f835444bde 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LPoints.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LPoints.java
@@ -168,6 +168,16 @@ public abstract class LPoints extends RExternalBuiltinNode.Arg4 {
             return inner.getFontSize();
         }
 
+        @Override
+        public GridFontStyle getFontStyle() {
+            return inner.getFontStyle();
+        }
+
+        @Override
+        public String getFontFamily() {
+            return inner.getFontFamily();
+        }
+
         @Override
         public double getLineHeight() {
             return inner.getLineHeight();
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/DrawingContext.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/DrawingContext.java
index b3baf6db3cbbc86c93dfafeca313c5b5e77b581f..4ff84b777781b149970c7008693ef5dea59c8b63 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/DrawingContext.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/DrawingContext.java
@@ -29,6 +29,10 @@ package com.oracle.truffle.r.library.fastrGrid.device;
 public interface DrawingContext {
     double INCH_TO_POINTS_FACTOR = 72.27;
 
+    String FONT_FAMILY_MONO = "mono";
+    String FONT_FAMILY_SANS = "sans";
+    String FONT_FAMILY_SERIF = "serif";
+
     enum GridLineType {
         // The order is important!
         BLANK,
@@ -51,6 +55,25 @@ public interface DrawingContext {
         }
     }
 
+    enum GridFontStyle {
+        PLAIN,
+        BOLD,
+        ITALIC,
+        BOLDITALIC,
+        /**
+         * Supposed to be symbol font in Adobe symbol encoding.
+         */
+        SYMBOL;
+
+        /**
+         * Return enum's value corresponding to R's value.
+         */
+        public static GridFontStyle fromInt(int num) {
+            assert num > 0 && num <= SYMBOL.ordinal() + 1;
+            return values()[num - 1];
+        }
+    }
+
     GridLineType getLineType();
 
     /**
@@ -65,6 +88,15 @@ public interface DrawingContext {
      */
     double getFontSize();
 
+    GridFontStyle getFontStyle();
+
+    /**
+     * Gets the font family name. The standard values that any device must implement are "serif",
+     * "sans" and "mono". On top of that the device can recognize name of any font that it can
+     * support.
+     */
+    String getFontFamily();
+
     /**
      * Gets the height of a line in multiplies of the base line height.
      */
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/JFrameDevice.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/JFrameDevice.java
index 2ac24f74a69f39b470acd028cf1724c54ef24a9d..cb0f0a6462772f6a05eac88197dd55c6bb325142 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/JFrameDevice.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/JFrameDevice.java
@@ -28,6 +28,7 @@ import java.awt.BasicStroke;
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Dimension;
+import java.awt.Font;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.HeadlessException;
@@ -46,6 +47,7 @@ import java.util.function.Supplier;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
 
+import com.oracle.truffle.r.library.fastrGrid.device.DrawingContext.GridFontStyle;
 import com.oracle.truffle.r.library.fastrGrid.device.DrawingContext.GridLineType;
 import com.oracle.truffle.r.runtime.RInternalError;
 
@@ -116,7 +118,7 @@ public class JFrameDevice implements GridDevice {
             tr.translate((float) (leftX * POINTS_IN_INCH), (float) (currentFrame.getContentPane().getHeight() - bottomY * POINTS_IN_INCH));
             tr.rotate(-rotationAnticlockWise);
             graphics.setTransform(tr);
-            setFontSize(ctx);
+            setFont(ctx);
             graphics.drawString(text, 0, 0);
             return null;
         });
@@ -136,7 +138,7 @@ public class JFrameDevice implements GridDevice {
     public double getStringWidth(DrawingContext ctx, String text) {
         setContext(ctx);
         return noTranform(() -> {
-            setFontSize(ctx);
+            setFont(ctx);
             int swingUnits = graphics.getFontMetrics(graphics.getFont()).stringWidth(text);
             return swingUnits / POINTS_IN_INCH;
         });
@@ -146,7 +148,7 @@ public class JFrameDevice implements GridDevice {
     public double getStringHeight(DrawingContext ctx, String text) {
         setContext(ctx);
         return noTranform(() -> {
-            setFontSize(ctx);
+            setFont(ctx);
             int swingUnits = graphics.getFont().getSize();
             return swingUnits / POINTS_IN_INCH;
         });
@@ -181,9 +183,42 @@ public class JFrameDevice implements GridDevice {
         graphics.setStroke(fromGridLineType(ctx.getLineType()));
     }
 
-    private void setFontSize(DrawingContext ctx) {
+    private void setFont(DrawingContext ctx) {
         float fontSize = (float) ((ctx.getFontSize() / INCH_TO_POINTS_FACTOR) * POINTS_IN_INCH);
-        graphics.setFont(graphics.getFont().deriveFont(fontSize));
+        Font font = new Font(getFontName(ctx.getFontFamily()), getAwtFontStyle(ctx.getFontStyle()), 1).deriveFont(fontSize);
+        graphics.setFont(font);
+    }
+
+    private String getFontName(String gridFontFamily) {
+        if (gridFontFamily == null) {
+            return null;
+        }
+        switch (gridFontFamily) {
+            case DrawingContext.FONT_FAMILY_MONO:
+                return Font.MONOSPACED;
+            case DrawingContext.FONT_FAMILY_SANS:
+                return Font.SANS_SERIF;
+            case DrawingContext.FONT_FAMILY_SERIF:
+                return Font.SERIF;
+            case "":
+                return null;
+        }
+        return gridFontFamily;
+    }
+
+    private int getAwtFontStyle(GridFontStyle fontStyle) {
+        switch (fontStyle) {
+            case PLAIN:
+                return Font.PLAIN;
+            case BOLD:
+                return Font.BOLD;
+            case ITALIC:
+                return Font.ITALIC;
+            case BOLDITALIC:
+                return Font.BOLD | Font.ITALIC;
+            default:
+                throw RInternalError.shouldNotReachHere("unexpected value of GridFontStyle enum");
+        }
     }
 
     private <T> T noTranform(Supplier<T> action) {