diff --git a/chpp/test/app_test.cpp b/chpp/test/app_test.cpp
index 248688c..413be33 100644
--- a/chpp/test/app_test.cpp
+++ b/chpp/test/app_test.cpp
@@ -137,26 +137,28 @@
   EXPECT_EQ(result.error, CHPP_APP_ERROR_NONE);
 }
 
-TEST_F(AppTestBase, Timesync) {
-  constexpr uint64_t kMaxRtt = 2 * CHPP_NSEC_PER_MSEC;    // in ms
-  constexpr int64_t kMaxOffset = 1 * CHPP_NSEC_PER_MSEC;  // in ms
+// Disabled because flaky (fixed in U).
+// TEST_F(AppTestBase, Timesync) {
+//   constexpr uint64_t kMaxRtt = 2 * CHPP_NSEC_PER_MSEC;    // in ms
+//   constexpr int64_t kMaxOffset = 1 * CHPP_NSEC_PER_MSEC;  // in ms
 
-  CHPP_LOGI("Starting timesync test...");
+//   CHPP_LOGI("Starting timesync test...");
 
-  std::this_thread::sleep_for(std::chrono::milliseconds(100));
-  EXPECT_TRUE(chppTimesyncMeasureOffset(&mClientAppContext));
-  std::this_thread::sleep_for(std::chrono::milliseconds(100));
+//   std::this_thread::sleep_for(std::chrono::milliseconds(100));
+//   EXPECT_TRUE(chppTimesyncMeasureOffset(&mClientAppContext));
+//   std::this_thread::sleep_for(std::chrono::milliseconds(100));
 
-  EXPECT_EQ(chppTimesyncGetResult(&mClientAppContext)->error,
-            CHPP_APP_ERROR_NONE);
+//   EXPECT_EQ(chppTimesyncGetResult(&mClientAppContext)->error,
+//             CHPP_APP_ERROR_NONE);
 
-  EXPECT_LT(chppTimesyncGetResult(&mClientAppContext)->rttNs, kMaxRtt);
-  EXPECT_NE(chppTimesyncGetResult(&mClientAppContext)->rttNs, 0);
+//   EXPECT_LT(chppTimesyncGetResult(&mClientAppContext)->rttNs, kMaxRtt);
+//   EXPECT_NE(chppTimesyncGetResult(&mClientAppContext)->rttNs, 0);
 
-  EXPECT_LT(chppTimesyncGetResult(&mClientAppContext)->offsetNs, kMaxOffset);
-  EXPECT_GT(chppTimesyncGetResult(&mClientAppContext)->offsetNs, -kMaxOffset);
-  EXPECT_NE(chppTimesyncGetResult(&mClientAppContext)->offsetNs, 0);
-}
+//   EXPECT_LT(chppTimesyncGetResult(&mClientAppContext)->offsetNs, kMaxOffset);
+//   EXPECT_GT(chppTimesyncGetResult(&mClientAppContext)->offsetNs,
+//   -kMaxOffset);
+//   EXPECT_NE(chppTimesyncGetResult(&mClientAppContext)->offsetNs, 0);
+// }
 
 TEST_F(AppTestBase, DiscoveryMatched) {
   constexpr uint64_t kTimeoutMs = 5000;
diff --git a/chpp/test/transport_test.cpp b/chpp/test/transport_test.cpp
index 625cfde..8a412c8 100644
--- a/chpp/test/transport_test.cpp
+++ b/chpp/test/transport_test.cpp
@@ -392,115 +392,119 @@
   }
 }
 
