diff --git a/tv/tuner/1.1/IFilter.hal b/tv/tuner/1.1/IFilter.hal
index 1e94114..1c6c33f 100644
--- a/tv/tuner/1.1/IFilter.hal
+++ b/tv/tuner/1.1/IFilter.hal
@@ -85,23 +85,19 @@
     configureAvStreamType(AvStreamType avStreamType) generates (Result result);
 
     /**
-     * Configure the monitor event.
+     * Configure the filter to monitor specific Scrambling Status.
      *
-     * The event for Scrambling Status should be sent at the following two scenarios:
+     * Scrambling Status should be sent through the filer callback at the following two scenarios:
      *   1. When this method is called, the first detected scrambling status should be sent.
-     *   2. When the Scrambling status transits into different status, event should be sent.
+     *   2. When the filter transits into the monitored statuses configured through this method,
+     *      event should be sent.
      *
-     * The event for IP CID change should be sent at the following two scenarios:
-     *   1. When this method is called, the first detected CID for the IP should be sent.
-     *   2. When the CID is changed to different value for the IP filter, event should be sent.
-     *
-     * @param monitorEventypes the events to monitor. Set corresponding bit of the event to monitor.
-     *                         Reset to stop monitoring.
+     * @param statuses Scrambling Statuses to monitor. Set corresponding bit to monitor. Reset to
+     *        stop monitoring.
      * @return result Result status of the operation.
-     *                SUCCESS if successful,
-     *                INVALID_STATE if configure can't be applied,
-     *                UNKNOWN_ERROR if failed for other reasons.
+     *         SUCCESS if successful,
+     *         INVALID_STATE if configure can't be applied,
+     *         UNKNOWN_ERROR if failed for other reasons.
      */
-    configureMonitorEvent(bitfield<DemuxFilterMonitorEventType> monitorEventTypes)
-            generates (Result result);
+    configureScramblingEvent(bitfield<ScramblingStatus> statuses) generates (Result result);
 };
diff --git a/tv/tuner/1.1/default/Filter.cpp b/tv/tuner/1.1/default/Filter.cpp
index 4fa1746..e766a8a 100644
--- a/tv/tuner/1.1/default/Filter.cpp
+++ b/tv/tuner/1.1/default/Filter.cpp
@@ -250,49 +250,25 @@
     return Result::SUCCESS;
 }
 
