diff --git a/hyracks-api/src/main/java/edu/uci/ics/hyracks/api/context/IHyracksTaskContext.java b/hyracks-api/src/main/java/edu/uci/ics/hyracks/api/context/IHyracksTaskContext.java
index 7609951..8584d36 100644
--- a/hyracks-api/src/main/java/edu/uci/ics/hyracks/api/context/IHyracksTaskContext.java
+++ b/hyracks-api/src/main/java/edu/uci/ics/hyracks/api/context/IHyracksTaskContext.java
@@ -14,9 +14,7 @@
  */
 package edu.uci.ics.hyracks.api.context;
 
-import edu.uci.ics.hyracks.api.dataflow.ActivityId;
 import edu.uci.ics.hyracks.api.dataflow.TaskAttemptId;
-import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
 import edu.uci.ics.hyracks.api.io.IWorkspaceFileFactory;
 import edu.uci.ics.hyracks.api.job.profiling.counters.ICounterContext;
 import edu.uci.ics.hyracks.api.resources.IDeallocatableRegistry;
@@ -27,12 +25,4 @@
     public TaskAttemptId getTaskAttemptId();
 
     public ICounterContext getCounterContext();
-
-    public Object lookupGlobalVariable(ActivityId producerActivity, int partition, String varName)
-            throws HyracksDataException;
-
-    public Object lookupLocalVariable(ActivityId producerActivity, int partition, String varName)
-            throws HyracksDataException;
-
-    public void setVariable(String name, Object value) throws HyracksDataException;
 }
\ No newline at end of file
diff --git a/hyracks-api/src/main/java/edu/uci/ics/hyracks/api/workflow/variables/WorkflowVariableDescriptor.java b/hyracks-api/src/main/java/edu/uci/ics/hyracks/api/workflow/variables/WorkflowVariableDescriptor.java
deleted file mode 100644
index b13afe4..0000000
--- a/hyracks-api/src/main/java/edu/uci/ics/hyracks/api/workflow/variables/WorkflowVariableDescriptor.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2009-2010 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- * 
- *     http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package edu.uci.ics.hyracks.api.workflow.variables;
-
-import java.io.Serializable;
-
-import edu.uci.ics.hyracks.api.naming.MultipartName;
-
-public final class WorkflowVariableDescriptor implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private final MultipartName name;
-
-    private final WorkflowVariableValueScope scope;
-
-    public WorkflowVariableDescriptor(MultipartName name, WorkflowVariableValueScope scope) {
-        this.name = name;
-        this.scope = scope;
-    }
-
-    public MultipartName getName() {
-        return name;
-    }
-
-    public WorkflowVariableValueScope getScope() {
-        return scope;
-    }
-}
\ No newline at end of file
diff --git a/hyracks-api/src/main/java/edu/uci/ics/hyracks/api/workflow/variables/WorkflowVariableValueScope.java b/hyracks-api/src/main/java/edu/uci/ics/hyracks/api/workflow/variables/WorkflowVariableValueScope.java
deleted file mode 100644
index 44ed129..0000000
--- a/hyracks-api/src/main/java/edu/uci/ics/hyracks/api/workflow/variables/WorkflowVariableValueScope.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2009-2010 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- * 
- *     http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package edu.uci.ics.hyracks.api.workflow.variables;
-
-public enum WorkflowVariableValueScope {
-    LOCAL,
-    GLOBAL,
-}
\ No newline at end of file
diff --git a/hyracks-control-nc/src/main/java/edu/uci/ics/hyracks/control/nc/Joblet.java b/hyracks-control-nc/src/main/java/edu/uci/ics/hyracks/control/nc/Joblet.java
index 36c31cf..cf6b4ed 100644
--- a/hyracks-control-nc/src/main/java/edu/uci/ics/hyracks/control/nc/Joblet.java
+++ b/hyracks-control-nc/src/main/java/edu/uci/ics/hyracks/control/nc/Joblet.java
@@ -38,7 +38,6 @@
 import edu.uci.ics.hyracks.api.job.JobId;
 import edu.uci.ics.hyracks.api.job.profiling.counters.ICounter;
 import edu.uci.ics.hyracks.api.job.profiling.counters.ICounterContext;
