diff --git a/asterix-app/src/main/java/edu/uci/ics/asterix/file/FeedUtil.java b/asterix-app/src/main/java/edu/uci/ics/asterix/file/FeedUtil.java
index c0d6005..c809295 100644
--- a/asterix-app/src/main/java/edu/uci/ics/asterix/file/FeedUtil.java
+++ b/asterix-app/src/main/java/edu/uci/ics/asterix/file/FeedUtil.java
@@ -32,6 +32,7 @@
 import edu.uci.ics.hyracks.api.dataflow.IOperatorDescriptor;
 import edu.uci.ics.hyracks.api.dataflow.OperatorDescriptorId;
 import edu.uci.ics.hyracks.api.job.JobSpecification;
+import edu.uci.ics.hyracks.dataflow.std.connectors.OneToOneConnectorDescriptor;
 
 public class FeedUtil {
 
@@ -42,6 +43,68 @@
                 .getActivityType().equals(FeedActivityType.FEED_FAILURE)));
     }
 
+    public static JobSpecification alterJobSpecificationForFeed2(JobSpecification spec) {
+        JobSpecification altered = null;
+        altered = new JobSpecification();
+        Map<OperatorDescriptorId, IOperatorDescriptor> operatorMap = spec.getOperatorMap();
+        Map<OperatorDescriptorId, IOperatorDescriptor> opIdToOp = new HashMap<OperatorDescriptorId, IOperatorDescriptor>();
+        Map<IOperatorDescriptor, IOperatorDescriptor> opToOp = new HashMap<IOperatorDescriptor, IOperatorDescriptor>();
+        Map<OperatorDescriptorId, OperatorDescriptorId> opIdToOpId = new HashMap<OperatorDescriptorId, OperatorDescriptorId>();
+
+        List<IOperatorDescriptor> opToReplace = new ArrayList<IOperatorDescriptor>();
+        Iterator<OperatorDescriptorId> opIt = operatorMap.keySet().iterator();
+
+        while (opIt.hasNext()) {
+            OperatorDescriptorId opId = opIt.next();
+            IOperatorDescriptor op = operatorMap.get(opId);
+            if (op instanceof FeedIntakeOperatorDescriptor) {
+                opIdToOp.put(opId, op);
+                opToOp.put(op, op);
+                opIdToOpId.put(op.getOperatorId(), op.getOperatorId());
+                operatorMap.put(opId, op);
+            } else if (op instanceof AlgebricksMetaOperatorDescriptor) {
+                AlgebricksMetaOperatorDescriptor mop = (AlgebricksMetaOperatorDescriptor) op;
+                IPushRuntimeFactory[] runtimeFactories = mop.getPipeline().getRuntimeFactories();
+                boolean added = false;
+                for (IPushRuntimeFactory rf : runtimeFactories) {
+                    if (rf instanceof CommitRuntimeFactory) {
+                        opIdToOp.put(opId, op);
+                        opToOp.put(op, op);
+                        opIdToOpId.put(op.getOperatorId(), op.getOperatorId());
+                        operatorMap.put(opId, op);
+                        added = true;
+                    }
+                }
+                if (!added) {
+                    opToReplace.add(op);
+                    IOperatorDescriptor newOp = new FeedMetaOperatorDescriptor(altered, op);
+                }
+            } else {
+                opToReplace.add(op);
+                IOperatorDescriptor newOp = new FeedMetaOperatorDescriptor(altered, op);
+            }
+        }
+
+        // operators that were not changed
+        for (OperatorDescriptorId opId : spec.getOperatorMap().keySet()) {
+            if (opIdToOp.get(opId) != null) {
+                operatorMap.put(opId, opIdToOp.get(opId));
+            }
+        }
+
+        for (IOperatorDescriptor op : opToReplace) {
+            spec.getOperatorMap().remove(op.getOperatorId());
+        }
+
+        for (IOperatorDescriptor op : opToReplace) {
+            IOperatorDescriptor newOp = new FeedMetaOperatorDescriptor(spec, op);
+            opIdToOp.put(op.getOperatorId(), newOp);
+            opToOp.put(op, newOp);
+            opIdToOpId.put(op.getOperatorId(), newOp.getOperatorId());
+        }
+
+    }
+
     public static void alterJobSpecificationForFeed(JobSpecification spec) {
 
         Map<OperatorDescriptorId, IOperatorDescriptor> operatorMap = spec.getOperatorMap();
@@ -50,8 +113,6 @@
         Map<OperatorDescriptorId, OperatorDescriptorId> opIdToOpId = new HashMap<OperatorDescriptorId, OperatorDescriptorId>();
 
         Iterator<OperatorDescriptorId> opIt = operatorMap.keySet().iterator();
-        IOperatorDescriptor ingestOp = null;
-        OperatorDescriptorId ingestOpId = null;
         List<IOperatorDescriptor> opToReplace = new ArrayList<IOperatorDescriptor>();
         while (opIt.hasNext()) {
             OperatorDescriptorId opId = opIt.next();
@@ -98,6 +159,19 @@
             opIdToOpId.put(op.getOperatorId(), newOp.getOperatorId());
         }
 
+        // connectors
+        
+        for(Map.Entry<ConnectorDescriptorId, IConnectorDescriptor> entry : spec.getConnectorMap().entrySet()){
+            ConnectorDescriptorId cid= entry.getKey();
+            IConnectorDescriptor cdesc = entry.getValue();
+            if(cdesc instanceof OneToOneConnectorDescriptor){
+                ((OneToOneConnectorDescriptor)cdesc).
+            }
+         }
+        
+        
+        
+        
         // connector operator Map
         for (ConnectorDescriptorId cid : spec.getConnectorOperatorMap().keySet()) {
             Pair<Pair<IOperatorDescriptor, Integer>, Pair<IOperatorDescriptor, Integer>> p = spec
@@ -127,6 +201,18 @@
         for (OperatorDescriptorId opId : keysForRemoval) {
             spec.getOperatorOutputMap().remove(opId);
         }
+        
+        for(OperatorDescriptorId opId : keysForAddition.keySet()){
+            List<IConnectorDescriptor> origConnectors = keysForAddition.get(opId);
+            List<IConnectorDescriptor> newConnectors = new ArrayList<IConnectorDescriptor>();
+            for(IConnectorDescriptor  connDesc : origConnectors){
+                newConnectors.add(e)
+            }
+                     
+        }
+        
+        
+       
         spec.getOperatorOutputMap().putAll(keysForAddition);
 
         // operator input Map
