diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ActiveBindingMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ActiveBindingMR.java
index 94532825ba6d359254f320a8ad0c778b62d1da8c..6dc535b57028cafd75e031a8fd4e04ca66109265 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ActiveBindingMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ActiveBindingMR.java
@@ -27,6 +27,7 @@ import com.oracle.truffle.api.interop.MessageResolution;
 import com.oracle.truffle.api.interop.Resolve;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.env.frame.ActiveBinding;
 
 @MessageResolution(receiverType = ActiveBinding.class)
@@ -53,6 +54,20 @@ public class ActiveBindingMR {
         }
     }
 
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class ActiveBindingCheck extends Node {
 
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ListMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ListMR.java
index 92276371262cf8d572b35f2feb6458d10590b8c8..0a753d19f9a50841ed17702d326c28cbb8ac7a5a 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ListMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ListMR.java
@@ -45,6 +45,8 @@ import com.oracle.truffle.r.nodes.access.vector.ExtractVectorNode;
 import com.oracle.truffle.r.nodes.access.vector.ReplaceVectorNode;
 import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
 import com.oracle.truffle.r.nodes.control.RLengthNode;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
+import com.oracle.truffle.r.runtime.data.RExpression;
 import com.oracle.truffle.r.runtime.data.RFunction;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RLogical;
@@ -122,6 +124,20 @@ public class ListMR {
             }
         }
 
+        @Resolve(message = "IS_POINTER")
+        public abstract static class IsPointerNode extends Node {
+            protected boolean access(Object receiver) {
+                return NativeDataAccess.isPointer(receiver);
+            }
+        }
+
+        @Resolve(message = "AS_POINTER")
+        public abstract static class AsPointerNode extends Node {
+            protected long access(Object receiver) {
+                return NativeDataAccess.asPointer(receiver);
+            }
+        }
+
         @CanResolve
         public abstract static class RListCheck extends Node {
 
@@ -131,6 +147,104 @@ public class ListMR {
         }
     }
 
+    @MessageResolution(receiverType = RExpression.class)
+    public static class RExpressionMR extends ListMR {
+        @Resolve(message = "IS_BOXED")
+        public abstract static class RExpressionIsBoxedNode extends Node {
+            protected Object access(RExpression receiver) {
+                return isBoxed(receiver);
+            }
+        }
+
+        @Resolve(message = "HAS_SIZE")
+        public abstract static class RExpressionHasSizeNode extends Node {
+            protected Object access(RExpression receiver) {
+                return hasSize(receiver);
+            }
+        }
+
+        @Resolve(message = "GET_SIZE")
+        public abstract static class RExpressionGetSizeNode extends Node {
+            @Child private RLengthNode lengthNode = RLengthNode.create();
+
+            protected Object access(RExpression receiver) {
+                return getSize(receiver, lengthNode);
+            }
+        }
+
+        @Resolve(message = "IS_NULL")
+        public abstract static class RExpressionIsNullNode extends Node {
+            protected Object access(RExpression receiver) {
+                return isNull(receiver);
+            }
+        }
+
+        @Resolve(message = "READ")
+        public abstract static class RExpressionReadNode extends Node {
+            @Child private ListReadImplNode read = ListReadImplNodeGen.create();
+
+            protected Object access(VirtualFrame frame, RExpression receiver, Object identifier) {
+                return read.execute(frame, receiver, identifier);
+            }
+        }
+
+        @Resolve(message = "WRITE")
+        public abstract static class RExpressionWriteNode extends Node {
+            @Child private ListWriteImplNode writeNode = ListWriteImplNodeGen.create();
+
+            protected Object access(RExpression receiver, Object identifier, Object valueObj) {
+                return writeNode.execute(receiver, identifier, valueObj);
+            }
+        }
+
+        @Resolve(message = "KEYS")
+        public abstract static class RExpressionKeysNode extends Node {
+            @Child private GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create();
+
+            protected Object access(RExpression receiver) {
+                return listKeys(receiver, getNamesNode);
+            }
+        }
+
+        @Resolve(message = "KEY_INFO")
+        public abstract static class RExpressionKeyInfoNode extends Node {
+            @Child private ListKeyInfoImplNode keyInfoNode = ListKeyInfoImplNodeGen.create();
+
+            protected Object access(TruffleObject receiver, Object idx) {
+                return keyInfoNode.execute(receiver, idx);
+            }
+        }
+
+        @Resolve(message = "TO_NATIVE")
+        public abstract static class RExpressionToNativeNode extends Node {
+            protected Object access(RTruffleObject receiver) {
+                return toNativePointer(receiver);
+            }
+        }
+
+        @Resolve(message = "IS_POINTER")
+        public abstract static class IsPointerNode extends Node {
+            protected boolean access(Object receiver) {
+                return NativeDataAccess.isPointer(receiver);
+            }
+        }
+
+        @Resolve(message = "AS_POINTER")
+        public abstract static class AsPointerNode extends Node {
+            protected long access(Object receiver) {
+                return NativeDataAccess.asPointer(receiver);
+            }
+        }
+
+        @CanResolve
+        public abstract static class RExpressionCheck extends Node {
+
+            protected static boolean test(TruffleObject receiver) {
+                return receiver instanceof RExpression;
+            }
+        }
+    }
+
     @MessageResolution(receiverType = RPairList.class)
     public static class RPairListMR {
 
@@ -200,6 +314,20 @@ public class ListMR {
             }
         }
 
