diff --git a/src/main/java/net/onrc/onos/api/flowmanager/SingleSrcTreeFlow.java b/src/main/java/net/onrc/onos/api/flowmanager/SingleSrcTreeFlow.java
index 5b26a04..3e70f4b 100644
--- a/src/main/java/net/onrc/onos/api/flowmanager/SingleSrcTreeFlow.java
+++ b/src/main/java/net/onrc/onos/api/flowmanager/SingleSrcTreeFlow.java
@@ -12,9 +12,10 @@
 import net.onrc.onos.core.matchaction.action.OutputAction;
 import net.onrc.onos.core.matchaction.match.PacketMatch;
 import net.onrc.onos.core.util.Dpid;
-import net.onrc.onos.core.util.Pair;
 import net.onrc.onos.core.util.SwitchPort;
 
+import org.apache.commons.lang3.tuple.Pair;
+
 /**
  * A Flow object expressing the point-to-multipoints tree flow for the packet
  * layer.
diff --git a/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java b/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java
index a02f0d5..c40eac0 100644
--- a/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java
+++ b/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java
@@ -25,8 +25,8 @@
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.floodlightcontroller.threadpool.IThreadPoolService;
 import net.onrc.onos.core.intent.FlowEntry;
-import net.onrc.onos.core.util.Pair;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.projectfloodlight.openflow.protocol.OFBarrierReply;
 import org.projectfloodlight.openflow.protocol.OFBarrierRequest;
 import org.projectfloodlight.openflow.protocol.OFFactory;
@@ -85,8 +85,7 @@
         boolean toBeDeleted = false;
 
         SwitchQueue() {
-            rawQueues = new ArrayList<Queue<SwitchQueueEntry>>(
-                    MsgPriority.values().length);
+            rawQueues = new ArrayList<>(MsgPriority.values().length);
             for (int i = 0; i < MsgPriority.values().length; ++i) {
                 rawQueues.add(i, new ArrayDeque<SwitchQueueEntry>());
             }
@@ -410,7 +409,7 @@
      * Begin processing queue.
      */
     public void start() {
-        threadMap = new HashMap<Long, FlowPusherThread>();
+        threadMap = new HashMap<>();
         for (long i = 0; i < numberThread; ++i) {
             FlowPusherThread thread = new FlowPusherThread();
 
@@ -572,7 +571,7 @@
             Collection<Pair<IOFSwitch, FlowEntry>> entries, MsgPriority priority) {
 
         for (Pair<IOFSwitch, FlowEntry> entry : entries) {
-            add(entry.getFirst(), entry.getSecond(), priority);
+            add(entry.getLeft(), entry.getRight(), priority);
         }
     }
 
@@ -583,10 +582,9 @@
 
     @Override
     public void pushFlowEntry(IOFSwitch sw, FlowEntry flowEntry, MsgPriority priority) {
-        Collection<Pair<IOFSwitch, FlowEntry>> entries =
-                new LinkedList<Pair<IOFSwitch, FlowEntry>>();
+        Collection<Pair<IOFSwitch, FlowEntry>> entries = new LinkedList<>();
 
-        entries.add(new Pair<IOFSwitch, FlowEntry>(sw, flowEntry));
+        entries.add(Pair.of(sw, flowEntry));
         pushFlowEntries(entries, priority);
     }
 
diff --git a/src/main/java/net/onrc/onos/core/flowprogrammer/IFlowPusherService.java b/src/main/java/net/onrc/onos/core/flowprogrammer/IFlowPusherService.java
index e94119a..25162aa 100644
--- a/src/main/java/net/onrc/onos/core/flowprogrammer/IFlowPusherService.java
+++ b/src/main/java/net/onrc/onos/core/flowprogrammer/IFlowPusherService.java
@@ -6,8 +6,8 @@
 import net.floodlightcontroller.core.internal.OFMessageFuture;
 import net.floodlightcontroller.core.module.IFloodlightService;
 import net.onrc.onos.core.intent.FlowEntry;
-import net.onrc.onos.core.util.Pair;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.projectfloodlight.openflow.protocol.OFBarrierReply;
 import org.projectfloodlight.openflow.protocol.OFMessage;
 
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallRuntime.java b/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallRuntime.java
index 8a444d7..d9a235b 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallRuntime.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/PlanInstallRuntime.java
@@ -14,8 +14,8 @@
 import net.floodlightcontroller.core.internal.OFMessageFuture;
 import net.onrc.onos.core.flowprogrammer.IFlowPusherService;
 import net.onrc.onos.core.intent.FlowEntry;
-import net.onrc.onos.core.util.Pair;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.projectfloodlight.openflow.protocol.OFBarrierReply;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -182,7 +182,7 @@
                     log.debug("Skipping flow entry: {}", entry);
                     continue;
                 }
