diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalCircuitIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalCircuitIntentCompiler.java
index 7a898f3..5e02f3c 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalCircuitIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalCircuitIntentCompiler.java
@@ -393,7 +393,7 @@
         return null;
     }
 
-    private OchPort findAvailableOchPort(ConnectPoint oduPort, OduSignalType ochPortSignalType) {
+    private Optional<OchPort> findAvailableOchPort(ConnectPoint oduPort, OduSignalType ochPortSignalType) {
         // First see if the port mappings are constrained
         ConnectPoint ochCP = staticPort(oduPort);
 
@@ -408,9 +408,9 @@
                             .findAny();
 
             if (isAvailable(intentId.orElse(null))) {
-                return ochPort;
+                return Optional.of(ochPort);
             }
-            return null;
+            return Optional.empty();
         }
 
         // No port constraints, so find any port that works
@@ -438,11 +438,11 @@
                             .findAny();
 
             if (isAvailable(intentId.orElse(null))) {
-                return (OchPort) port;
+                return Optional.of((OchPort) port);
             }
         }
 
-        return null;
+        return Optional.empty();
     }
 
     private Pair<OchPort, OchPort> findPorts(ConnectPoint src, ConnectPoint dst, CltSignalType signalType) {
@@ -451,31 +451,21 @@
             case CLT_1GBE:
             case CLT_10GBE:
                 // First search for OCH ports with OduSignalType of ODU2. If not found - search for those with ODU4
-                Pair<OchPort, OchPort> ochPorts = findPorts(src, dst, OduSignalType.ODU2);
-                if (ochPorts == null) {
-                    ochPorts = findPorts(src, dst, OduSignalType.ODU4);
-                }
-                return ochPorts;
+                return findPorts(src, dst, OduSignalType.ODU2)
+                        .orElse(findPorts(src, dst, OduSignalType.ODU4).orElse(null));
             case CLT_100GBE:
-                return findPorts(src, dst, OduSignalType.ODU4);
+                return findPorts(src, dst, OduSignalType.ODU4).orElse(null);
             case CLT_40GBE:
             default:
                 return null;
         }
     }
 
-    private Pair<OchPort, OchPort> findPorts(ConnectPoint src, ConnectPoint dst, OduSignalType ochPortSignalType) {
-        OchPort srcPort = findAvailableOchPort(src, ochPortSignalType);
-        if (srcPort == null) {
-            return null;
-        }
-
-        OchPort dstPort = findAvailableOchPort(dst, ochPortSignalType);
-        if (dstPort == null) {
-            return null;
-        }
-
-        return Pair.of(srcPort, dstPort);
+    private Optional<Pair<OchPort, OchPort>> findPorts(ConnectPoint src, ConnectPoint dst,
+                                                       OduSignalType ochPortSignalType) {
+        return findAvailableOchPort(src, ochPortSignalType)
+                .flatMap(srcOch ->
+                        findAvailableOchPort(dst, ochPortSignalType).map(dstOch -> Pair.of(srcOch, dstOch)));
     }
 
     /**
