diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RNode.java
index 588c398aeb00f004e2f9433f5b9035f78e6b9ed5..059e6dade7bae4a05f0b7f2de061d2b525185d39 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2015, 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
@@ -25,6 +25,7 @@ package com.oracle.truffle.r.nodes;
 import com.oracle.truffle.api.CompilerDirectives.*;
 import com.oracle.truffle.api.dsl.*;
 import com.oracle.truffle.api.frame.*;
+import com.oracle.truffle.api.instrument.ProbeNode.*;
 import com.oracle.truffle.r.nodes.instrument.CreateWrapper;
 import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.r.nodes.instrument.*;
@@ -201,4 +202,14 @@ public abstract class RNode extends Node implements RSyntaxNode, RInstrumentable
     public static boolean areSameLength(RAbstractContainer a, RAbstractContainer b) {
         return a.getLength() == b.getLength();
     }
+
+    @Override
+    public WrapperNode createWrapperNode() {
+        return new RNodeWrapper(this);
+    }
+
+    @Override
+    public boolean isInstrumentable() {
+        return true;
+    }
 }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadArgumentNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadArgumentNode.java
index 95cf435633a04ac2621477be1deb1bcb259dc1c4..c0f2262b1e743cc3f7feb5d3c13fb0d4b9f4254b 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadArgumentNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/ReadArgumentNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, 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
@@ -54,7 +54,7 @@ public class ReadArgumentNode extends RNode {
     }
 
     @Override
-    public ProbeNode.WrapperNode createWrapperNode(RNode node) {
-        return new ReadArgumentNodeWrapper((ReadArgumentNode) node);
+    public ProbeNode.WrapperNode createWrapperNode() {
+        return new ReadArgumentNodeWrapper(this);
     }
 }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/WriteVariableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/WriteVariableNode.java
index 27fbd0cb6c8a3a00fc516344e860b82e8ae675eb..926a39b75c1caff9736e872fbe26918d356cc519 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/WriteVariableNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/WriteVariableNode.java
@@ -503,8 +503,8 @@ public abstract class WriteVariableNode extends RNode implements VisibilityContr
     }
 
     @Override
-    public ProbeNode.WrapperNode createWrapperNode(RNode child) {
-        return new WriteVariableNodeWrapper((WriteVariableNode) child);
+    public ProbeNode.WrapperNode createWrapperNode() {
+        return new WriteVariableNodeWrapper(this);
     }
 
 }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java
index 60bcb0b85ff91c61a58a312fc12c9a2d50a1a4c4..712c2d7bf7ba134dc1e9cbe9f628790c166c9eed 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java
@@ -373,8 +373,8 @@ public class CallArgumentsNode extends ArgumentsNode implements UnmatchedArgumen
     }
 
     @Override
