diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRContext.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRContext.java
index 1fec8cd3b23c6b2290daafc56f8784015f74b0b5..08dc511069deb09535a9407207f0a7d224cb8414 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRContext.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/fastr/FastRContext.java
@@ -140,16 +140,26 @@ public class FastRContext {
             EvalThread[] threads = new EvalThread[length];
             int[] data = new int[length];
             int[] multiSlotIndices = new int[length];
+
+            // first, create context infos
+            ChildContextInfo[] childContextInfos = new ChildContextInfo[length];
             for (int i = 0; i < length; i++) {
-                ChildContextInfo info = createContextInfo(contextKind);
-                threads[i] = new EvalThread(RContext.getInstance().threads, info, RSource.fromTextInternalInvisible(exprs.getDataAt(i % exprs.getLength()), RSource.Internal.CONTEXT_EVAL),
-                                FastROptions.SpawnUsesPolyglot.getBooleanValue());
-                data[i] = info.getId();
-                multiSlotIndices[i] = info.getMultiSlotInd();
+                childContextInfos[i] = createContextInfo(contextKind);
+                data[i] = childContextInfos[i].getId();
+                multiSlotIndices[i] = childContextInfos[i].getMultiSlotInd();
             }
+
+            // convert shared slots to multi slots
             if (contextKind == ContextKind.SHARE_ALL) {
                 REnvironment.convertSearchpathToMultiSlot(multiSlotIndices);
             }
+
+            // create eval threads which may already set values to shared slots
+            for (int i = 0; i < length; i++) {
+                threads[i] = new EvalThread(RContext.getInstance().threads, childContextInfos[i],
+                                RSource.fromTextInternalInvisible(exprs.getDataAt(i % exprs.getLength()), RSource.Internal.CONTEXT_EVAL),
+                                FastROptions.SpawnUsesPolyglot.getBooleanValue());
+            }
             for (int i = 0; i < length; i++) {
                 threads[i].start();
             }