-                entries.add(new Pair<>(sw, entry));
+                entries.add(Pair.of(sw, entry));
                 modifiedSwitches.add(sw);
                 FlowModCount.countFlowEntry(sw, entry);
             }
@@ -197,11 +197,11 @@
             // wait for confirmation messages before proceeding
             List<Pair<IOFSwitch, OFMessageFuture<OFBarrierReply>>> barriers = new ArrayList<>();
             for (IOFSwitch sw : modifiedSwitches) {
-                barriers.add(new Pair<>(sw, pusher.barrierAsync(sw)));
+                barriers.add(Pair.of(sw, pusher.barrierAsync(sw)));
             }
             for (Pair<IOFSwitch, OFMessageFuture<OFBarrierReply>> pair : barriers) {
-                IOFSwitch sw = pair.getFirst();
-                OFMessageFuture<OFBarrierReply> future = pair.getSecond();
+                IOFSwitch sw = pair.getLeft();
+                OFMessageFuture<OFBarrierReply> future = pair.getRight();
                 try {
                     future.get();
                 } catch (InterruptedException | ExecutionException e) {
diff --git a/src/main/java/net/onrc/onos/core/util/Pair.java b/src/main/java/net/onrc/onos/core/util/Pair.java
deleted file mode 100644
index 66b60b8..0000000
--- a/src/main/java/net/onrc/onos/core/util/Pair.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package net.onrc.onos.core.util;
-
-import java.util.Objects;
-
-/**
- * A generic class representing a pair of two values.
- *
- * If a user supplies immutable objects, the pair become immutable.
- * Otherwise, the pair become mutable.
- *
- * @param <F> the type of the first value
- * @param <S> the type type of the second value
- */
-public final class Pair<F, S> {
-    private final F first;        // The first value in the pair
-    private final S second;       // The second value in the pair
-
-    /**
-     * Constructor for a pair of two values.
-     *
-     * @param first  the first value in the pair.
-     * @param second the second value in the pair.
-     */
-    public Pair(F first, S second) {
-        this.first = first;
-        this.second = second;
-    }
-
-    /**
-     * Get the first value of the Pair.
-     *
-     * @return the first value of the Pair.
-     */
-    public F getFirst() {
-        return first;
-    }
-
-    /**
-     * Get the second value of the Pair.
-     *
-     * @return the second value of the Pair.
-     */
-    public S getSecond() {
-        return second;
-    }
-
-    @Override
-    public String toString() {
-        return String.format("<%s, %s>", first, second);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (o == this) {
-            return true;
-        }
-
-        if (!(o instanceof Pair)) {
-            return false;
-        }
-
-        Pair<?, ?> that = (Pair<?, ?>) o;
-        return Objects.equals(this.first, that.first)
-                && Objects.equals(this.second, that.second);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(this.first, this.second);
-    }
-}
diff --git a/src/test/java/net/onrc/onos/core/newintent/SingleSrcTreeFlowIntentInstallerTest.java b/src/test/java/net/onrc/onos/core/newintent/SingleSrcTreeFlowIntentInstallerTest.java
index 755fa87..a874ea4 100644
--- a/src/test/java/net/onrc/onos/core/newintent/SingleSrcTreeFlowIntentInstallerTest.java
+++ b/src/test/java/net/onrc/onos/core/newintent/SingleSrcTreeFlowIntentInstallerTest.java
@@ -10,8 +10,8 @@
 import net.onrc.onos.core.matchaction.action.OutputAction;
 import net.onrc.onos.core.matchaction.match.PacketMatchBuilder;
 import net.onrc.onos.core.util.Dpid;
-import net.onrc.onos.core.util.Pair;
 import net.onrc.onos.core.util.SwitchPort;
+import org.apache.commons.lang3.tuple.Pair;
 import org.junit.Test;
 
 import java.util.HashSet;
@@ -90,8 +90,8 @@
         tree.add(new FlowLink(port13, port31));
 
         Set<Pair<Dpid, OutputAction>> actions = new HashSet<>();
-        actions.add(new Pair<>(egress1.getDpid(), new OutputAction(egress1.getPortNumber())));
-        actions.add(new Pair<>(egress2.getDpid(), new OutputAction(egress2.getPortNumber())));
+        actions.add(Pair.of(egress1.getDpid(), new OutputAction(egress1.getPortNumber())));
+        actions.add(Pair.of(egress2.getDpid(), new OutputAction(egress2.getPortNumber())));
 
         return new SingleSrcTreeFlow(
                 flowId,
diff --git a/src/test/java/net/onrc/onos/core/newintent/SingleSrcTreeFlowIntentTest.java b/src/test/java/net/onrc/onos/core/newintent/SingleSrcTreeFlowIntentTest.java
index cfd9391..a9a3dbf 100644
--- a/src/test/java/net/onrc/onos/core/newintent/SingleSrcTreeFlowIntentTest.java
+++ b/src/test/java/net/onrc/onos/core/newintent/SingleSrcTreeFlowIntentTest.java
@@ -10,10 +10,11 @@
 import net.onrc.onos.core.matchaction.match.PacketMatch;
 import net.onrc.onos.core.matchaction.match.PacketMatchBuilder;
 import net.onrc.onos.core.util.Dpid;
-import net.onrc.onos.core.util.Pair;
 import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.SwitchPort;
 
+import org.apache.commons.lang3.tuple.Pair;
+
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
@@ -41,8 +42,8 @@
     @Override
     protected SingleSrcTreeFlowIntent createOne() {
         Set<Pair<Dpid, OutputAction>> actions = new HashSet<>(Arrays.asList(
-                new Pair<>(dpid2, action2),
-                new Pair<>(dpid3, action3)
+                Pair.of(dpid2, action2),
+                Pair.of(dpid3, action3)
         ));
         SingleSrcTreeFlow tree = new SingleSrcTreeFlow(flowId1, match,
                 new SwitchPort(dpid1, port3), createTree(), actions
@@ -53,8 +54,8 @@
     @Override
     protected SingleSrcTreeFlowIntent createAnother() {
         Set<Pair<Dpid, OutputAction>> actions = new HashSet<>(Arrays.asList(
-                new Pair<>(dpid1, action1),
-                new Pair<>(dpid3, action3)
+                Pair.of(dpid1, action1),
+                Pair.of(dpid3, action3)
         ));
         SingleSrcTreeFlow tree = new SingleSrcTreeFlow(flowId2, match,
                 new SwitchPort(dpid2, port3), createTree(), actions
diff --git a/src/test/java/net/onrc/onos/core/util/PairTest.java b/src/test/java/net/onrc/onos/core/util/PairTest.java
deleted file mode 100644
index 954b01f..0000000
--- a/src/test/java/net/onrc/onos/core/util/PairTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package net.onrc.onos.core.util;
-
-import org.junit.Test;
-
-import static net.onrc.onos.core.util.ImmutableClassChecker.assertThatClassIsImmutable;
-
-/**
- * PairTest class tests the immutability of Pair class when immutable objects are supplied.
- */
-public class PairTest {
-    /**
-     * Tests Pair class satisfies the guideline for immutable objects
-     * by using ImmutableClassChecker framework.
-     */
-    @Test
-    public void pairClassFollowsGuidelineForImmutableObject() {
-        assertThatClassIsImmutable(Pair.class);
-    }
-}
