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
new file mode 100644
index 0000000000000000000000000000000000000000..06f33e2aa39c73c53d369278b7485a04ef376a1d
--- /dev/null
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DisplayList.java
@@ -0,0 +1,108 @@
+/*
+ * 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;
+
+import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.toBoolean;
+
+import java.util.Arrays;
+
+import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
+import com.oracle.truffle.api.dsl.Specialization;
+import com.oracle.truffle.r.library.fastrGrid.DisplayListFactory.LGetDisplayListElementNodeGen;
+import com.oracle.truffle.r.library.fastrGrid.DisplayListFactory.LSetDisplayListOnNodeGen;
+import com.oracle.truffle.r.nodes.builtin.RExternalBuiltinNode;
+import com.oracle.truffle.r.runtime.RRuntime;
+import com.oracle.truffle.r.runtime.data.RDataFactory;
+import com.oracle.truffle.r.runtime.data.RList;
+import com.oracle.truffle.r.runtime.data.RNull;
+
+public class DisplayList {
+    private static final int INITIAL_DL_SIZE = 100;
+
+    static RList createInitialDisplayList() {
+        Object[] data = new Object[INITIAL_DL_SIZE];
+        Arrays.fill(data, 0, data.length, RNull.instance);
+        RList list = RDataFactory.createList(data);
+        list.makeSharedPermanent();
+        return list;
+    }
+
+    static void initDisplayList(GridState gridState) {
+        RList list = createInitialDisplayList();
+        list.setDataAt(list.getInternalStore(), 0, gridState.getViewPort());
+        gridState.setDisplayList(list);
+        gridState.setDisplayListIndex(1);
+    }
+
+    public abstract static class LGetDisplayListElement extends RExternalBuiltinNode.Arg1 {
+        static {
+            Casts casts = new Casts(LGetDisplayListElement.class);
+            casts.arg(0).asIntegerVector().findFirst();
+        }
+
+        public static LGetDisplayListElement create() {
+            return LGetDisplayListElementNodeGen.create();
+        }
+
+        @Specialization
+        @TruffleBoundary
+        Object getDLElement(int index) {
+            return GridContext.getContext().getGridState().getDisplayList().getDataAt(index);
+        }
+    }
+
+    public abstract static class LSetDisplayListOn extends RExternalBuiltinNode.Arg1 {
+        static {
+            Casts casts = new Casts(LSetDisplayListOn.class);
+            casts.arg(0).asLogicalVector().findFirst().map(toBoolean());
+        }
+
+        public static LSetDisplayListOn create() {
+            return LSetDisplayListOnNodeGen.create();
+        }
+
+        @Specialization
+        @TruffleBoundary
+        byte setDLOn(boolean value) {
+            GridState gridState = GridContext.getContext().getGridState();
+            boolean result = gridState.isDisplayListOn();
+            gridState.setIsDisplayListOn(value);
+            return RRuntime.asLogical(result);
+        }
+    }
+
+    public static final class LInitDisplayList extends RExternalBuiltinNode.Arg0 {
+        static {
+            Casts.noCasts(LInitDisplayList.class);
+        }
+
+        @Override
+        @TruffleBoundary
+        public Object execute() {
+            GridState gridState = GridContext.getContext().getGridState();
+            initDisplayList(gridState);
+            return RNull.instance;
+        }
+
+    }
+}
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/FastRGridExternalLookup.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/FastRGridExternalLookup.java
index 354cc207472ef0334c9b04627f23b0179e87e366..dc2ca5e33d64d34c249f78c8ce9640e45aab3b6b 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/FastRGridExternalLookup.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/FastRGridExternalLookup.java
@@ -22,6 +22,9 @@
  */
 package com.oracle.truffle.r.library.fastrGrid;
 
+import com.oracle.truffle.r.library.fastrGrid.DisplayList.LGetDisplayListElement;
+import com.oracle.truffle.r.library.fastrGrid.DisplayList.LInitDisplayList;
+import com.oracle.truffle.r.library.fastrGrid.DisplayList.LSetDisplayListOn;
 import com.oracle.truffle.r.library.fastrGrid.grDevices.DevCurr;
 import com.oracle.truffle.r.library.fastrGrid.grDevices.DevHoldFlush;
 import com.oracle.truffle.r.library.fastrGrid.grDevices.DevOff;
@@ -34,7 +37,6 @@ import com.oracle.truffle.r.runtime.RInternalCode;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.context.RContext;
-import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RNull;
 
