diff --git a/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java b/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
index b8b2a2c..df70dd4 100644
--- a/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
+++ b/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
@@ -54,6 +54,9 @@
 
     private static final int SLEEP_TIME_FOR_DB_DEVICE_INSTALLED = 100; // milliseconds
     private static final int NUMBER_OF_THREAD_FOR_EXECUTOR = 1;
+    private static final int SRC_SWITCH_TIMEOUT_ADJUST_SECOND = 2;
+    private static final int DEFAULT_IDLE_TIMEOUT = 5;
+    private int idleTimeout = DEFAULT_IDLE_TIMEOUT;
 
     private static final ScheduledExecutorService EXECUTOR_SERVICE = Executors.newScheduledThreadPool(NUMBER_OF_THREAD_FOR_EXECUTOR);
 
@@ -172,6 +175,19 @@
 
     @Override
     public void startUp(FloodlightModuleContext context) {
+        Map<String, String> configOptions = context.getConfigParams(this);
+
+        try {
+            if (Integer.parseInt(configOptions.get("idletimeout")) > 0) {
+                idleTimeout = Integer.parseInt(configOptions.get("idletimeout"));
+                log.info("idle_timeout for Forwarding is set to {}.", idleTimeout);
+            } else {
+                log.info("idle_timeout for Forwarding is less than 0. Use default {}.", idleTimeout);
+            }
+        } catch (NumberFormatException e) {
+            log.info("idle_timeout related config options were not set. Use default.");
+        }
+
         packetService.registerPacketListener(this);
 
         topology = topologyService.getTopology();
@@ -358,10 +374,11 @@
             ShortestPathIntent intent = new ShortestPathIntent(intentId,
                     sw.getDpid(), inPort.getNumber(), srcMacAddress.toLong(),
                     destinationDpid, destinationPort, dstMacAddress.toLong());
+            intent.setIdleTimeout(idleTimeout + SRC_SWITCH_TIMEOUT_ADJUST_SECOND);
+            intent.setFirstSwitchIdleTimeout(idleTimeout);
             IntentOperation.Operator operator = IntentOperation.Operator.ADD;
             operations.add(operator, intent);
             pathRuntime.executeIntentOperations(operations);
-
             // Add to waiting lists
             pendingFlows.put(pathspec, new PushedFlow(intentId));
             log.debug("Put a Path {} in the pending flow, intent ID {}", pathspec, intentId);
diff --git a/src/main/java/net/onrc/onos/core/intent/FlowEntry.java b/src/main/java/net/onrc/onos/core/intent/FlowEntry.java
index 526fe5f..bb051e2 100644
--- a/src/main/java/net/onrc/onos/core/intent/FlowEntry.java
+++ b/src/main/java/net/onrc/onos/core/intent/FlowEntry.java
@@ -19,6 +19,8 @@
     protected Match match;
     protected Set<Action> actions;
     protected Operator operator;
+    protected int hardTimeout = 0;
+    protected int idleTimeout = 0;
 
     public FlowEntry(long sw, long srcPort, long dstPort,
                      MACAddress srcMac, MACAddress dstMac,
@@ -28,8 +30,46 @@
         this.actions = new HashSet<Action>();
         this.actions.add(new ForwardAction(dstPort));
         this.operator = operator;
+
     }
 
+    /***
+     * Gets hard timeout value in seconds.
+     *
+     * @return hardTimeout
+     */
+    public int getHardTimeout() {
+        return hardTimeout;
+    }
+
+    /***
+     * Gets idle timeout value in seconds.
+     *
+     * @return idleTimeout
+     */
+    public int getIdleTimeout() {
+        return idleTimeout;
+    }
+
+    /***
+     * Sets hard timeout value in seconds.
+     *
+     * @param hardTimeout
+     */
+    public void setHardTimeout(int hardTimeout) {
+        this.hardTimeout = hardTimeout;
+    }
+
+    /***
+     * Sets idle timeout value in seconds.
+     *
+     * @param idleTimeout
+     */
+    public void setIdleTimeout(int idleTimeout) {
+        this.idleTimeout = idleTimeout;
+    }
+
+    @Override
     public String toString() {
         return match + "->" + actions;
     }
@@ -66,14 +106,18 @@
             default:
                 break;
         }
+        entry.setIdleTimeout(idleTimeout);
+        entry.setHardTimeout(hardTimeout);
         return entry;
     }
 
 
+    @Override
     public int hashCode() {
         return match.hashCode();
     }
 