-/**
- * Rx Testing with various length payloads of zeros
- */
-TEST_P(TransportTests, RxPayloadOfZeros) {
-  mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE;
-  size_t len = static_cast<size_t>(GetParam());
-  bool validLen = (len <= CHPP_TRANSPORT_RX_MTU_BYTES);
+// Disabled because flaky (fixed in U).
+// /**
+//  * Rx Testing with various length payloads of zeros
+//  */
+// TEST_P(TransportTests, RxPayloadOfZeros) {
+//   mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE;
+//   size_t len = static_cast<size_t>(GetParam());
+//   bool validLen = (len <= CHPP_TRANSPORT_RX_MTU_BYTES);
 
-  mTransportContext.txStatus.hasPacketsToSend = true;
-  std::thread t1(chppWorkThreadStart, &mTransportContext);
-  WaitForTransport(&mTransportContext);
+//   mTransportContext.txStatus.hasPacketsToSend = true;
+//   std::thread t1(chppWorkThreadStart, &mTransportContext);
+//   WaitForTransport(&mTransportContext);
 
-  if (len <= kMaxChunkSize) {
-    size_t loc = 0;
-    addPreambleToBuf(mBuf, &loc);
-    ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &loc);
+//   if (len <= kMaxChunkSize) {
+//     size_t loc = 0;
+//     addPreambleToBuf(mBuf, &loc);
+//     ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &loc);
 
-    transHeader->length = static_cast<uint16_t>(len);
-    loc += len;
+//     transHeader->length = static_cast<uint16_t>(len);
+//     loc += len;
 
-    addTransportFooterToBuf(mBuf, &loc);
+//     addTransportFooterToBuf(mBuf, &loc);
 
-    // Send header and check for correct state
-    EXPECT_EQ(
-        chppRxDataCb(&mTransportContext, mBuf,
-                     CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader)),
-        !validLen);
+//     // Send header and check for correct state
+//     EXPECT_EQ(
+//         chppRxDataCb(&mTransportContext, mBuf,
+//                      CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader)),
+//         !validLen);
 
-    if (!validLen) {
-      EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
-    } else if (len > 0) {
-      EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PAYLOAD);
-    } else {
-      EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_FOOTER);
-    }
+//     if (!validLen) {
+//       EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
+//     } else if (len > 0) {
+//       EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PAYLOAD);
+//     } else {
+//       EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_FOOTER);
+//     }
 
-    // Correct decoding of packet length
-    EXPECT_EQ(mTransportContext.rxHeader.length, len);
-    EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, 0);
-    EXPECT_EQ(mTransportContext.rxDatagram.length, validLen ? len : 0);
+//     // Correct decoding of packet length
+//     EXPECT_EQ(mTransportContext.rxHeader.length, len);
+//     EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, 0);
+//     EXPECT_EQ(mTransportContext.rxDatagram.length, validLen ? len : 0);
 
-    // Send payload if any and check for correct state
-    if (len > 0) {
-      EXPECT_EQ(
-          chppRxDataCb(
-              &mTransportContext,
-              &mBuf[CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader)],
-              len),
-          !validLen);
-      EXPECT_EQ(mTransportContext.rxStatus.state,
-                validLen ? CHPP_STATE_FOOTER : CHPP_STATE_PREAMBLE);
-    }
+//     // Send payload if any and check for correct state
+//     if (len > 0) {
+//       EXPECT_EQ(
+//           chppRxDataCb(
+//               &mTransportContext,
+//               &mBuf[CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader)],
+//               len),
+//           !validLen);
+//       EXPECT_EQ(mTransportContext.rxStatus.state,
+//                 validLen ? CHPP_STATE_FOOTER : CHPP_STATE_PREAMBLE);
+//     }
 
-    // Should have complete packet payload by now
-    EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, validLen ? len : 0);
+//     // Should have complete packet payload by now
+//     EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, validLen ? len : 0);
 
-    // But no ACK yet
-    EXPECT_EQ(mTransportContext.rxStatus.expectedSeq, transHeader->seq);
+//     // But no ACK yet
+//     EXPECT_EQ(mTransportContext.rxStatus.expectedSeq, transHeader->seq);
 
-    // Send footer
-    EXPECT_TRUE(chppRxDataCb(
-        &mTransportContext,
-        &mBuf[CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) + len],
-        sizeof(ChppTransportFooter)));
+//     // Send footer
+//     EXPECT_TRUE(chppRxDataCb(
+//         &mTransportContext,
+//         &mBuf[CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) + len],
+//         sizeof(ChppTransportFooter)));
 
-    // The next expected packet sequence # should incremented only if the
-    // received packet is payload-bearing.
-    uint8_t nextSeq = transHeader->seq + ((validLen && len > 0) ? 1 : 0);
-    EXPECT_EQ(mTransportContext.rxStatus.expectedSeq, nextSeq);
+//     // The next expected packet sequence # should incremented only if the
+//     // received packet is payload-bearing.
+//     uint8_t nextSeq = transHeader->seq + ((validLen && len > 0) ? 1 : 0);
+//     EXPECT_EQ(mTransportContext.rxStatus.expectedSeq, nextSeq);
 
