diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_Call.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_Call.java
index eea56a31cdddef365ac83a65508a5d5afdb89735..c83f50b2f29e3f87f63164436393f82af6e1f683 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_Call.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_Call.java
@@ -95,7 +95,7 @@ final class TruffleLLVM_Call implements CallRFFI {
 
                 callbacks = (TruffleObject) context.getEnv().asGuestValue(callbacksArray);
 
-                Node setClbkAddrExecuteNode = Message.createExecute(1).createNode();
+                Node setClbkAddrExecuteNode = Message.EXECUTE.createNode();
                 SymbolHandle setClbkAddrSymbolHandle = new SymbolHandle(context.getEnv().importSymbol("@" + "Rinternals_setCallbacksAddress"));
                 setCallbacksAddress = setClbkAddrSymbolHandle.asTruffleObject();
                 // Initialize the callbacks global variable
@@ -126,7 +126,7 @@ final class TruffleLLVM_Call implements CallRFFI {
         for (INIT_VAR_FUN initVarFun : INIT_VAR_FUN.values()) {
             initVarFun.symbolHandle = new SymbolHandle(context.getEnv().importSymbol("@" + initVarFun.funName));
         }
-        Node executeNode = Message.createExecute(2).createNode();
+        Node executeNode = Message.EXECUTE.createNode();
         RFFIVariables[] variables = RFFIVariables.initialize(context);
         boolean isNullSetting = RContext.getRForeignAccessFactory().setIsNull(false);
         try {
@@ -229,7 +229,7 @@ final class TruffleLLVM_Call implements CallRFFI {
         protected Object invokeCallCached(NativeCallInfo nativeCallInfo, Object[] args,
                         @SuppressWarnings("unused") @Cached("nativeCallInfo") NativeCallInfo cachedNativeCallInfo,
                         @SuppressWarnings("unused") @Cached("argCount(args)") int cachedArgCount,
-                        @Cached("createMessageNode(args)") Node cachedMessageNode,
+                        @Cached("createMessageNode()") Node cachedMessageNode,
                         @Cached("createConvertNodes(cachedArgCount)") ToNativeNode[] convert) {
             return doInvoke(cachedMessageNode, nativeCallInfo, args, convert);
         }
@@ -237,7 +237,7 @@ final class TruffleLLVM_Call implements CallRFFI {
         @Specialization(replaces = "invokeCallCached")
         @TruffleBoundary
         protected Object invokeCallNormal(NativeCallInfo nativeCallInfo, Object[] args) {
-            return doInvoke(Message.createExecute(args.length).createNode(), nativeCallInfo, args, null);
+            return doInvoke(Message.EXECUTE.createNode(), nativeCallInfo, args, null);
         }
 
         @ExplodeLoop
@@ -273,8 +273,8 @@ final class TruffleLLVM_Call implements CallRFFI {
             return args.length;
         }
 
-        public Node createMessageNode(Object[] args) {
-            return Message.createExecute(args.length).createNode();
+        public Node createMessageNode() {
+            return Message.EXECUTE.createNode();
         }
     }
 
@@ -313,7 +313,7 @@ final class TruffleLLVM_Call implements CallRFFI {
     }
 
     public static final class PushCallbacksNode extends Node {
-        @Child private Node setCallbacksNode = Message.createExecute(1).createNode();
+        @Child private Node setCallbacksNode = Message.EXECUTE.createNode();
 
         public void execute(TruffleObject setCallbacksAddress, TruffleObject callbacks) {
             try {
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_NativeDLL.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_NativeDLL.java
index 31b5a53eb62d52197d7627d9bab7896e50feedd1..b045ff2967a297713fe9a32bd6c29976f9130498 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_NativeDLL.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_NativeDLL.java
@@ -45,14 +45,14 @@ import com.oracle.truffle.r.runtime.ffi.interop.NativeCharArray;
  */
 class TruffleLLVM_NativeDLL {
     enum Function {
-        dlopen(3),
-        dlclose(1);
+        dlopen,
+        dlclose;
 
         private final Node executeNode;
         private final String callName;
 
-        Function(int argCount) {
-            executeNode = Message.createExecute(argCount).createNode();
+        Function() {
+            executeNode = Message.EXECUTE.createNode();
             callName = "call_" + name();
         }
     }
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_UpCallsRFFIImpl.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_UpCallsRFFIImpl.java
index cebd2d02c8072d35e1287a1d61705552f0075b26..a7dc6e740a5ede59a4cd9aad56ffe4d230f34788 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_UpCallsRFFIImpl.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_UpCallsRFFIImpl.java
@@ -133,7 +133,7 @@ public class TruffleLLVM_UpCallsRFFIImpl extends JavaUpCallsRFFIImpl {
 
     @Override
     protected Object setSymbol(DLLInfo dllInfo, int nstOrd, Object routines, int index) {
-        Node executeNode = Message.createExecute(4).createNode();
+        Node executeNode = Message.EXECUTE.createNode();
         try {
             return FFIUnwrapNode.unwrap(ForeignAccess.sendExecute(executeNode, setSymbolHandle, dllInfo, nstOrd, routines, index));
         } catch (InteropException ex) {
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_UserRng.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_UserRng.java
index 002ef9b2cc3433ced19872d4c320bddc18bd29e0..e24aa73c0ecf730f81aaa79e21956d2c25029ca7 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_UserRng.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/llvm/TruffleLLVM_UserRng.java
@@ -47,7 +47,7 @@ public class TruffleLLVM_UserRng implements UserRngRFFI {
         protected void init(NativeFunction userFunction, NativeFunction readFunction) {
             if (userFunctionNode == null) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
-                userFunctionNode = Message.createExecute(userFunction.getArgumentCount()).createNode();
+                userFunctionNode = Message.EXECUTE.createNode();
             }
             if (userFunctionTarget == null) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
@@ -56,7 +56,7 @@ public class TruffleLLVM_UserRng implements UserRngRFFI {
             if (readFunction != null) {
                 if (readPointerNode == null) {
                     CompilerDirectives.transferToInterpreterAndInvalidate();
-                    readPointerNode = Message.createExecute(readFunction.getArgumentCount()).createNode();
+                    readPointerNode = Message.EXECUTE.createNode();
                 }
                 if (readPointerTarget == null) {
                     CompilerDirectives.transferToInterpreterAndInvalidate();
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_C.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_C.java
index 818d21ea2956e1d6d9a946668fcf63e3108d26af..8ff484ec8a955f220314786b292b9497e7614378 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_C.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_C.java
@@ -59,7 +59,7 @@ public class TruffleNFI_C implements CRFFI {
 
     static final class NFIFunctionObjectGetter extends FunctionObjectGetter {
 
-        @Child private Node bindNode = Message.createInvoke(1).createNode();
+        @Child private Node bindNode = Message.INVOKE.createNode();
 
         @Override
         @TruffleBoundary
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_Call.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_Call.java
index e13209ce9f47a7eea0cd9060620196a87524d46d..3f0326653719d3ccb1acca3765d4d251c2ce85a4 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_Call.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_Call.java
@@ -59,7 +59,7 @@ public class TruffleNFI_Call implements CallRFFI {
     }
 
     private abstract static class NodeAdapter extends Node {
-        @Child private Node bindNode = Message.createInvoke(1).createNode();
+        @Child private Node bindNode = Message.INVOKE.createNode();
 
         @TruffleBoundary
         protected TruffleObject getFunction(String name, String signature) {
@@ -85,7 +85,7 @@ public class TruffleNFI_Call implements CallRFFI {
                         @Cached("args.length") int cachedArgsLength,
                         @Cached("create(cachedArgsLength)") FFIWrapNode[] ffiWrapNodes,
                         @Cached("create()") FFIUnwrapNode unwrap,
-                        @Cached("createExecute(cachedArgsLength)") Node executeNode,
+                        @Cached("createExecute()") Node executeNode,
                         @Cached("nativeCallInfo.address.asTruffleObject()") TruffleObject cachedAddress,
                         @Cached("getFunction(cachedArgsLength)") TruffleObject cachedFunction) {
             Object result = null;
@@ -109,7 +109,7 @@ public class TruffleNFI_Call implements CallRFFI {
                         @Cached("args.length") int cachedArgsLength,
                         @Cached("create(cachedArgsLength)") FFIWrapNode[] ffiWrapNodes,
                         @Cached("create()") FFIUnwrapNode unwrap,
-                        @Cached("createExecute(cachedArgsLength)") Node executeNode) {
+                        @Cached("createExecute()") Node executeNode) {
             Object result = null;
             Object[] realArgs = new Object[cachedArgsLength + 1];
             boolean isNullSetting = prepareCall(nativeCallInfo.name, args, ffiWrapNodes);
@@ -126,8 +126,8 @@ public class TruffleNFI_Call implements CallRFFI {
             }
         }
 
-        public static Node createExecute(int n) {
-            return Message.createExecute(n).createNode();
+        public static Node createExecute() {
+            return Message.EXECUTE.createNode();
         }
     }
 
@@ -135,8 +135,8 @@ public class TruffleNFI_Call implements CallRFFI {
         private static final String CallVoid1Sig = "(pointer, pointer): void";
         private static final String CallVoid0Sig = "(pointer): void";
 
-        @Child private Node execute0Node = Message.createExecute(0).createNode();
-        @Child private Node execute1Node = Message.createExecute(1).createNode();
+        @Child private Node execute0Node = Message.EXECUTE.createNode();
+        @Child private Node execute1Node = Message.EXECUTE.createNode();
         @Children private final FFIWrapNode[] ffiWrapNodes0 = FFIWrapNode.create(0);
         @Children private final FFIWrapNode[] ffiWrapNodes1 = FFIWrapNode.create(1);
 
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_Context.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_Context.java
index 0033bd5e6c2e9592d05aca8764469aa006aa8558..5e7b679d4107bbe84dd8aa16f1ff3af1ac8877c1 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_Context.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_Context.java
@@ -148,7 +148,7 @@ final class TruffleNFI_Context extends RFFIContext {
             }
             try {
                 TruffleObject symbol = ((TruffleObject) ForeignAccess.sendRead(Message.READ.createNode(), dllInfo, function.getCallName()));
-                TruffleObject target = (TruffleObject) ForeignAccess.sendInvoke(Message.createInvoke(1).createNode(), symbol, "bind", function.getSignature());
+                TruffleObject target = (TruffleObject) ForeignAccess.sendInvoke(Message.INVOKE.createNode(), symbol, "bind", function.getSignature());
                 nativeFunctions.put(function, target);
             } catch (InteropException e) {
                 throw RInternalError.shouldNotReachHere(e);
@@ -166,7 +166,7 @@ final class TruffleNFI_Context extends RFFIContext {
         synchronized (TruffleNFI_Context.class) {
             if (!variablesInitialized) {
                 variablesInitialized = true;
-                Node executeNode = Message.createExecute(2).createNode();
+                Node executeNode = Message.EXECUTE.createNode();
                 RFFIVariables[] variables = RFFIVariables.initialize(context);
                 boolean isNullSetting = RContext.getRForeignAccessFactory().setIsNull(false);
                 try {
@@ -206,8 +206,8 @@ final class TruffleNFI_Context extends RFFIContext {
     private static long initCallbacksAddress() {
         // get the address of the native thread local
         try {
-            Node bind = Message.createInvoke(1).createNode();
-            Node executeNode = Message.createExecute(1).createNode();
+            Node bind = Message.INVOKE.createNode();
+            Node executeNode = Message.EXECUTE.createNode();
             TruffleObject getCallbacksAddressFunction = (TruffleObject) ForeignAccess.sendInvoke(bind, DLL.findSymbol("Rinternals_getCallbacksAddress", null).asTruffleObject(), "bind", "(): sint64");
             return (long) ForeignAccess.sendExecute(executeNode, getCallbacksAddressFunction);
         } catch (InteropException ex) {
@@ -219,8 +219,8 @@ final class TruffleNFI_Context extends RFFIContext {
         if (context.getKind() == ContextKind.SHARE_NOTHING) {
             // create and fill a new callbacks table
             callbacks = UnsafeAdapter.UNSAFE.allocateMemory(Callbacks.values().length * Unsafe.ARRAY_LONG_INDEX_SCALE);
-            Node bind = Message.createInvoke(1).createNode();
-            Node executeNode = Message.createExecute(1).createNode();
+            Node bind = Message.INVOKE.createNode();
+            Node executeNode = Message.EXECUTE.createNode();
             SymbolHandle symbolHandle = DLL.findSymbol("Rinternals_addCallback", null);
             try {
                 Callbacks.createCalls(new TruffleNFI_UpCallsRFFIImpl());
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_UpCallsRFFIImpl.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_UpCallsRFFIImpl.java
index b6b5d10bf4c64f16332947a78c8090659a50b315..70c2794ff89edfa03c7dc8d665ce6ed83d296546 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_UpCallsRFFIImpl.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_UpCallsRFFIImpl.java
@@ -81,7 +81,7 @@ public class TruffleNFI_UpCallsRFFIImpl extends JavaUpCallsRFFIImpl {
     @Override
     @TruffleBoundary
     protected DotSymbol setSymbol(DLLInfo dllInfo, int nstOrd, Object routines, int index) {
-        Node executeNode = Message.createExecute(4).createNode();
+        Node executeNode = Message.EXECUTE.createNode();
         try {
             return (DotSymbol) FFIUnwrapNode.unwrap(
                             ForeignAccess.sendExecute(executeNode, TruffleNFI_Context.getInstance().lookupNativeFunction(NativeFunction.Rdynload_setSymbol), dllInfo, nstOrd, routines, index));
diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_UserRng.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_UserRng.java
index a27358019d54d000b4b20b1d2065f3395993f466..dc0db2bc078c175b518710923f32618f9df5c4db 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_UserRng.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_UserRng.java
@@ -47,7 +47,7 @@ public class TruffleNFI_UserRng implements UserRngRFFI {
         protected void init(NativeFunction userFunction, NativeFunction readFunction) {
             if (userFunctionNode == null) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
-                userFunctionNode = insert(Message.createExecute(userFunction.getArgumentCount()).createNode());
+                userFunctionNode = insert(Message.EXECUTE.createNode());
             }
             if (userFunctionTarget == null) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
@@ -56,7 +56,7 @@ public class TruffleNFI_UserRng implements UserRngRFFI {
             if (readFunction != null) {
                 if (readPointerNode == null) {
                     CompilerDirectives.transferToInterpreterAndInvalidate();
-                    readPointerNode = insert(Message.createExecute(readFunction.getArgumentCount()).createNode());
+                    readPointerNode = insert(Message.EXECUTE.createNode());
                 }
                 if (readPointerTarget == null) {
                     CompilerDirectives.transferToInterpreterAndInvalidate();
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java
index a42a49287a89c8e1ca14ef6dd60da14c6b43ec5b..a6301008fa92219799fcee26690ddc907a886385 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java
@@ -219,7 +219,7 @@ public abstract class Unlist extends RBuiltinNode.Arg3 {
         @Specialization(guards = {"isJavaIterable(obj)", "!isForeignArray(obj, hasSize)"})
         protected int getJavaIterableLength(TruffleObject obj,
                         @Cached("READ.createNode()") Node read,
-                        @Cached("createExecute(0).createNode()") Node execute,
+                        @Cached("EXECUTE.createNode()") Node execute,
                         @SuppressWarnings("unused") @Cached("HAS_SIZE.createNode()") Node hasSize,
                         @Cached("create()") Foreign2R foreign2R) {
             int totalSize = 0;
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java
index 4b86ed3e3efc1b6dabde69845a894dd66f82b343..be3d7ac14de7acb692230d382708859a296b8ea2 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ExtractVectorNode.java
@@ -421,7 +421,7 @@ public abstract class ExtractVectorNode extends RBaseNode {
         private Node getExecuteNode() {
             if (executeNode == null) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
-                executeNode = insert(com.oracle.truffle.api.interop.Message.createExecute(0).createNode());
+                executeNode = insert(com.oracle.truffle.api.interop.Message.EXECUTE.createNode());
             }
             return executeNode;
         }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ReplaceVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ReplaceVectorNode.java
index f9662130c9f33532ecc66412f53b7bda0449e6f1..cec46cc226363c576c1e0c706b86dd04247b9d10 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ReplaceVectorNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/ReplaceVectorNode.java
@@ -323,7 +323,7 @@ public abstract class ReplaceVectorNode extends RBaseNode {
                 }
                 if (executeNode == null) {
                     CompilerDirectives.transferToInterpreterAndInvalidate();
-                    executeNode = insert(com.oracle.truffle.api.interop.Message.createExecute(0).createNode());
+                    executeNode = insert(com.oracle.truffle.api.interop.Message.EXECUTE.createNode());
                 }
                 if (readNode == null) {
                     CompilerDirectives.transferToInterpreterAndInvalidate();
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/ForNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/ForNode.java
index b1e058386ad3dd53b2b2b5bb31666df2036213cd..24440ed48778689dc4aac003e312da3f8369e13f 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/ForNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/ForNode.java
@@ -117,7 +117,7 @@ public abstract class ForNode extends AbstractLoopNode implements RSyntaxNode, R
                     @Cached("createWriteVariable(iteratorName)") WriteVariableNode writeIteratorNode,
                     @Cached("createForIterableLoopNode(iteratorName)") LoopNode l,
                     @Cached("READ.createNode()") Node readNode,
-                    @Cached("createExecute(0).createNode()") Node executeNode) {
+                    @Cached("EXECUTE.createNode()") Node executeNode) {
 
         TruffleObject iterator = getIterator((TruffleObject) range, readNode, executeNode);
         writeIteratorNode.execute(frame, iterator);
@@ -368,7 +368,7 @@ public abstract class ForNode extends AbstractLoopNode implements RSyntaxNode, R
 
             this.readIteratorNode = LocalReadVariableNode.create(iteratorName, true);
 
-            this.executeForeignNode = Message.createExecute(0).createNode();
+            this.executeForeignNode = Message.EXECUTE.createNode();
             this.readForeignNode = Message.READ.createNode();
 
             // pre-initialize the profile so that loop exits to not deoptimize
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/RLengthNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/RLengthNode.java
index 39b77c067c2af5639e74bc9883d563fe43104f66..855da5167ca2e50df81b93e0a4e6d164459e37e2 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/RLengthNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/control/RLengthNode.java
@@ -158,7 +158,7 @@ public abstract class RLengthNode extends RBaseNode {
     @Specialization(guards = "isJavaIterable(object)")
     protected int getJavaIterableSize(TruffleObject object,
                     @Cached("READ.createNode()") Node read,
-                    @Cached("createExecute(0).createNode()") Node execute,
+                    @Cached("EXECUTE.createNode()") Node execute,
                     @Cached("createBinaryProfile()") ConditionProfile profile) {
         try {
             Number sizeByMethod = null;
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
index e505ec8047c8b6b350963f2105973dd63875087f..43ea373e11eaf7328ec776820adca7dc89fd2c26 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
@@ -655,13 +655,13 @@ public abstract class RCallNode extends RCallBaseNode implements RSyntaxNode, RS
 
         public abstract Object execute(TruffleObject function, Object[] args);
 
-        protected static Node createMessageNode(int argsLen) {
-            return Message.createExecute(argsLen).createNode();
+        protected static Node createMessageNode() {
+            return Message.EXECUTE.createNode();
         }
 
         @Specialization(guards = "argumentsArray.length == foreignCallArgCount", limit = "8")
         protected Object doCached(TruffleObject function, Object[] argumentsArray,
-                        @Cached("createMessageNode(argumentsArray.length)") Node messageNode,
+                        @Cached("createMessageNode()") Node messageNode,
                         @Cached("argumentsArray.length") @SuppressWarnings("unused") int foreignCallArgCount) {
             try {
                 return ForeignAccess.sendExecute(messageNode, function, args2Foreign(argumentsArray));
@@ -677,7 +677,7 @@ public abstract class RCallNode extends RCallBaseNode implements RSyntaxNode, RS
         @Specialization(replaces = "doCached")
         @TruffleBoundary
         protected Object doGeneric(TruffleObject function, Object[] argumentsArray) {
-            return doCached(function, argumentsArray, createMessageNode(argumentsArray.length), argumentsArray.length);
+            return doCached(function, argumentsArray, createMessageNode(), argumentsArray.length);
         }
     }
 
@@ -688,13 +688,13 @@ public abstract class RCallNode extends RCallBaseNode implements RSyntaxNode, RS
 
         public abstract Object execute(DeferredFunctionValue function, Object[] args);
 
-        protected static Node createMessageNode(int argsLen) {
-            return Message.createInvoke(argsLen).createNode();
+        protected static Node createMessageNode() {
+            return Message.INVOKE.createNode();
         }
 
         @Specialization(guards = "argumentsArray.length == foreignCallArgCount", limit = "8")
         protected Object doCached(DeferredFunctionValue lhs, Object[] argumentsArray,
-                        @Cached("createMessageNode(argumentsArray.length)") Node messageNode,
+                        @Cached("createMessageNode()") Node messageNode,
                         @Cached("argumentsArray.length") @SuppressWarnings("unused") int foreignCallArgCount) {
             TruffleObject receiver = lhs.getLHSReceiver();
             String member = lhs.getLHSMember();
@@ -710,7 +710,7 @@ public abstract class RCallNode extends RCallBaseNode implements RSyntaxNode, RS
         @Specialization(replaces = "doCached")
         @TruffleBoundary
         protected Object doGeneric(DeferredFunctionValue lhs, Object[] argumentsArray) {
-            return doCached(lhs, argumentsArray, createMessageNode(argumentsArray.length), argumentsArray.length);
+            return doCached(lhs, argumentsArray, createMessageNode(), argumentsArray.length);
         }
     }
 
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
index 175ad4453907e29a87c08e34a793560b90d73f1a..20e4ffb876ab5ef310a21440dc5939ace6e67052 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/PrecedenceNode.java
@@ -262,7 +262,7 @@ public abstract class PrecedenceNode extends RBaseNode {
     protected int doJavaIterable(TruffleObject obj, boolean recursive,
                     @Cached("HAS_SIZE.createNode()") Node hasSize,
                     @Cached("READ.createNode()") Node read,
-                    @Cached("createExecute(0).createNode()") Node execute,
+                    @Cached("EXECUTE.createNode()") Node execute,
                     @Cached("createRecursive()") PrecedenceNode precedenceNode,
                     @Cached("create()") Foreign2R foreign2R) {
         int precedence = -1;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java
index 3efe69b56e1940f2b862392577ecf7a59515672f..393fd3ea883530d7e69d2966daf7d4b7258d8d56 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java
@@ -957,7 +957,7 @@ public final class RContext {
         }
 
         private final Node read = Message.READ.createNode();
-        private final Node execute = Message.createExecute(1).createNode();
+        private final Node execute = Message.EXECUTE.createNode();
 
         @TruffleBoundary
         public String getPrompt() {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DownCallNodeFactory.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DownCallNodeFactory.java
index 0c4ae0ac9a6b07259a48f9b0b4497f0cf79314c9..471d1a6e4ce98593b6aa4228cc15da4a30aefadd 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DownCallNodeFactory.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/DownCallNodeFactory.java
@@ -69,7 +69,7 @@ public abstract class DownCallNodeFactory {
             try {
                 if (message == null) {
                     CompilerDirectives.transferToInterpreterAndInvalidate();
-                    message = insert(Message.createExecute(function.getArgumentCount()).createNode());
+                    message = insert(Message.EXECUTE.createNode());
                 }
                 if (target == null) {
                     CompilerDirectives.transferToInterpreterAndInvalidate();
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/InvokeCNode.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/InvokeCNode.java
index 9654d6020b36693a7389df10e15126057617f903..220aa43e31a96c26f9653acb70b873ad2d413d29 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/InvokeCNode.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/InvokeCNode.java
@@ -81,14 +81,14 @@ public abstract class InvokeCNode extends RBaseNode {
         return functionGetterNode.execute(address, arity);
     }
 
-    public static Node createExecute(int n) {
-        return Message.createExecute(n).createNode();
+    public static Node createExecute() {
+        return Message.EXECUTE.createNode();
     }
 
     @Specialization(guards = {"args.length == cachedArgsLength", "nativeCallInfo.address.asTruffleObject() == cachedAddress"})
     protected void invokeCallCached(@SuppressWarnings("unused") NativeCallInfo nativeCallInfo, Object[] args,
                     @SuppressWarnings("unused") @Cached("args.length") int cachedArgsLength,
-                    @Cached("createExecute(cachedArgsLength)") Node executeNode,
+                    @Cached("createExecute()") Node executeNode,
                     @SuppressWarnings("unused") @Cached("nativeCallInfo.address.asTruffleObject()") TruffleObject cachedAddress,
                     @Cached("getFunction(cachedAddress, cachedArgsLength)") TruffleObject cachedFunction) {
         try {
@@ -101,7 +101,7 @@ public abstract class InvokeCNode extends RBaseNode {
     @Specialization(replaces = "invokeCallCached", limit = "99", guards = "args.length == cachedArgsLength")
     protected void invokeCallCachedLength(NativeCallInfo nativeCallInfo, Object[] args,
                     @Cached("args.length") int cachedArgsLength,
-                    @Cached("createExecute(cachedArgsLength)") Node executeNode) {
+                    @Cached("createExecute()") Node executeNode) {
         try {
             ForeignAccess.sendExecute(executeNode, getFunction(nativeCallInfo.address.asTruffleObject(), cachedArgsLength), args);
         } catch (InteropException ex) {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/VectorRFFIWrapper.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/VectorRFFIWrapper.java
index 7f40f5f89ab0584c9bdac1dd0090d9b7baf875e0..2561d6b77ac747a31d762ff7e39723d9f74612b0 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/VectorRFFIWrapper.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ffi/VectorRFFIWrapper.java
@@ -306,7 +306,7 @@ public final class VectorRFFIWrapper implements TruffleObject {
 
         @Resolve(message = "EXECUTE")
         abstract static class VectorWrapperExecuteNode extends Node {
-            @Child private Node execMsg = Message.createExecute(0).createNode();
+            @Child private Node execMsg = Message.EXECUTE.createNode();
 
             protected Object access(VectorRFFIWrapper receiver, Object[] arguments) {
                 try {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/ForeignArray2R.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/ForeignArray2R.java
index 93b6df62c7595fd18caa3bb0923ad38866cfaa38..70bc27b6922ba135900c3b17aa235bc3dca79e9b 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/ForeignArray2R.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/ForeignArray2R.java
@@ -174,7 +174,7 @@ public abstract class ForeignArray2R extends RBaseNode {
     @Specialization(guards = "isJavaIterable(obj)")
     @TruffleBoundary
     protected ForeignArrayData doJavaIterable(TruffleObject obj, @SuppressWarnings("unused") boolean recursive, ForeignArrayData arrayData, @SuppressWarnings("unused") int depth, boolean onlyInspect,
-                    @Cached("createExecute(0).createNode()") Node execute) {
+                    @Cached("EXECUTE.createNode()") Node execute) {
 
         try {
             return getIterableElements(arrayData == null ? new ForeignArrayData() : arrayData, obj, execute, onlyInspect);
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RFunctionMRTest.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RFunctionMRTest.java
index 6e93b2b5e28c4f15b8a1a5ca491b0cb09a1c0596..79a659d8aa6f904e957618423e3ce870073bb62f 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RFunctionMRTest.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/engine/interop/RFunctionMRTest.java
@@ -54,21 +54,21 @@ public class RFunctionMRTest extends AbstractMRTest {
         assertSingletonVector(true, ForeignAccess.sendExecute(Message.EXECUTE.createNode(), f));
 
         f = create("function(a) {a}");
-        assertSingletonVector("abc", ForeignAccess.sendExecute(Message.createExecute(1).createNode(), f, "abc"));
+        assertSingletonVector("abc", ForeignAccess.sendExecute(Message.EXECUTE.createNode(), f, "abc"));
 
         f = create("function(a) { is.logical(a) }");
-        assertSingletonVector(true, ForeignAccess.sendExecute(Message.createExecute(1).createNode(), f, true));
+        assertSingletonVector(true, ForeignAccess.sendExecute(Message.EXECUTE.createNode(), f, true));
 
         f = create("function(a) { .fastr.interop.asShort(a) }");
-        assertTrue(ForeignAccess.sendExecute(Message.createExecute(1).createNode(), f, 123) instanceof Short);
+        assertTrue(ForeignAccess.sendExecute(Message.EXECUTE.createNode(), f, 123) instanceof Short);
 
         f = create("function(a) { NA }");
-        Object naVectorResult = ForeignAccess.sendExecute(Message.createExecute(1).createNode(), f, true);
+        Object naVectorResult = ForeignAccess.sendExecute(Message.EXECUTE.createNode(), f, true);
         Object naValue = ForeignAccess.sendRead(Message.READ.createNode(), (TruffleObject) naVectorResult, 0);
         assertTrue(ForeignAccess.sendIsNull(Message.IS_NULL.createNode(), (TruffleObject) naValue));
 
         f = create("function(a) { NULL }");
-        Object nullResult = ForeignAccess.sendExecute(Message.createExecute(1).createNode(), f, true);
+        Object nullResult = ForeignAccess.sendExecute(Message.EXECUTE.createNode(), f, true);
         assertTrue(ForeignAccess.sendIsNull(Message.IS_NULL.createNode(), (TruffleObject) nullResult));
     }