+    @Override
     public boolean equals(Object o) {
         if (!(o instanceof FlowEntry)) {
             return false;
diff --git a/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java b/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java
index 94f3f36..660cb7c 100644
--- a/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java
+++ b/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java
@@ -14,6 +14,10 @@
     protected long dstPortNumber;
     protected long dstMacAddress;
     protected String pathIntentId = null;
+    protected int idleTimeout;
+    protected int hardTimeout;
+    protected int firstSwitchIdleTimeout;
+    protected int firstSwitchHardTimetout;
 
     /**
      * Default constructor for Kryo deserialization.
@@ -106,6 +110,46 @@
         return pathIntentId;
     }
 
+    @Deprecated
+    public int getIdleTimeout() {
+        return idleTimeout;
+    }
+
+    @Deprecated
+    public int getHardTimeout() {
+        return hardTimeout;
+    }
+
+    @Deprecated
+    public void setIdleTimeout(int idleTimeout) {
+        this.idleTimeout = idleTimeout;
+    }
+
+    @Deprecated
+    public void setHardTimeout(int hardTimeout) {
+        this.hardTimeout = hardTimeout;
+    }
+
+    @Deprecated
+    public int getFirstSwitchIdleTimeout() {
+        return firstSwitchIdleTimeout;
+    }
+
+    @Deprecated
+    public int getFirstSwitchHardTimetout() {
+        return firstSwitchHardTimetout;
+    }
+
+    @Deprecated
+    public void setFirstSwitchIdleTimeout(int firstSwitchIdleTimeout) {
+        this.firstSwitchIdleTimeout = firstSwitchIdleTimeout;
+    }
+
+    @Deprecated
+    public void setFirstSwitchHardTimetout(int firstSwitchHardTimetout) {
+        this.firstSwitchHardTimetout = firstSwitchHardTimetout;
+    }
+
     @Override
     public int hashCode() {
         // TODO: Is this the intended behavior?
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java b/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java
index 087bff8..73a31b8 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PlanCalcRuntime.java
@@ -58,8 +58,9 @@
             PathIntent intent = (PathIntent) i.intent;
             Intent parent = intent.getParentIntent();
             long srcPort, dstPort;
-            long lastDstSw = -1, lastDstPort = -1;
+            long lastDstSw = -1, lastDstPort = -1, firstSrcSw = -1;
             MACAddress srcMac, dstMac;
+            int idleTimeout = 0, hardTimeout = 0, firstSwitchIdleTimeout = 0, firstSwitchHardTimeout = 0;
             if (parent instanceof ShortestPathIntent) {
                 ShortestPathIntent pathIntent = (ShortestPathIntent) parent;
 //              Switch srcSwitch = graph.getSwitch(pathIntent.getSrcSwitchDpid());
@@ -69,8 +70,13 @@
                 dstMac = MACAddress.valueOf(pathIntent.getDstMac());
 //              Switch dstSwitch = graph.getSwitch(pathIntent.getDstSwitchDpid());
                 lastDstSw = pathIntent.getDstSwitchDpid();
+                firstSrcSw = pathIntent.getSrcSwitchDpid();
 //              lastDstPort = dstSwitch.getPort(pathIntent.getDstPortNumber());
                 lastDstPort = pathIntent.getDstPortNumber();
+                idleTimeout = pathIntent.getIdleTimeout();
+                hardTimeout = pathIntent.getHardTimeout();
+                firstSwitchIdleTimeout = pathIntent.getFirstSwitchIdleTimeout();
+                firstSwitchHardTimeout = pathIntent.getFirstSwitchHardTimetout();
             } else {
                 log.warn("Unsupported Intent: {}", parent);
                 continue;
@@ -86,6 +92,13 @@
 //              dstPort = link.getSrcPort();
                 dstPort = linkEvent.getSrc().getNumber();
                 FlowEntry fe = new FlowEntry(sw, srcPort, dstPort, srcMac, dstMac, i.operator);
+                if (sw != firstSrcSw) {
+                    fe.setIdleTimeout(idleTimeout);
+                    fe.setHardTimeout(hardTimeout);
+                } else {
+                    fe.setIdleTimeout(firstSwitchIdleTimeout);
+                    fe.setHardTimeout(firstSwitchHardTimeout);
+                }
                 entries.add(fe);
 //              srcPort = link.getDstPort();
                 srcPort = linkEvent.getDst().getNumber();
@@ -95,6 +108,8 @@
                 long sw = lastDstSw;
                 dstPort = lastDstPort;
                 FlowEntry fe = new FlowEntry(sw, srcPort, dstPort, srcMac, dstMac, i.operator);
+                fe.setIdleTimeout(idleTimeout);
+                fe.setHardTimeout(hardTimeout);
                 entries.add(fe);
             }
             // install flow entries in reverse order
@@ -104,6 +119,18 @@
         return flowEntries;
     }
 
+    // This method is for a testing purpose. Please leave it right now.
+    private List<Set<FlowEntry>> simpleBuildPhases(List<Collection<FlowEntry>> flowEntries) {
+        List<Set<FlowEntry>> plan = new ArrayList<>();
+        Set<FlowEntry> phase = new HashSet<>();
+        for (Collection<FlowEntry> c : flowEntries) {
+            phase.addAll(c);
+        }
+        plan.add(phase);
+
+        return plan;
+    }
+
     private List<Set<FlowEntry>> buildPhases(List<Collection<FlowEntry>> flowEntries) {
         Map<FlowEntry, Integer> map = new HashMap<>();
         List<Set<FlowEntry>> plan = new ArrayList<>();