-    // Check for correct ACK crafting if applicable (i.e. if the received packet
-    // is payload-bearing).
-    if (validLen && len > 0) {
-      // TODO: Remove later as can cause flaky tests
-      // These are expected to change shortly afterwards, as chppTransportDoWork
-      // is run
-      // EXPECT_TRUE(mTransportContext.txStatus.hasPacketsToSend);
-      EXPECT_EQ(mTransportContext.txStatus.packetCodeToSend,
-                CHPP_TRANSPORT_ERROR_NONE);
-      EXPECT_EQ(mTransportContext.txDatagramQueue.pending, 0);
+//     // Check for correct ACK crafting if applicable (i.e. if the received
+//     packet
+//     // is payload-bearing).
+//     if (validLen && len > 0) {
+//       // TODO: Remove later as can cause flaky tests
+//       // These are expected to change shortly afterwards, as
+//       chppTransportDoWork
+//       // is run
+//       // EXPECT_TRUE(mTransportContext.txStatus.hasPacketsToSend);
+//       EXPECT_EQ(mTransportContext.txStatus.packetCodeToSend,
+//                 CHPP_TRANSPORT_ERROR_NONE);
+//       EXPECT_EQ(mTransportContext.txDatagramQueue.pending, 0);
 
-      WaitForTransport(&mTransportContext);
+//       WaitForTransport(&mTransportContext);
 
-      // Check response packet fields
-      struct ChppTransportHeader *txHeader =
-          (struct ChppTransportHeader *)&mTransportContext.pendingTxPacket
-              .payload[CHPP_PREAMBLE_LEN_BYTES];
-      EXPECT_EQ(txHeader->flags, CHPP_TRANSPORT_FLAG_FINISHED_DATAGRAM);
-      EXPECT_EQ(txHeader->packetCode, CHPP_TRANSPORT_ERROR_NONE);
-      EXPECT_EQ(txHeader->ackSeq, nextSeq);
-      EXPECT_EQ(txHeader->length, 0);
+//       // Check response packet fields
+//       struct ChppTransportHeader *txHeader =
+//           (struct ChppTransportHeader *)&mTransportContext.pendingTxPacket
+//               .payload[CHPP_PREAMBLE_LEN_BYTES];
+//       EXPECT_EQ(txHeader->flags, CHPP_TRANSPORT_FLAG_FINISHED_DATAGRAM);
+//       EXPECT_EQ(txHeader->packetCode, CHPP_TRANSPORT_ERROR_NONE);
+//       EXPECT_EQ(txHeader->ackSeq, nextSeq);
+//       EXPECT_EQ(txHeader->length, 0);
 
-      // Check outgoing packet length
-      EXPECT_EQ(mTransportContext.pendingTxPacket.length,
-                CHPP_PREAMBLE_LEN_BYTES + sizeof(struct ChppTransportHeader) +
-                    sizeof(struct ChppTransportFooter));
-    }
+//       // Check outgoing packet length
+//       EXPECT_EQ(mTransportContext.pendingTxPacket.length,
+//                 CHPP_PREAMBLE_LEN_BYTES + sizeof(struct ChppTransportHeader)
+//                 +
+//                     sizeof(struct ChppTransportFooter));
+//     }
 
-    // Check for correct state
-    EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
+//     // Check for correct state
+//     EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
 
-    // Should have reset loc and length for next packet / datagram
-    EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, 0);
-    EXPECT_EQ(mTransportContext.rxDatagram.length, 0);
-  }
+//     // Should have reset loc and length for next packet / datagram
+//     EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, 0);
+//     EXPECT_EQ(mTransportContext.rxDatagram.length, 0);
+//   }
 
-  chppWorkThreadStop(&mTransportContext);
-  t1.join();
-}
+//   chppWorkThreadStop(&mTransportContext);
+//   t1.join();
+// }
 
 /**
  * End of Packet Link Notification during preamble
@@ -921,49 +925,51 @@
                              sizeof(ChppWwanGetCapabilitiesResponse));
 }
 
-/**
- * GNSS service Open and GetCapabilities.
- */
-TEST_F(TransportTests, GnssOpen) {
-  mTransportContext.txStatus.hasPacketsToSend = true;
-  std::thread t1(chppWorkThreadStart, &mTransportContext);
-  WaitForTransport(&mTransportContext);
+// Disabled because flaky (fixed in U).
+// /**
+//  * GNSS service Open and GetCapabilities.
+//  */
+// TEST_F(TransportTests, GnssOpen) {
+//   mTransportContext.txStatus.hasPacketsToSend = true;
+//   std::thread t1(chppWorkThreadStart, &mTransportContext);
+//   WaitForTransport(&mTransportContext);
 
-  uint8_t ackSeq = 1;
-  uint8_t seq = 0;
-  uint8_t handle = CHPP_HANDLE_NEGOTIATED_RANGE_START + 2;
-  uint8_t transactionID = 0;
-  size_t len = 0;
+//   uint8_t ackSeq = 1;
+//   uint8_t seq = 0;
+//   uint8_t handle = CHPP_HANDLE_NEGOTIATED_RANGE_START + 2;
+//   uint8_t transactionID = 0;
+//   size_t len = 0;
 
-  openService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
-              transactionID++, CHPP_GNSS_OPEN);
+//   openService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
+//               transactionID++, CHPP_GNSS_OPEN);
 