@@ -129,20 +131,28 @@ public final class FastRGridExternalLookup {
             case "L_initGPar":
                 return new LInitGPar();
 
-            // Display list stuff: not implemented atm
+            // Display list stuff
             case "L_getDisplayList":
-                return new IgnoredGridExternal(RDataFactory.createList());
+                return new GridStateGetNode(GridState::getDisplayList);
+            case "L_setDisplayList":
+                return GridStateSetNode.create((state, val) -> state.setDisplayList((RList) val));
             case "L_getDLindex":
-                return new IgnoredGridExternal(0);
+                return new GridStateGetNode(GridState::getDisplayListIndex);
+            case "L_setDLindex":
+                return GridStateSetNode.create((state, val) -> state.setDisplayListIndex(RRuntime.asInteger(val)));
+            case "L_setDLelt":
+                return GridStateSetNode.create(GridState::setDisplayListElement);
+            case "L_getDLelt":
+                return LGetDisplayListElement.create();
+            case "L_setDLon":
+                return LSetDisplayListOn.create();
             case "L_getDLon":
+                return new GridStateGetNode(state -> RRuntime.asLogical(state.isDisplayListOn()));
             case "L_getEngineDLon":
                 return new IgnoredGridExternal(RRuntime.LOGICAL_FALSE);
             case "L_initDisplayList":
+                return new LInitDisplayList();
             case "L_newpagerecording":
-            case "L_setDisplayList":
-            case "L_setDLelt":
-            case "L_setDLindex":
-            case "L_setDLon":
                 return new IgnoredGridExternal(RNull.instance);
 
             // These methods do not use graphics system or any global state. For now,
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 deab204f3b8ce9f20b3608108a34ce0c26fe3780..321e0a022bae4fcc9d5ee5154af2c5e3af2e28fe 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
@@ -42,6 +42,39 @@ public final class GridState {
         return devHoldCount;
     }
 
+    public RList getDisplayList() {
+        if (devState.displayList == null) {
+            devState.displayList = DisplayList.createInitialDisplayList();
+        }
+        return devState.displayList;
+    }
+
+    public void setDisplayList(RList newList) {
+        newList.makeSharedPermanent();
+        devState.displayList = newList;
+    }
+
+    public void setDisplayListElement(Object element) {
+        Object[] data = devState.displayList.getDataWithoutCopying();
+        data[devState.displayListIndex] = element;
+    }
+
+    public boolean isDisplayListOn() {
+        return devState.isDisplayListOn;
+    }
+
+    public void setIsDisplayListOn(boolean flag) {
+        devState.isDisplayListOn = flag;
+    }
+
+    public int getDisplayListIndex() {
+        return devState.displayListIndex;
+    }
+
+    public void setDisplayListIndex(int newValue) {
+        devState.displayListIndex = newValue;
+    }
+
     public void init(REnvironment gridEnv) {
         this.gridEnv = gridEnv;
         this.currentGrob = RNull.instance;
@@ -112,5 +145,8 @@ public final class GridState {
         private RList viewPort;
         private double scale = 1;
         private int devHoldCount;
+        private boolean isDisplayListOn = true;
+        private RList displayList;
+        private int displayListIndex = 0;
     }
 }
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 a6314dff2c06b37db7b29a26f97f4fb674ea078c..d24bea0560f6858231683a6e94b23cece372a147 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
@@ -54,7 +54,7 @@ final class LGridDirty extends RExternalBuiltinNode {
         if (gridState.getViewPort() == null) {
             gridState.setViewPort(initViewPort.execute(frame));
         }
-
+        DisplayList.initDisplayList(gridState);
         return RNull.instance;
     }
 
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/GridDevice.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/GridDevice.java
index 90a2dcd6e941b70aa7f45f1dd1cefecc4c6eb6a3..f893a5b02bc3bc37f1c998d71c265d50b6c86b6c 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/GridDevice.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/GridDevice.java
@@ -22,8 +22,6 @@
  */
 package com.oracle.truffle.r.library.fastrGrid.device;
 
-import static com.oracle.truffle.r.library.fastrGrid.device.DrawingContext.INCH_TO_POINTS_FACTOR;
-
 /**
  * Abstract device that can draw primitive shapes and text. All sizes and coordinates are specified
  * in inches and angles in radians unless stated otherwise.
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/awt/JFrameDevice.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/awt/JFrameDevice.java
index 6e31f1f417c26d9f791b73dd9e540838c93bc0e5..93c4f700aa9bc9cbcfdc2b32e4e8ba48e4447063 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/awt/JFrameDevice.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/device/awt/JFrameDevice.java
@@ -58,6 +58,7 @@ public final class JFrameDevice extends Graphics2DDevice {
     public static JFrameDevice create() {
         FastRFrame frame = new FastRFrame();
         frame.setVisible(true);
+        frame.pack();
         Graphics2D graphics = (Graphics2D) frame.getGraphics();
         defaultInitGraphics(graphics);
         return new JFrameDevice(frame, graphics, true);
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java
index f1fab85632025eb617b80a6347c691d6a4f8a679..5048fe9411bad215e5a62392976c45f03821b8ba 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/grDevices/InitWindowedDevice.java
@@ -22,8 +22,6 @@
  */
 package com.oracle.truffle.r.library.fastrGrid.grDevices;
 
-import java.io.IOException;
-
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.r.library.fastrGrid.GridContext;
 import com.oracle.truffle.r.library.fastrGrid.device.awt.BufferedImageDevice;