diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DisplayList.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DisplayList.java
index 14cd2fda773ebceec382ffdd337cd510e2503e86..8c1b859999ec66ad62ac8a8eedcf4349488189df 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DisplayList.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DisplayList.java
@@ -47,7 +47,7 @@ public class DisplayList {
         return list;
     }
 
-    static void initDisplayList(GridState gridState) {
+    public static void initDisplayList(GridState gridState) {
         RList list = createInitialDisplayList();
         list.setDataAt(0, gridState.getViewPort());
         gridState.setDisplayList(list);
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java
index 3150a167f08fb8c0c35a75239d94af3ad8744ece..c1cfe4461c2f329c6d60fda68c3fe648c2db9791 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java
@@ -102,7 +102,7 @@ public final class GridState {
         this.currentGrob = RNull.instance;
     }
 
-    void initGPar(GridDevice currentDevice) {
+    public void initGPar(GridDevice currentDevice) {
         devState.gpar = GPar.createNew(currentDevice);
         assert devState.gpar.verify();
     }
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LGridDirty.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LGridDirty.java
index 8d865b9172905d35b33224d962037ef465cd0134..23a07e326d676d8afff2433ef9d86eb973643528 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LGridDirty.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/LGridDirty.java
@@ -15,6 +15,7 @@ import com.oracle.truffle.api.CompilerDirectives;
 import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.r.library.fastrGrid.ViewPort.InitViewPortNode;
 import com.oracle.truffle.r.library.fastrGrid.device.GridDevice;
+import com.oracle.truffle.r.library.fastrGrid.grDevices.OpenDefaultDevice;
 import com.oracle.truffle.r.nodes.builtin.RExternalBuiltinNode;
 import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RNull;
@@ -28,6 +29,7 @@ import com.oracle.truffle.r.runtime.data.RNull;
  */
 final class LGridDirty extends RExternalBuiltinNode {
     @Child private InitViewPortNode initViewPort = new InitViewPortNode();
+    @Child private OpenDefaultDevice openDefaultDevice = new OpenDefaultDevice();
 
     static {
         Casts.noCasts(LGridDirty.class);
@@ -41,16 +43,11 @@ final class LGridDirty extends RExternalBuiltinNode {
         }
 
         // the rest only takes place if the device has been changed since the last time
-        CompilerDirectives.transferToInterpreter();
-
-        // if no device has been opened yet, open the default one and make it current
-        if (GridContext.getContext().getCurrentDevice() == null) {
-            GridContext.getContext().openDefaultDevice();
-            // grid state is device dependent
-            gridState = GridContext.getContext().getGridState();
-        }
+        openDefaultDevice.execute();
 
+        CompilerDirectives.transferToInterpreter();
         // the current device has not been initialized yet...
+        gridState = GridContext.getContext().getGridState();
         GridDevice device = GridContext.getContext().getCurrentDevice();
         device.openNewPage();
         gridState.initGPar(device);
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/ViewPort.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/ViewPort.java
index 813782bb255540cbfc5dfae24fc3046158886027..0c5e860171d1f647728d31b27056e2f65a2bc11c 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/ViewPort.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/ViewPort.java
@@ -32,7 +32,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
  * port. One such list is pushed using {@code pushViewpoint} it is transformed to a 'pushed
  * viewpoint', which is a copy of the original view point and it has some additional attributes.
  */
-final class ViewPort {
+public final class ViewPort {
     /*
      * Structure of a viewport
      */
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/OpenDefaultDevice.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/OpenDefaultDevice.java
new file mode 100644
index 0000000000000000000000000000000000000000..3307dd77efb932a6d360932c564a1757a1c31b0c
--- /dev/null
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/OpenDefaultDevice.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.truffle.r.library.fastrGrid.grDevices;
+
+import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
+import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.r.library.fastrGrid.GridContext;
+
+/**
+ * Opens the default graphical device if no device is has been opened yet. Internal node not exposed
+ * directly through .Call/.External interface.
+ */
+public final class OpenDefaultDevice extends Node {
+    @TruffleBoundary
+    public void execute() {
+        // if no device has been opened yet, open the default one and make it current
+        if (GridContext.getContext().getCurrentDevice() == null) {
+            GridContext.getContext().openDefaultDevice();
+        }
+    }
+}
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/CPar.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/CPar.java
index 29936641ce22710b12d7ee374a2deb99873233bf..9e8f8334770f9d701f3b92b2081505f88925c23b 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/CPar.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/graphics/CPar.java
@@ -25,11 +25,11 @@ package com.oracle.truffle.r.library.fastrGrid.graphics;
 import static com.oracle.truffle.r.library.fastrGrid.device.DrawingContext.INCH_TO_POINTS_FACTOR;
 
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
-import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.r.library.fastrGrid.GPar;
 import com.oracle.truffle.r.library.fastrGrid.GridContext;
 import com.oracle.truffle.r.library.fastrGrid.device.DrawingContext;
 import com.oracle.truffle.r.library.fastrGrid.device.GridDevice;
+import com.oracle.truffle.r.library.fastrGrid.grDevices.OpenDefaultDevice;
 import com.oracle.truffle.r.nodes.builtin.RExternalBuiltinNode;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RError.Message;
@@ -44,13 +44,20 @@ public final class CPar extends RExternalBuiltinNode {
         Casts.noCasts(CPar.class);
     }
 
+    @Child private OpenDefaultDevice openDefaultDevice = new OpenDefaultDevice();
+
     @Override
-    @TruffleBoundary
-    protected Object call(RArgsValuesAndNames args) {
+    public Object call(RArgsValuesAndNames args) {
         if (args.getSignature().getNonNullCount() > 0) {
             throw error(Message.GENERIC, "Using par for setting device parameters is not supported in FastR grid emulation mode.");
         }
 
+        openDefaultDevice.execute();
+        return getPar(args);
+    }
+
+    @TruffleBoundary
+    private static Object getPar(RArgsValuesAndNames args) {
         GridDevice device = GridContext.getContext().getCurrentDevice();
         RList names = RDataFactory.createList(args.getArguments());
         // unwrap list if it is the first argument
@@ -80,19 +87,20 @@ public final class CPar extends RExternalBuiltinNode {
                 return RDataFactory.createDoubleVector(new double[]{device.getWidth(), device.getHeight()}, RDataFactory.COMPLETE_VECTOR);
             case "cin":
                 /*
-                 * character size ‘(width, height)’ in inches. These are the same measurements as ‘cra’, expressed
-                 * in different units.
+                 * character size ‘(width, height)’ in inches. These are the same measurements as
+                 * ‘cra’, expressed in different units.
                  *
-                 * Note: cin/cra is used in dev.size() to figure out the conversion ratio between pixels and inches.
-                 * For the time being what is important is to choose the values to keep this ratio!
+                 * Note: cin/cra is used in dev.size() to figure out the conversion ratio between
+                 * pixels and inches. For the time being what is important is to choose the values
+                 * to keep this ratio!
                  */
                 double cin = getCurrentDrawingContext().getFontSize() / INCH_TO_POINTS_FACTOR;
                 return RDataFactory.createDoubleVector(new double[]{cin, cin}, RDataFactory.COMPLETE_VECTOR);
             case "cra":
                 /*
-                 * size of default character ‘(width, height)’ in ‘rasters’ (pixels). Some devices have no concept
-                 * of pixels and so assume an arbitrary pixel size, usually 1/72 inch. These are the same
-                 * measurements as ‘cin’, expressed in different units.
+                 * size of default character ‘(width, height)’ in ‘rasters’ (pixels). Some devices
+                 * have no concept of pixels and so assume an arbitrary pixel size, usually 1/72
+                 * inch. These are the same measurements as ‘cin’, expressed in different units.
                  */
                 double cra = getCurrentDrawingContext().getFontSize();
                 return RDataFactory.createDoubleVector(new double[]{cra, cra}, RDataFactory.COMPLETE_VECTOR);