-  addPreambleToBuf(mBuf, &len);
+//   addPreambleToBuf(mBuf, &len);
 
-  uint16_t command = CHPP_GNSS_GET_CAPABILITIES;
-  sendCommandToService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
-                       transactionID++, command);
+//   uint16_t command = CHPP_GNSS_GET_CAPABILITIES;
+//   sendCommandToService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
+//                        transactionID++, command);
 
-  size_t responseLoc = sizeof(ChppTestResponse);
+//   size_t responseLoc = sizeof(ChppTestResponse);
 
-  // Cleanup
-  chppWorkThreadStop(&mTransportContext);
-  t1.join();
+//   // Cleanup
+//   chppWorkThreadStop(&mTransportContext);
+//   t1.join();
 
-  // Validate capabilities
-  uint32_t *capabilities =
-      (uint32_t *)&mTransportContext.pendingTxPacket.payload[responseLoc];
-  responseLoc += sizeof(uint32_t);
+//   // Validate capabilities
+//   uint32_t *capabilities =
+//       (uint32_t *)&mTransportContext.pendingTxPacket.payload[responseLoc];
+//   responseLoc += sizeof(uint32_t);
 
-  uint32_t capabilitySet =
-      CHRE_GNSS_CAPABILITIES_LOCATION | CHRE_GNSS_CAPABILITIES_MEASUREMENTS |
-      CHRE_GNSS_CAPABILITIES_GNSS_ENGINE_BASED_PASSIVE_LISTENER;
-  EXPECT_EQ((*capabilities) & ~(capabilitySet), 0);
+//   uint32_t capabilitySet =
+//       CHRE_GNSS_CAPABILITIES_LOCATION | CHRE_GNSS_CAPABILITIES_MEASUREMENTS |
+//       CHRE_GNSS_CAPABILITIES_GNSS_ENGINE_BASED_PASSIVE_LISTENER;
+//   EXPECT_EQ((*capabilities) & ~(capabilitySet), 0);
 
-  // Check total length
-  EXPECT_EQ(responseLoc, CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) +
-                             sizeof(ChppGnssGetCapabilitiesResponse));
-}
+//   // Check total length
+//   EXPECT_EQ(responseLoc, CHPP_PREAMBLE_LEN_BYTES +
+//   sizeof(ChppTransportHeader) +
+//                              sizeof(ChppGnssGetCapabilitiesResponse));
+// }
 
 /**
  * Discovery client.
@@ -1140,15 +1146,16 @@
                          CHPP_MESSAGE_TYPE_SERVICE_NOTIFICATION);
 }
 
-TEST_F(TransportTests, WorkMonitorInvoked) {
-  // Send message to spin work thread so it interacts with the work monitor
-  messageToInvalidHandle(&mTransportContext,
-                         CHPP_MESSAGE_TYPE_SERVICE_NOTIFICATION);
+// Disabled because flaky (fixed in U).
+// TEST_F(TransportTests, WorkMonitorInvoked) {
+//   // Send message to spin work thread so it interacts with the work monitor
+//   messageToInvalidHandle(&mTransportContext,
+//                          CHPP_MESSAGE_TYPE_SERVICE_NOTIFICATION);
 
-  // 1 pre/post call for executing the work and 1 for shutting down the thread.
-  EXPECT_EQ(mTransportContext.workMonitor.numPreProcessCalls, 2);
-  EXPECT_EQ(mTransportContext.workMonitor.numPostProcessCalls, 2);
-}
+//   // 1 pre/post call for executing the work and 1 for shutting down the
+//   thread. EXPECT_EQ(mTransportContext.workMonitor.numPreProcessCalls, 2);
+//   EXPECT_EQ(mTransportContext.workMonitor.numPostProcessCalls, 2);
+// }
 
 INSTANTIATE_TEST_SUITE_P(TransportTestRange, TransportTests,
                          testing::ValuesIn(kChunkSizes));