-import edu.uci.ics.hyracks.api.naming.MultipartName;
 import edu.uci.ics.hyracks.api.partitions.PartitionId;
 import edu.uci.ics.hyracks.api.resources.IDeallocatable;
 import edu.uci.ics.hyracks.control.common.job.PartitionRequest;
@@ -69,8 +68,6 @@
 
     private final Map<String, Counter> counterMap;
 
-    private final Map<MultipartName, Object> localVariableMap;
-
     private final DefaultDeallocatableRegistry deallocatableRegistry;
 
     private final IWorkspaceFileFactory fileFactory;
@@ -84,7 +81,6 @@
         taskStateMap = new HashMap<TaskId, ITaskState>();
         taskMap = new HashMap<TaskAttemptId, Task>();
         counterMap = new HashMap<String, Counter>();
-        localVariableMap = new HashMap<MultipartName, Object>();
         deallocatableRegistry = new DefaultDeallocatableRegistry();
         fileFactory = new WorkspaceFileFactory(this, (IOManager) appCtx.getRootContext().getIOManager());
     }
@@ -113,17 +109,6 @@
         return taskMap;
     }
 
-    public synchronized Object lookupLocalVariable(MultipartName name) throws HyracksDataException {
-        if (!localVariableMap.containsKey(name)) {
-            throw new HyracksDataException("Unknown variable: " + name);
-        }
-        return localVariableMap.get(name);
-    }
-
-    public synchronized void setLocalVariable(MultipartName name, Object value) {
-        localVariableMap.put(name, value);
-    }
-
     private final class OperatorEnvironmentImpl implements IOperatorEnvironment {
         private final String nodeId;
 
diff --git a/hyracks-control-nc/src/main/java/edu/uci/ics/hyracks/control/nc/Task.java b/hyracks-control-nc/src/main/java/edu/uci/ics/hyracks/control/nc/Task.java
index 0cb938b..e6529d7 100644
--- a/hyracks-control-nc/src/main/java/edu/uci/ics/hyracks/control/nc/Task.java
+++ b/hyracks-control-nc/src/main/java/edu/uci/ics/hyracks/control/nc/Task.java
@@ -15,7 +15,6 @@
 package edu.uci.ics.hyracks.control.nc;
 
 import java.nio.ByteBuffer;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.Executor;
@@ -26,7 +25,6 @@
 import edu.uci.ics.hyracks.api.comm.IPartitionCollector;
 import edu.uci.ics.hyracks.api.context.IHyracksJobletContext;
 import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
-import edu.uci.ics.hyracks.api.dataflow.ActivityId;
 import edu.uci.ics.hyracks.api.dataflow.IOperatorNodePushable;
 import edu.uci.ics.hyracks.api.dataflow.TaskAttemptId;
 import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
@@ -36,9 +34,7 @@
 import edu.uci.ics.hyracks.api.io.IWorkspaceFileFactory;
 import edu.uci.ics.hyracks.api.job.profiling.counters.ICounter;
 import edu.uci.ics.hyracks.api.job.profiling.counters.ICounterContext;
-import edu.uci.ics.hyracks.api.naming.MultipartName;
 import edu.uci.ics.hyracks.api.resources.IDeallocatable;
-import edu.uci.ics.hyracks.api.workflow.variables.WorkflowVariableDescriptor;
 import edu.uci.ics.hyracks.control.common.job.PartitionState;
 import edu.uci.ics.hyracks.control.common.job.profiling.counters.Counter;
 import edu.uci.ics.hyracks.control.common.job.profiling.om.TaskProfile;
@@ -61,12 +57,6 @@
 
     private final Map<String, Counter> counterMap;
 
-    private final Map<MultipartName, Object> inputGlobalVariables;
-
-    private final Map<MultipartName, Object> outputVariables;
-
-    private final Map<MultipartName, WorkflowVariableDescriptor> outputVariableDescriptorMap;
-
     private IPartitionCollector[] collectors;
 
     private IOperatorNodePushable operator;
@@ -81,13 +71,6 @@
         fileFactory = new WorkspaceFileFactory(this, (IOManager) joblet.getIOManager());
         deallocatableRegistry = new DefaultDeallocatableRegistry();
         counterMap = new HashMap<String, Counter>();
-        //        this.inputGlobalVariables = inputGlobalVariables;
-        inputGlobalVariables = Collections.emptyMap();
-        outputVariables = new HashMap<MultipartName, Object>();
-        outputVariableDescriptorMap = new HashMap<MultipartName, WorkflowVariableDescriptor>();
-        //        for (WorkflowVariableDescriptor wvd : outputVariableDescriptors) {
-        //            outputVariableDescriptorMap.put(wvd.getName(), wvd);
-        //        }
     }
 
     public void setTaskRuntime(IPartitionCollector[] collectors, IOperatorNodePushable operator) {
@@ -125,28 +108,6 @@
         deallocatableRegistry.registerDeallocatable(deallocatable);
     }
 