-Return<Result> Filter::configureMonitorEvent(uint32_t monitorEventTypes) {
+Return<Result> Filter::configureScramblingEvent(uint32_t statuses) {
     ALOGV("%s", __FUNCTION__);
 
-    DemuxFilterEvent emptyFilterEvent;
-    V1_1::DemuxFilterMonitorEvent monitorEvent;
-    V1_1::DemuxFilterEventExt eventExt;
+    mStatuses = statuses;
+    if (mCallback_1_1 != nullptr) {
+        // Assuming current status is always NOT_SCRAMBLED
+        V1_1::DemuxFilterEventExt filterEventExt;
+        V1_1::DemuxFilterEventExt::Event event;
+        event.scramblingStatus(V1_1::ScramblingStatus::NOT_SCRAMBLED);
+        int size = filterEventExt.events.size();
+        filterEventExt.events.resize(size + 1);
+        filterEventExt.events[size] = event;
+        DemuxFilterEvent emptyFilterEvent;
 
-    uint32_t newScramblingStatus =
-            monitorEventTypes & V1_1::DemuxFilterMonitorEventType::SCRAMBLING_STATUS;
-    uint32_t newIpCid = monitorEventTypes & V1_1::DemuxFilterMonitorEventType::IP_CID_CHANGE;
-
-    // if scrambling status monitoring flipped, record the new state and send msg on enabling
-    if (newScramblingStatus ^ mScramblingStatusMonitored) {
-        mScramblingStatusMonitored = newScramblingStatus;
-        if (mScramblingStatusMonitored) {
-            if (mCallback_1_1 != nullptr) {
-                // Assuming current status is always NOT_SCRAMBLED
-                monitorEvent.scramblingStatus(V1_1::ScramblingStatus::NOT_SCRAMBLED);
-                eventExt.events.resize(1);
-                eventExt.events[0].monitorEvent(monitorEvent);
-                mCallback_1_1->onFilterEvent_1_1(emptyFilterEvent, eventExt);
-            } else {
-                return Result::INVALID_STATE;
-            }
-        }
+        mCallback_1_1->onFilterEvent_1_1(emptyFilterEvent, filterEventExt);
+        mFilterEventExt.events.resize(0);
+    } else {
+        return Result::INVALID_STATE;
     }
-
-    // if ip cid monitoring flipped, record the new state and send msg on enabling
-    if (newIpCid ^ mIpCidMonitored) {
-        mIpCidMonitored = newIpCid;
-        if (mIpCidMonitored) {
-            if (mCallback_1_1 != nullptr) {
-                // Return random cid
-                monitorEvent.cid(1);
-                eventExt.events.resize(1);
-                eventExt.events[0].monitorEvent(monitorEvent);
-                mCallback_1_1->onFilterEvent_1_1(emptyFilterEvent, eventExt);
-            } else {
-                return Result::INVALID_STATE;
-            }
-        }
-    }
-
     return Result::SUCCESS;
 }
 
diff --git a/tv/tuner/1.1/default/Filter.h b/tv/tuner/1.1/default/Filter.h
index 3a4246e..1ebc135 100644
--- a/tv/tuner/1.1/default/Filter.h
+++ b/tv/tuner/1.1/default/Filter.h
@@ -84,7 +84,7 @@
 
     virtual Return<Result> configureAvStreamType(const V1_1::AvStreamType& avStreamType) override;
 
-    virtual Return<Result> configureMonitorEvent(uint32_t monitorEventTypes) override;
+    virtual Return<Result> configureScramblingEvent(uint32_t statuses) override;
 
     /**
      * To create a FilterMQ and its Event Flag.
@@ -238,8 +238,6 @@
 
     bool mConfigured = false;
     int mStartId = 0;
-    uint8_t mScramblingStatusMonitored = 0;
-    uint8_t mIpCidMonitored = 0;
 };
 
 }  // namespace implementation
diff --git a/tv/tuner/1.1/types.hal b/tv/tuner/1.1/types.hal
index 938cb6e..09b87f2 100644
--- a/tv/tuner/1.1/types.hal
+++ b/tv/tuner/1.1/types.hal
@@ -151,42 +151,22 @@
 struct DemuxFilterEventExt {
     safe_union Event {
         /**
-         * No extended filter Event.
+         * No extended record filter Event. This is used by the tsRecord or mmtpRecord filter event
+         * that does not contain the DemuxFilterTs/MmtpRecordEventExt information.
          */
         Monostate noinit;
 
-        /**
-         * Extended TS Record event sent along with @1.0::DemuxFilterEvent::Event::tsRecord.
-         * DemuxFilterEventExt.events[i] is corresponding to @1.0::DemuxFilterEvent.events[i]. If
-         * @1.0::DemuxFilterEvent.events[i] does not have extended event,
-         * DemuxFilterEventExt.events[i] should use Monostate.
-         */
         DemuxFilterTsRecordEventExt tsRecord;
 
-        /**
-         * Extended MMTP Record event sent along with @1.0::DemuxFilterEvent::Event::mmtpRecord.
-         * DemuxFilterEventExt.events[i] is corresponding to @1.0::DemuxFilterEvent.events[i]. If
-         * @1.0::DemuxFilterEvent.events[i] does not have extended event,
-         * DemuxFilterEventExt.events[i] should use Monostate.
-         */
         DemuxFilterMmtpRecordEventExt mmtpRecord;
 
-        /**
-         * Monitor event to notify monitored status change.
-         *
-         * When sending monitorEvent, DemuxFilterEventExt.events should only contain one
-         * monitorEvent. MonitorEvent should be sent with an empty @1.0::DemuxFilterEvent.
-         */
-        DemuxFilterMonitorEvent monitorEvent;
+        ScramblingStatus scramblingStatus;
 
         /**
          * An unique ID to mark the start point of receiving the valid filter events after
          * reconfiguring the filter. It must be sent at least once in the first event after the
          * filter is restarted. 0 is reserved for the newly opened filter's first start, which is
          * optional for HAL to send.
-         *
-         * When sending starId, DemuxFilterEventExt.events should only contain one startId event.
-         * StardId event should be sent with an empty @1.0::DemuxFilterEvent.
          */
         uint32_t startId;
     };
@@ -216,24 +196,6 @@
     SCRAMBLED = 1 << 2,
 };
 