-    public ProbeNode.WrapperNode createWrapperNode(RNode node) {
-        return new CallArgumentsNodeWrapper((CallArgumentsNode) node);
+    public ProbeNode.WrapperNode createWrapperNode() {
+        return new CallArgumentsNodeWrapper(this);
     }
 
     protected CallArgumentsNode() {
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RASTProber.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RASTProber.java
index b3be87079ff836c3344863e838ffd585a41ebcd4..0d27cf268f1f8c30f64b5ab98560b130ab9d95d4 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RASTProber.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RASTProber.java
@@ -62,27 +62,24 @@ public final class RASTProber implements NodeVisitor, ASTProber {
 
     @Override
     public boolean visit(Node node) {
-        if (node instanceof RInstrumentableNode) {
-            RInstrumentableNode iNode = (RInstrumentableNode) node;
-            if (iNode.isInstrumentable()) {
-                if (iNode instanceof RCallNode) {
-                    iNode.probe().tagAs(CALL, RASTUtils.findFunctionName(node, false));
-                } else if (iNode instanceof FunctionStatementsNode) {
-                    iNode.probe().tagAs(START_METHOD, getFunctionDefinitionNode((Node) iNode).getUID());
-                } else if (iNode instanceof FunctionBodyNode) {
-                    iNode.probe().tagAs(RSyntaxTag.FUNCTION_BODY, getFunctionDefinitionNode((Node) iNode).getUID());
-                }
-                if (iNode instanceof SequenceNode) {
-                    RNode[] sequence = ((SequenceNode) iNode).getSequence();
-                    for (RNode n : sequence) {
-                        boolean tag = false;
-                        if (n.isSyntax()) {
-                            n.probe().tagAs(STATEMENT, n);
-                            tag = true;
-                        }
-                        if (FastROptions.debugMatches("RASTProber") && tag) {
-                            System.out.printf("Tag %s as STATEMENT: %b%n", n.toString(), tag);
-                        }
+        if (node.isInstrumentable()) {
+            if (node instanceof RCallNode) {
+                node.probe().tagAs(CALL, RASTUtils.findFunctionName(node, false));
+            } else if (node instanceof FunctionStatementsNode) {
+                node.probe().tagAs(START_METHOD, getFunctionDefinitionNode((Node) node).getUID());
+            } else if (node instanceof FunctionBodyNode) {
+                node.probe().tagAs(RSyntaxTag.FUNCTION_BODY, getFunctionDefinitionNode((Node) node).getUID());
+            }
+            if (node instanceof SequenceNode) {
+                RNode[] sequence = ((SequenceNode) node).getSequence();
+                for (RNode n : sequence) {
+                    boolean tag = false;
+                    if (n.isSyntax()) {
+                        n.probe().tagAs(STATEMENT, n);
+                        tag = true;
+                    }
+                    if (FastROptions.debugMatches("RASTProber") && tag) {
+                        System.out.printf("Tag %s as STATEMENT: %b%n", n.toString(), tag);
                     }
                 }
             }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RInstrumentableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RInstrumentableNode.java
index 2929a2c618650addbd100a74d762457b61363ba7..7ccebd572f64a9679044775a6fecfc7938bb8c57 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RInstrumentableNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/instrument/RInstrumentableNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, 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
@@ -22,56 +22,15 @@
  */
 package com.oracle.truffle.r.nodes.instrument;
 
-import com.oracle.truffle.api.instrument.*;
-import com.oracle.truffle.api.instrument.ProbeNode.Instrumentable;
 import com.oracle.truffle.api.instrument.ProbeNode.WrapperNode;
 import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.r.nodes.*;
 
 /**
- * Denotes an {@link RNode} that can be instrumented using the {@link Instrumentable}. By default
- * all {@link RNode} instances are instrumentable.
+ * Some additional support for instrumentable node.
  */
 public interface RInstrumentableNode {
 
-    default boolean isInstrumentable() {
-        return true;
-    }
-
-    default Probe probe() {
-        RNode thisNode = (RNode) this;
-        Node parent = thisNode.getParent();
-
-        if (parent == null) {
-            throw new IllegalStateException("Cannot call probe() on a node without a parent.");
-        }
-
-        if (parent instanceof WrapperNode) {
-            return ((WrapperNode) parent).getProbe();
-        }
-
-        // Create a new wrapper/probe with this node as its child.
-        WrapperNode wrapper = createWrapperNode(thisNode);
-
-        // Connect it to a Probe
-        Probe probe = ProbeNode.insertProbe(wrapper);
-
-        // Replace this node in the AST with the wrapper
-        thisNode.replace((RNode) wrapper);
-        return probe;
-
-    }
-
-    /**
-     * Any AST nodes that are used as exactly typed fields of other nodes, i.e., not just
-     * {@link RNode} must override this method to create an explicit subclass that implements
-     * {@link WrapperNode} and forwards all pertinent behavior to {@code child}. The default
-     * implementation is suitable for all children typed as plain {@link RNode}.
-     */
-    default WrapperNode createWrapperNode(RNode child) {
-        return new RNodeWrapper(child);
-    }
-
     /**
      * Unwrap a (potentially) wrapped node, returning the child. Since an AST may contain wrapper
      * nodes <b>anywhere</b>, this method <b>must</b> be called before casting or checking the type
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java
index 0cd9f5282f735709397f13356e266106ecc59888..07d7a2b5de87ccc371015435da300fb1e2c2ca42 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/ConvertBooleanNode.java
@@ -157,7 +157,7 @@ public abstract class ConvertBooleanNode extends UnaryNode {
     }
 
     @Override
-    public WrapperNode createWrapperNode(RNode node) {
-        return new ConvertBooleanNodeWrapper((ConvertBooleanNode) node);
+    public WrapperNode createWrapperNode() {
+        return new ConvertBooleanNodeWrapper(this);
     }
 }