-    @Override
-    public Object lookupGlobalVariable(ActivityId producerActivity, int partition, String varName)
-            throws HyracksDataException {
-        MultipartName var = new MultipartName(producerActivity, partition, varName);
-        if (!inputGlobalVariables.containsKey(var)) {
-            throw new HyracksDataException("Unknown Variable: " + var);
-        }
-        return inputGlobalVariables.get(var);
-    }
-
-    @Override
-    public Object lookupLocalVariable(ActivityId producerActivity, int partition, String varName)
-            throws HyracksDataException {
-        return joblet.lookupLocalVariable(new MultipartName(producerActivity, partition, varName));
-    }
-
-    @Override
-    public void setVariable(String name, Object value) {
-        outputVariables.put(new MultipartName(taskAttemptId.getTaskId().getActivityId(), taskAttemptId.getTaskId()
-                .getPartition(), name), value);
-    }
-
     public void close() {
         deallocatableRegistry.close();
     }
@@ -229,23 +190,6 @@
             } finally {
                 operator.deinitialize();
             }
-            Map<MultipartName, Object> outputGlobalVariables = new HashMap<MultipartName, Object>();
-            for (Map.Entry<MultipartName, Object> e : outputVariables.entrySet()) {
-                MultipartName varName = e.getKey();
-                WorkflowVariableDescriptor wvd = outputVariableDescriptorMap.get(varName);
-                if (wvd == null) {
-                    throw new HyracksDataException("Unknown variable found: " + varName);
-                }
-                switch (wvd.getScope()) {
-                    case LOCAL:
-                        joblet.setLocalVariable(varName, e.getValue());
-                        break;
-
-                    case GLOBAL:
-                        outputGlobalVariables.put(varName, e.getValue());
-                        break;
-                }
-            }
             joblet.notifyTaskComplete(this);
         } catch (Exception e) {
             e.printStackTrace();
diff --git a/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestTaskContext.java b/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestTaskContext.java
index 83b608f..cbab080 100644
--- a/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestTaskContext.java
+++ b/hyracks-test-support/src/main/java/edu/uci/ics/hyracks/test/support/TestTaskContext.java
@@ -18,7 +18,6 @@
 
 import edu.uci.ics.hyracks.api.context.IHyracksJobletContext;
 import edu.uci.ics.hyracks.api.context.IHyracksTaskContext;
-import edu.uci.ics.hyracks.api.dataflow.ActivityId;
 import edu.uci.ics.hyracks.api.dataflow.TaskAttemptId;
 import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
 import edu.uci.ics.hyracks.api.exceptions.HyracksException;
@@ -89,21 +88,4 @@
     public TaskAttemptId getTaskAttemptId() {
         return taskId;
     }
-
-    @Override
-    public Object lookupGlobalVariable(ActivityId producerActivity, int partition, String varName)
-            throws HyracksDataException {
-        return null;
-    }
-
-    @Override
-    public Object lookupLocalVariable(ActivityId producerActivity, int partition, String varName)
-            throws HyracksDataException {
-        return null;
-    }
-
-    @Override
-    public void setVariable(String name, Object value) throws HyracksDataException {
-
-    }
 }
\ No newline at end of file