-@export
-enum DemuxFilterMonitorEventType : uint32_t {
-    SCRAMBLING_STATUS = 1 << 0,
-    IP_CID_CHANGE = 1 << 1,
-};
-
-safe_union DemuxFilterMonitorEvent {
-    /**
-     * New scrambling status.
-     */
-    ScramblingStatus scramblingStatus;
-
-    /**
-     * New cid for the IP filter.
-     */
-    uint32_t cid;
-};
-
 typedef FrontendDvbcSpectralInversion FrontendSpectralInversion;
 
 /**
diff --git a/tv/tuner/1.1/vts/functional/FilterTests.cpp b/tv/tuner/1.1/vts/functional/FilterTests.cpp
index d8fad3d..cdf3b69 100644
--- a/tv/tuner/1.1/vts/functional/FilterTests.cpp
+++ b/tv/tuner/1.1/vts/functional/FilterTests.cpp
@@ -40,18 +40,6 @@
     ALOGW("[vts] pass and stop");
 }
 
-void FilterCallback::testFilterIpCidEvent() {
-    android::Mutex::Autolock autoLock(mMsgLock);
-    while (mIpCidEvent < 1) {
-        if (-ETIMEDOUT == mMsgCondition.waitRelative(mMsgLock, WAIT_TIMEOUT)) {
-            EXPECT_TRUE(false) << "ip cid change event does not output within timeout";
-            return;
-        }
-    }
-    mIpCidEvent = 0;
-    ALOGW("[vts] pass and stop");
-}
-
 void FilterCallback::testStartIdAfterReconfigure() {
     android::Mutex::Autolock autoLock(mMsgLock);
     while (!mStartIdReceived) {
@@ -92,17 +80,8 @@
                       eventExt.mmtpRecord().pts, eventExt.mmtpRecord().firstMbInSlice,
                       eventExt.mmtpRecord().mpuSequenceNumber, eventExt.mmtpRecord().tsIndexMask);
                 break;
-            case DemuxFilterEventExt::Event::hidl_discriminator::monitorEvent:
-                switch (eventExt.monitorEvent().getDiscriminator()) {
-                    case DemuxFilterMonitorEvent::hidl_discriminator::scramblingStatus:
-                        mScramblingStatusEvent++;
-                        break;
-                    case DemuxFilterMonitorEvent::hidl_discriminator::cid:
-                        mIpCidEvent++;
-                        break;
-                    default:
-                        break;
-                }
+            case DemuxFilterEventExt::Event::hidl_discriminator::scramblingStatus:
+                mScramblingStatusEvent++;
                 break;
             case DemuxFilterEventExt::Event::hidl_discriminator::startId:
                 ALOGD("[vts] Extended restart filter event, startId=%d", eventExt.startId());
@@ -293,16 +272,15 @@
     return AssertionResult(status == Result::SUCCESS);
 }
 
-AssertionResult FilterTests::configureMonitorEvent(uint64_t filterId, uint32_t monitorEventTypes) {
+AssertionResult FilterTests::configureScramblingEvent(uint64_t filterId, uint32_t statuses) {
     EXPECT_TRUE(mFilters[filterId]) << "Test with getNewlyOpenedFilterId first.";
     Result status;
 
     sp<android::hardware::tv::tuner::V1_1::IFilter> filter_v1_1 =
             android::hardware::tv::tuner::V1_1::IFilter::castFrom(mFilters[filterId]);
     if (filter_v1_1 != NULL) {
-        status = filter_v1_1->configureMonitorEvent(monitorEventTypes);
+        status = filter_v1_1->configureScramblingEvent(statuses);
         mFilterCallbacks[filterId]->testFilterScramblingEvent();
-        mFilterCallbacks[filterId]->testFilterIpCidEvent();
     } else {
         ALOGW("[vts] Can't cast IFilter into v1_1.");
         return failure();
diff --git a/tv/tuner/1.1/vts/functional/FilterTests.h b/tv/tuner/1.1/vts/functional/FilterTests.h
index 6749265..ae57659 100644
--- a/tv/tuner/1.1/vts/functional/FilterTests.h
+++ b/tv/tuner/1.1/vts/functional/FilterTests.h
@@ -56,7 +56,6 @@
 using android::hardware::tv::tuner::V1_0::Result;
 using android::hardware::tv::tuner::V1_1::AvStreamType;
 using android::hardware::tv::tuner::V1_1::DemuxFilterEventExt;
-using android::hardware::tv::tuner::V1_1::DemuxFilterMonitorEvent;
 using android::hardware::tv::tuner::V1_1::IFilterCallback;
 using android::hardware::tv::tuner::V1_1::ITuner;
 
@@ -119,7 +118,6 @@
 
     void testFilterDataOutput();
     void testFilterScramblingEvent();
-    void testFilterIpCidEvent();
     void testStartIdAfterReconfigure();
 
     void readFilterEventData();
@@ -141,7 +139,6 @@
 
     int mPidFilterOutputCount = 0;
     int mScramblingStatusEvent = 0;
-    int mIpCidEvent = 0;
     bool mStartIdReceived = false;
 };
 
@@ -160,7 +157,7 @@
     AssertionResult configFilter(DemuxFilterSettings setting, uint64_t filterId);
     AssertionResult configAvFilterStreamType(AvStreamType type, uint64_t filterId);
     AssertionResult configIpFilterCid(uint32_t ipCid, uint64_t filterId);
-    AssertionResult configureMonitorEvent(uint64_t filterId, uint32_t monitorEventTypes);
+    AssertionResult configureScramblingEvent(uint64_t filterId, uint32_t statuses);
     AssertionResult getFilterMQDescriptor(uint64_t filterId);
     AssertionResult startFilter(uint64_t filterId);
     AssertionResult stopFilter(uint64_t filterId);
diff --git a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp
index e872762..dda8b60 100644
--- a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp
+++ b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp
@@ -46,8 +46,8 @@
     if (filterConf.type.mainType == DemuxFilterMainType::IP) {
         ASSERT_TRUE(mFilterTests.configIpFilterCid(filterConf.ipCid, filterId));
     }
-    if (filterConf.monitorEventTypes > 0) {
-        ASSERT_TRUE(mFilterTests.configureMonitorEvent(filterId, filterConf.monitorEventTypes));
+    if (filterConf.statuses > 0) {
+        ASSERT_TRUE(mFilterTests.configureScramblingEvent(filterId, filterConf.statuses));
     }
     ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId));
     ASSERT_TRUE(mFilterTests.startFilter(filterId));
diff --git a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TestConfigurations.h b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TestConfigurations.h
index beae223..76bf765 100644
--- a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TestConfigurations.h
+++ b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TestConfigurations.h
@@ -96,7 +96,7 @@
     DemuxFilterSettings settings;
     AvStreamType streamType;
     uint32_t ipCid;
-    uint32_t monitorEventTypes;
+    uint32_t statuses;
 
     bool operator<(const FilterConfig& /*c*/) const { return false; }
 };
@@ -188,9 +188,7 @@
     filterArray[TS_VIDEO0].bufferSize = FMQ_SIZE_16M;
     filterArray[TS_VIDEO0].settings.ts().tpid = 256;
     filterArray[TS_VIDEO0].settings.ts().filterSettings.av({.isPassthrough = false});
-    filterArray[TS_VIDEO0].monitorEventTypes =
-            android::hardware::tv::tuner::V1_1::DemuxFilterMonitorEventType::SCRAMBLING_STATUS |
-            android::hardware::tv::tuner::V1_1::DemuxFilterMonitorEventType::IP_CID_CHANGE;
+    filterArray[TS_VIDEO0].statuses = 1;
     filterArray[TS_VIDEO1].type.mainType = DemuxFilterMainType::TS;
     filterArray[TS_VIDEO1].type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
     filterArray[TS_VIDEO1].bufferSize = FMQ_SIZE_16M;