+        @Resolve(message = "IS_POINTER")
+        public abstract static class IsPointerNode extends Node {
+            protected boolean access(Object receiver) {
+                return NativeDataAccess.isPointer(receiver);
+            }
+        }
+
+        @Resolve(message = "AS_POINTER")
+        public abstract static class AsPointerNode extends Node {
+            protected long access(Object receiver) {
+                return NativeDataAccess.asPointer(receiver);
+            }
+        }
+
         @CanResolve
         public abstract static class RPairListCheck extends Node {
             protected static boolean test(TruffleObject receiver) {
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java
index 2ee572ca4c6ee226ad4f84b4165a4976ce428747..2ab541ec036edce1652f1d7c2067815f9e87e364 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java
@@ -36,6 +36,7 @@ import com.oracle.truffle.api.profiles.ConditionProfile;
 import com.oracle.truffle.r.engine.interop.RArgsValuesAndNamesMRFactory.RArgsValuesAndNamesKeyInfoImplNodeGen;
 import com.oracle.truffle.r.engine.interop.RArgsValuesAndNamesMRFactory.RArgsValuesAndNamesReadImplNodeGen;
 import com.oracle.truffle.r.runtime.ArgumentsSignature;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RFunction;
@@ -89,6 +90,20 @@ public class RArgsValuesAndNamesMR {
         }
     }
 
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class RArgsValuesAndNamesCheck extends Node {
 
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RConnectionMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RConnectionMR.java
index 273c19ac19309adaafef5501531d4199f0426aeb..2ca10db203dce63e46e28bbe25857f3bd20ca699 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RConnectionMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RConnectionMR.java
@@ -28,6 +28,7 @@ import com.oracle.truffle.api.interop.Resolve;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.r.runtime.conn.RConnection;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 
 @MessageResolution(receiverType = RConnection.class)
 public class RConnectionMR {
@@ -39,6 +40,20 @@ public class RConnectionMR {
         }
     }
 
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class RConnection extends Node {
 
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REmptyMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REmptyMR.java
index 462d98e4c6aaccd9d4393568435d0766219e8ef4..fe15844891309997f59a01e3a607982ea142cdc6 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REmptyMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REmptyMR.java
@@ -27,6 +27,7 @@ import com.oracle.truffle.api.interop.MessageResolution;
 import com.oracle.truffle.api.interop.Resolve;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.data.REmpty;
 
 @MessageResolution(receiverType = REmpty.class)
@@ -39,6 +40,20 @@ public class REmptyMR {
         }
     }
 
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class REmptyCheck extends Node {
 
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java
index b18d134b3bffc9232b05c213cac2fdd11f600141..71fe7cdf9b9fb8c3b8c987ff6d7145c877eda25f 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java
@@ -45,6 +45,7 @@ import com.oracle.truffle.r.ffi.impl.interop.NativePointer;
 import com.oracle.truffle.r.nodes.access.vector.ElementAccessMode;
 import com.oracle.truffle.r.nodes.access.vector.ExtractVectorNode;
 import com.oracle.truffle.r.nodes.access.vector.ReplaceVectorNode;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.data.RFunction;
 import com.oracle.truffle.r.runtime.env.REnvironment;
 import com.oracle.truffle.r.runtime.interop.Foreign2R;
@@ -97,6 +98,20 @@ public class REnvironmentMR {
         }
     }
 
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class REnvironmentCheck extends Node {
 
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RExternalPtrMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RExternalPtrMR.java
index bb333c5502fd6dbec9b5522babfcd46fc94257f5..255ce94646377d4743b0021422598368853903d4 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RExternalPtrMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RExternalPtrMR.java
@@ -27,6 +27,7 @@ import com.oracle.truffle.api.interop.MessageResolution;
 import com.oracle.truffle.api.interop.Resolve;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.data.RExternalPtr;
 
 @MessageResolution(receiverType = RExternalPtr.class)
@@ -39,6 +40,20 @@ public class RExternalPtrMR {
         }
     }
 
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class RExternalPtrCheck extends Node {
 
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RForeignAccessFactoryImpl.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RForeignAccessFactoryImpl.java
index 3fd10f6ef50db12c670ffa5c10e750ecd2d7ffd8..7df762b0be5048cb03dbdde884295d98e72b0b55 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RForeignAccessFactoryImpl.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RForeignAccessFactoryImpl.java
@@ -33,6 +33,7 @@ import com.oracle.truffle.r.runtime.context.RForeignAccessFactory;
 import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RDouble;
 import com.oracle.truffle.r.runtime.data.REmpty;
+import com.oracle.truffle.r.runtime.data.RExpression;
 import com.oracle.truffle.r.runtime.data.RExternalPtr;
 import com.oracle.truffle.r.runtime.data.RFunction;
 import com.oracle.truffle.r.runtime.data.RInteger;
@@ -73,6 +74,8 @@ public final class RForeignAccessFactoryImpl implements RForeignAccessFactory {
             return RNullMRForeign.ACCESS;
         } else if (obj instanceof RList) {
             return RListMRForeign.ACCESS;
+        } else if (obj instanceof RExpression) {
+            return RExpressionMRForeign.ACCESS;
         } else if (obj instanceof REnvironment) {
             return REnvironmentMRForeign.ACCESS;
         } else if (obj instanceof RPairList) {
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RFunctionMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RFunctionMR.java
index 19af21fca055a0f36aa5c97327ce9a224614827b..790c817810d3ae72898fcb8aaf4816048293a018 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RFunctionMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RFunctionMR.java
@@ -37,6 +37,7 @@ import com.oracle.truffle.r.nodes.function.RCallBaseNode;
 import com.oracle.truffle.r.nodes.function.RCallNode;
 import com.oracle.truffle.r.runtime.ArgumentsSignature;
 import com.oracle.truffle.r.runtime.RArguments;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames;
 import com.oracle.truffle.r.runtime.data.RFunction;
 import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor;
@@ -104,6 +105,20 @@ public class RFunctionMR {
         }
     }
 
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class RFunctionCheck extends Node {
 
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RLanguageMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RLanguageMR.java
index 699bf254017fcbe4830059d21a9651109cfde27f..8b1c680448b02c965f53da984fd2538fbb6373ed 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RLanguageMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RLanguageMR.java
@@ -38,6 +38,7 @@ import com.oracle.truffle.api.profiles.ConditionProfile;
 import com.oracle.truffle.r.ffi.impl.interop.NativePointer;
 import com.oracle.truffle.r.nodes.access.vector.ElementAccessMode;
 import com.oracle.truffle.r.nodes.access.vector.ExtractVectorNode;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.data.RLanguage;
 import com.oracle.truffle.r.runtime.data.RLogical;
 import com.oracle.truffle.r.runtime.data.RNull;
@@ -86,6 +87,20 @@ public class RLanguageMR {
         }
     }
 
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class RLanguageCheck extends Node {
 
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RMissingMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RMissingMR.java
index 9c6abcf27b4b49c284248918ac15327e5a8bfe38..53e246cf04c5ee0fee2c7e842285ecc90601b974 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RMissingMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RMissingMR.java
@@ -27,6 +27,7 @@ import com.oracle.truffle.api.interop.MessageResolution;
 import com.oracle.truffle.api.interop.Resolve;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.data.RMissing;
 
 @MessageResolution(receiverType = RMissing.class)
@@ -39,6 +40,20 @@ public class RMissingMR {
         }
     }
 
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class RMissingCheck extends Node {
 
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RNullMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RNullMR.java
index 270f160dde7635edebde476f2cffbc82ffb51141..dde35783c552f7b2eaa1781a600005dc87d6062d 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RNullMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RNullMR.java
@@ -28,6 +28,7 @@ import com.oracle.truffle.api.interop.Resolve;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.r.ffi.impl.interop.NativePointer;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.data.RNull;
 
 @MessageResolution(receiverType = RNull.class)
@@ -58,6 +59,20 @@ public class RNullMR {
         }
     }
 
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class RNullCheck extends Node {
 
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java
index f531beac95dcddda545333c19445b074ea67fc50..ab3db61d67cfd0241e8eafec2122a91c0d66b381 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java
@@ -39,6 +39,7 @@ import com.oracle.truffle.r.engine.interop.RPromiseMRFactory.RPromiseWriteImplNo
 import com.oracle.truffle.r.ffi.impl.interop.NativePointer;
 import com.oracle.truffle.r.nodes.function.PromiseHelperNode;
 import com.oracle.truffle.r.runtime.RRuntime;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.RPromise;
@@ -93,6 +94,20 @@ public class RPromiseMR {
         }
     }
 
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class RPromiseCheck extends Node {
 
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RS4ObjectMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RS4ObjectMR.java
index 65a9cd84ba36ed4a52c624bcadfd77a9e1574081..0e944adbbeb407684ccb4ea567b980d7e5518c7b 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RS4ObjectMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RS4ObjectMR.java
@@ -44,6 +44,7 @@ import com.oracle.truffle.r.nodes.attributes.ArrayAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.GetAttributeNode;
 import com.oracle.truffle.r.nodes.attributes.SetAttributeNode;
 import com.oracle.truffle.r.runtime.data.RAttributesLayout.RAttribute;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RFunction;
 import com.oracle.truffle.r.runtime.data.RNull;
@@ -102,6 +103,20 @@ public class RS4ObjectMR {
         return RDataFactory.createStringVector(data, RDataFactory.COMPLETE_VECTOR);
     }
 
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class RS4ObjectCheck extends Node {
         protected static boolean test(TruffleObject receiver) {
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RSymbolMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RSymbolMR.java
index d506157e6f72ff6ec0d09e76e792b5217b7b4396..f55d81fdefb9e952d1ce4dd18310b1bb4be6530d 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RSymbolMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RSymbolMR.java
@@ -28,6 +28,7 @@ import com.oracle.truffle.api.interop.Resolve;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.r.ffi.impl.interop.NativePointer;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.data.RSymbol;
 
 @MessageResolution(receiverType = RSymbol.class)
@@ -47,6 +48,20 @@ public class RSymbolMR {
         }
     }
 
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class RSymbolCheck extends Node {
 
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RUnboundValueMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RUnboundValueMR.java
index 6810239ab9eda9b452af44aa14f75b0045e13aad..c20ef87dfe3eb3e2fe795ab0362e9adcf0d7c50f 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RUnboundValueMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RUnboundValueMR.java
@@ -27,6 +27,7 @@ import com.oracle.truffle.api.interop.MessageResolution;
 import com.oracle.truffle.api.interop.Resolve;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.data.RUnboundValue;
 
 @MessageResolution(receiverType = RUnboundValue.class)
@@ -39,6 +40,20 @@ public class RUnboundValueMR {
         }
     }
 
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class RUnboundValueCheck extends Node {
 
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/CharSXPWrapperMR.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/CharSXPWrapperMR.java
index 70f024e443059ff9902a8ae317dffb7ab6b546b2..40ac2f5564469d7a6d81c5a642865b957547fa48 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/CharSXPWrapperMR.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/CharSXPWrapperMR.java
@@ -24,12 +24,29 @@ package com.oracle.truffle.r.ffi.impl.interop;
 
 import com.oracle.truffle.api.interop.CanResolve;
 import com.oracle.truffle.api.interop.MessageResolution;
+import com.oracle.truffle.api.interop.Resolve;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.ffi.CharSXPWrapper;
 
 @MessageResolution(receiverType = CharSXPWrapper.class)
 public class CharSXPWrapperMR {
+
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
+
     @CanResolve
     public abstract static class CharSXPWrapperCheck extends Node {
 
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLDotSymbolMR.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLDotSymbolMR.java
index 6c29f5f5058dcac5a7632a1865c7232b97223a87..b82d56a67e86e96dae6e9967c30f5e32421be068 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLDotSymbolMR.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLDotSymbolMR.java
@@ -24,17 +24,32 @@ package com.oracle.truffle.r.ffi.impl.interop;
 
 import com.oracle.truffle.api.interop.CanResolve;
 import com.oracle.truffle.api.interop.MessageResolution;
+import com.oracle.truffle.api.interop.Resolve;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.ffi.DLL;
 
 @MessageResolution(receiverType = DLL.DotSymbol.class)
 public class DLLDotSymbolMR {
     @CanResolve
     public abstract static class DotSymbolCheck extends Node {
-
         protected static boolean test(TruffleObject receiver) {
             return receiver instanceof DLL.DotSymbol;
         }
     }
+
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
 }
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLInfoMR.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLInfoMR.java
index 60657d6cd23d5f9fb3b29ac914f007094b41fdc5..7027783e7e2167c4d46e012ac3fd790bd85cccf1 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLInfoMR.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/interop/DLLInfoMR.java
@@ -24,8 +24,10 @@ package com.oracle.truffle.r.ffi.impl.interop;
 
 import com.oracle.truffle.api.interop.CanResolve;
 import com.oracle.truffle.api.interop.MessageResolution;
+import com.oracle.truffle.api.interop.Resolve;
 import com.oracle.truffle.api.interop.TruffleObject;
 import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.r.runtime.data.NativeDataAccess;
 import com.oracle.truffle.r.runtime.ffi.DLL;
 
 @MessageResolution(receiverType = DLL.DLLInfo.class)
@@ -37,4 +39,18 @@ public class DLLInfoMR {
             return receiver instanceof DLL.DLLInfo;
         }
     }
+
+    @Resolve(message = "IS_POINTER")
+    public abstract static class IsPointerNode extends Node {
+        protected boolean access(Object receiver) {
+            return NativeDataAccess.isPointer(receiver);
+        }
+    }
+
+    @Resolve(message = "AS_POINTER")
+    public abstract static class AsPointerNode extends Node {
+        protected long access(Object receiver) {
+            return NativeDataAccess.asPointer(receiver);
+        }
+    }
 }
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/NativeFunction.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/NativeFunction.java
index 9c7d3506683a27c3bf45f4833c13e6c69c86ed55..d475068ea492290b10c38e640bd6afd8e336738e 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/NativeFunction.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/NativeFunction.java
@@ -115,7 +115,6 @@ public enum NativeFunction {
         if (function == null) {
             CompilerDirectives.transferToInterpreterAndInvalidate();
             function = lookup.apply(callName, signature);
-            System.out.println("lookup " + callName);
         }
         return function;
     }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java
index 8cfbfa11a8232d2e9f4bf9c2fb80ae2bc22c3bfc..50b92a236f95b5ea132d1b95f65f775e6d7c5598 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/ConnectionSupport.java
@@ -51,6 +51,7 @@ import com.oracle.truffle.r.runtime.data.RAttributesLayout;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RExternalPtr;
 import com.oracle.truffle.r.runtime.data.RNull;
+import com.oracle.truffle.r.runtime.data.RObject;
 import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
@@ -520,7 +521,7 @@ public class ConnectionSupport {
      * it subsequently will throw an error. The latter will open/close the connection (internally)
      * and this can be repeated indefinitely.
      */
-    public abstract static class BaseRConnection implements RConnection {
+    public abstract static class BaseRConnection extends RObject implements RConnection {
 
         /**
          * {@code true} is the connection has been opened successfully. N.B. This supports lazy
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java
index fec907242f0fc9d30cb9e084d97b8384a3fa941e..851519c9ca49d7f9927a5ab9195e76ce8675e66b 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java
@@ -44,6 +44,7 @@ import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.conn.ConnectionSupport.BaseRConnection;
 import com.oracle.truffle.r.runtime.data.RDataFactory;
+import com.oracle.truffle.r.runtime.data.RObject;
 import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
 
 /**
@@ -53,7 +54,7 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
  * operations.
  * </p>
  */
-abstract class DelegateRConnection implements RConnection, ByteChannel {
+abstract class DelegateRConnection extends RObject implements RConnection, ByteChannel {
     public static final int DEFAULT_CACHE_SIZE = 16 * 1024;
     protected final BaseRConnection base;
     private final ByteBuffer cache;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/NativeDataAccess.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/NativeDataAccess.java
index a05f4130f9d15ae01193f0fcb4f5d7a487dc1dc6..995384701823cda42dede1c343b5d1b342be39bf 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/NativeDataAccess.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/NativeDataAccess.java
@@ -88,6 +88,7 @@ public final class NativeDataAccess {
         protected void finalize() throws Throwable {
             super.finalize();
             nativeMirrors.remove(id);
+            // System.out.println(String.format("gc'ing %16x", id));
             if (dataAddress != 0) {
                 UnsafeAdapter.UNSAFE.freeMemory(dataAddress);
                 assert (dataAddress = 0xbadbad) != 0;
@@ -102,31 +103,45 @@ public final class NativeDataAccess {
         return Truffle.getRuntime().createCallTarget(new InteropRootNode() {
             @Override
             public Object execute(VirtualFrame frame) {
-                return ForeignAccess.getReceiver(frame) instanceof RObject;
+                return isPointer(ForeignAccess.getReceiver(frame));
             }
         });
     }
 
+    public static boolean isPointer(Object obj) {
+        return obj instanceof RObject;
+    }
+
     public static CallTarget createAsPointer() {
         return Truffle.getRuntime().createCallTarget(new InteropRootNode() {
             @Override
             public Object execute(VirtualFrame frame) {
-                Object arg = ForeignAccess.getReceiver(frame);
-                if (arg instanceof RObject) {
-                    RObject obj = (RObject) arg;
-                    NativeMirror mirror = (NativeMirror) obj.getNativeMirror();
-                    if (mirror == null) {
-                        obj.setNativeMirror(mirror = new NativeMirror());
-                    }
-                    return mirror.id;
-                }
-                throw UnsupportedMessageException.raise(Message.AS_POINTER);
+                return asPointer(ForeignAccess.getReceiver(frame));
             }
         });
     }
 
+    public static long asPointer(Object arg) {
+        if (arg instanceof RObject) {
+            RObject obj = (RObject) arg;
+            NativeMirror mirror = (NativeMirror) obj.getNativeMirror();
+            if (mirror == null) {
+                obj.setNativeMirror(mirror = new NativeMirror());
+                // System.out.println(String.format("adding %16x = %s", mirror.id, obj));
+                nativeMirrors.put(mirror.id, new WeakReference<>(obj));
+            }
+            return mirror.id;
+        }
+        throw UnsupportedMessageException.raise(Message.AS_POINTER);
+    }
+
     public static Object lookup(long address) {
-        Object result = nativeMirrors.get(address);
+        WeakReference<RObject> reference = nativeMirrors.get(address);
+        if (reference == null) {
+            CompilerDirectives.transferToInterpreter();
+            throw RInternalError.shouldNotReachHere("unknown/stale native reference");
+        }
+        RObject result = reference.get();
         if (result == null) {
             CompilerDirectives.transferToInterpreter();
             throw RInternalError.shouldNotReachHere("unknown/stale native reference");
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java
index 132f153d20779c4fae436c2d095926e573206952..fee0ee0e9f4f3d1ec84ad3b192ca03f0bdf94f8d 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RArgsValuesAndNames.java
@@ -24,7 +24,7 @@ package com.oracle.truffle.r.runtime.data;
 
 import java.util.Arrays;
 
-import com.oracle.truffle.r.runtime.Arguments;
+import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
 import com.oracle.truffle.r.runtime.ArgumentsSignature;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RType;
@@ -33,7 +33,18 @@ import com.oracle.truffle.r.runtime.gnur.SEXPTYPE;
 /**
  * A simple wrapper class for passing the ... argument through RArguments
  */
-public final class RArgsValuesAndNames extends Arguments<Object> implements RTypedValue {
+public final class RArgsValuesAndNames extends RObject implements RTypedValue {
+
+    /**
+     * Array of arguments; semantics have to be specified by child classes.
+     */
+    @CompilationFinal(dimensions = 1) private final Object[] values;
+
+    /**
+     * Array of arguments; semantics have to be specified by child classes.
+     */
+    private final ArgumentsSignature signature;
+
     /**
      * Default instance for empty "..." ("..." that resolve to contain no expression at runtime).
      * The {@link RMissing#instance} for "...".
@@ -41,7 +52,8 @@ public final class RArgsValuesAndNames extends Arguments<Object> implements RTyp
     public static final RArgsValuesAndNames EMPTY = new RArgsValuesAndNames(new Object[0], ArgumentsSignature.empty(0));
 
     public RArgsValuesAndNames(Object[] values, ArgumentsSignature signature) {
-        super(values, signature);
+        this.values = values;
+        this.signature = signature;
         assert signature != null && signature.getLength() == values.length : Arrays.toString(values) + " " + signature;
     }
 
@@ -62,9 +74,37 @@ public final class RArgsValuesAndNames extends Arguments<Object> implements RTyp
         throw RInternalError.shouldNotReachHere();
     }
 
+    public ArgumentsSignature getSignature() {
+        return signature;
+    }
+
+    public int getLength() {
+        return signature.getLength();
+    }
+
+    public Object[] getArguments() {
+        return values;
+    }
+
+    public Object getArgument(int index) {
+        return values[index];
+    }
+
+    public boolean isEmpty() {
+        return signature.isEmpty();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder str = new StringBuilder().append(getClass().getSimpleName()).append(": ");
+        for (int i = 0; i < values.length; i++) {
+            str.append(i == 0 ? "" : ", ").append(signature.getName(i)).append(" = ").append(values[i]);
+        }
+        return str.toString();
+    }
+
     public RPairList toPairlist() {
         RPairList head = null;
-        ArgumentsSignature signature = getSignature();
         assert signature.getLength() == getLength();
         for (int i = 0; i < getLength(); i++) {
             String name = signature.getName(i);
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java
index d00b8e455b51a5c1f9798159a6c029ea78f64191..40d136a0a76ec2af58870ffec1a884d1d71a0265 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java
@@ -49,7 +49,7 @@ import com.oracle.truffle.r.runtime.nodes.RSyntaxLookup;
  * Denotes an R {@code promise}.
  */
 @ValueType
-public class RPromise implements RTypedValue {
+public class RPromise extends RObject implements RTypedValue {
 
     private static final int DEFAULT_BIT = 0x1;
     private static final int FULL_PROMISE_BIT = 0x2;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java
index f38eb295560a8a1183eab91b43479a9c3580de1e..35b3f1ec87c75f89563972b3406c20e2fe0dc068 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DLL.java
@@ -38,6 +38,7 @@ import com.oracle.truffle.r.runtime.data.RDataFactory;
 import com.oracle.truffle.r.runtime.data.RExternalPtr;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RNull;
+import com.oracle.truffle.r.runtime.data.RObject;
 import com.oracle.truffle.r.runtime.data.RStringVector;
 import com.oracle.truffle.r.runtime.data.RSymbol;
 import com.oracle.truffle.r.runtime.data.RTruffleObject;
@@ -141,7 +142,7 @@ public class DLL {
      * Denotes info in registered native routines. GnuR has "subclasses" for C/Fortran, which is TBD
      * for FastR.
      */
-    public static class DotSymbol implements RTruffleObject {
+    public static class DotSymbol extends RObject implements RTruffleObject {
         public final String name;
         public final SymbolHandle fun;
         public final int numArgs;
@@ -151,6 +152,7 @@ public class DLL {
             this.fun = fun;
             this.numArgs = numArgs;
         }
+
     }
 
     public static class RegisteredNativeSymbol {
@@ -173,7 +175,7 @@ public class DLL {
         }
     }
 
-    public static final class DLLInfo implements RTruffleObject {
+    public static final class DLLInfo extends RObject implements RTruffleObject {
         private static final RStringVector NAMES = RDataFactory.createStringVector(new String[]{"name", "path", "dynamicLookup", "handle", "info"}, RDataFactory.COMPLETE_VECTOR);
         public static final String DLL_INFO_REFERENCE = "DLLInfoReference";
         private static final RStringVector INFO_REFERENCE_CLASS = RDataFactory.createStringVectorFromScalar(DLL_INFO_REFERENCE);