Merge changes from topic "tuner_aidl_fw"

* changes:
  Migrate native tuner to new AIDL HAL.
  Put TunerFrontendInfo inside of TRM.
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 716933a..2c2e811 100755
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -6020,6 +6020,7 @@
     method public static int getTunerVersion();
     field public static final int TUNER_VERSION_1_0 = 65536; // 0x10000
     field public static final int TUNER_VERSION_1_1 = 65537; // 0x10001
+    field public static final int TUNER_VERSION_2_0 = 131072; // 0x20000
     field public static final int TUNER_VERSION_UNKNOWN = 0; // 0x0
   }
 
diff --git a/media/java/android/media/tv/tuner/TunerVersionChecker.java b/media/java/android/media/tv/tuner/TunerVersionChecker.java
index b40ba1e..3e13bed 100644
--- a/media/java/android/media/tv/tuner/TunerVersionChecker.java
+++ b/media/java/android/media/tv/tuner/TunerVersionChecker.java
@@ -38,8 +38,9 @@
     private TunerVersionChecker() {}
 
     /** @hide */
-    @IntDef(prefix = "TUNER_VERSION_", value = {TUNER_VERSION_UNKNOWN, TUNER_VERSION_1_0,
-                                                TUNER_VERSION_1_1})
+    @IntDef(prefix = "TUNER_VERSION_",
+            value = {TUNER_VERSION_UNKNOWN, TUNER_VERSION_1_0, TUNER_VERSION_1_1,
+                    TUNER_VERSION_2_0})
     @Retention(RetentionPolicy.SOURCE)
     public @interface TunerVersion {}
     /**
@@ -54,6 +55,10 @@
      * Tuner version 1.1.
      */
     public static final int TUNER_VERSION_1_1 = ((1 << 16) | 1);
+    /**
+     * Tuner version 2.0.
+     */
+    public static final int TUNER_VERSION_2_0 = (2 << 16);
 
     /**
      * Get the current running Tuner version.
diff --git a/media/java/android/media/tv/tunerresourcemanager/Android.bp b/media/java/android/media/tv/tunerresourcemanager/Android.bp
index c904ca2..65e7e10 100644
--- a/media/java/android/media/tv/tunerresourcemanager/Android.bp
+++ b/media/java/android/media/tv/tunerresourcemanager/Android.bp
@@ -24,7 +24,7 @@
             enabled: true,
         },
         cpp: {
-            enabled: true,
+            enabled: false,
         },
         ndk: {
             enabled: true,
@@ -33,5 +33,4 @@
     srcs: [
         ":framework-media-tv-tunerresourcemanager-sources-aidl",
     ],
-    imports: ["tv_tuner_frontend_info_aidl_interface"],
 }
diff --git a/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java b/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java
index e399fbd..6f7adbc 100644
--- a/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java
+++ b/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java
@@ -24,7 +24,6 @@
 import android.annotation.SystemService;
 import android.content.Context;
 import android.content.pm.PackageManager;
-import android.media.tv.tuner.TunerFrontendInfo;
 import android.os.Binder;
 import android.os.RemoteException;
 import android.util.Log;
diff --git a/media/java/android/media/tv/tunerresourcemanager/aidl/android/media/tv/tunerresourcemanager/ITunerResourceManager.aidl b/media/java/android/media/tv/tunerresourcemanager/aidl/android/media/tv/tunerresourcemanager/ITunerResourceManager.aidl
index 483d972..a1f6687 100644
--- a/media/java/android/media/tv/tunerresourcemanager/aidl/android/media/tv/tunerresourcemanager/ITunerResourceManager.aidl
+++ b/media/java/android/media/tv/tunerresourcemanager/aidl/android/media/tv/tunerresourcemanager/ITunerResourceManager.aidl
@@ -16,13 +16,13 @@
 
 package android.media.tv.tunerresourcemanager;
 
-import android.media.tv.tuner.TunerFrontendInfo;
 import android.media.tv.tunerresourcemanager.CasSessionRequest;
 import android.media.tv.tunerresourcemanager.IResourcesReclaimListener;
 import android.media.tv.tunerresourcemanager.ResourceClientProfile;
 import android.media.tv.tunerresourcemanager.TunerCiCamRequest;
 import android.media.tv.tunerresourcemanager.TunerDemuxRequest;
 import android.media.tv.tunerresourcemanager.TunerDescramblerRequest;
+import android.media.tv.tunerresourcemanager.TunerFrontendInfo;
 import android.media.tv.tunerresourcemanager.TunerFrontendRequest;
 import android.media.tv.tunerresourcemanager.TunerLnbRequest;
 
diff --git a/media/java/android/media/tv/tunerresourcemanager/aidl/android/media/tv/tunerresourcemanager/TunerFrontendInfo.aidl b/media/java/android/media/tv/tunerresourcemanager/aidl/android/media/tv/tunerresourcemanager/TunerFrontendInfo.aidl
new file mode 100644
index 0000000..8981ce0
--- /dev/null
+++ b/media/java/android/media/tv/tunerresourcemanager/aidl/android/media/tv/tunerresourcemanager/TunerFrontendInfo.aidl
@@ -0,0 +1,41 @@
+/**
+ * Copyright 2021, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.tv.tunerresourcemanager;
+
+/**
+ * FrontendInfo interface that carries tuner frontend information.
+ *
+ * This is used to update the TunerResourceManager fronted resources.
+ * @hide
+ */
+parcelable TunerFrontendInfo {
+    /**
+     * Frontend Handle
+     */
+    int handle;
+
+    /**
+     * Frontend Type
+     */
+    int type;
+
+    /**
+     * Frontends are assigned with the same exclusiveGroupId if they can't
+     * function at same time. For instance, they share same hardware module.
+     */
+    int exclusiveGroupId;
+}
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index c775b6f..e817f2d 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -172,8 +172,7 @@
 
     shared_libs: [
         "android.hardware.graphics.bufferqueue@2.0",
-        "android.hardware.tv.tuner@1.0",
-        "android.hardware.tv.tuner@1.1",
+        "android.hardware.tv.tuner-V1-ndk",
         "libbinder_ndk",
         "libandroid_runtime",
         "libcutils",
@@ -184,7 +183,6 @@
         "libnativehelper",
         "libutils",
         "tv_tuner_aidl_interface-ndk",
-        "tv_tuner_resource_manager_aidl_interface-ndk",
     ],
 
     static_libs: [
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 698fb5a5..d1c4b34 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -14,154 +14,280 @@
  * limitations under the License.
  */
 
+//#define LOG_NDEBUG 0
 #define LOG_TAG "TvTuner-JNI"
-#include <utils/Log.h>
 
-#include "android_media_MediaCodecLinearBlock.h"
 #include "android_media_tv_Tuner.h"
-#include "android_runtime/AndroidRuntime.h"
 
+#include <aidl/android/hardware/tv/tuner/AudioExtraMetaData.h>
+#include <aidl/android/hardware/tv/tuner/AudioStreamType.h>
+#include <aidl/android/hardware/tv/tuner/AvStreamType.h>
+#include <aidl/android/hardware/tv/tuner/Constant.h>
+#include <aidl/android/hardware/tv/tuner/Constant64Bit.h>
+#include <aidl/android/hardware/tv/tuner/DataFormat.h>
+#include <aidl/android/hardware/tv/tuner/DemuxAlpFilterSettings.h>
+#include <aidl/android/hardware/tv/tuner/DemuxAlpFilterType.h>
+#include <aidl/android/hardware/tv/tuner/DemuxAlpLengthType.h>
+#include <aidl/android/hardware/tv/tuner/DemuxCapabilities.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterAvSettings.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterDownloadEvent.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterDownloadSettings.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterIpPayloadEvent.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterMainType.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterMediaEvent.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterPesDataSettings.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterPesEvent.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterRecordSettings.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterScIndexMask.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterSectionBits.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterSectionEvent.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterSectionSettings.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterSectionSettingsCondition.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterSettings.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterSubType.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterTemiEvent.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterTsRecordEvent.h>
+#include <aidl/android/hardware/tv/tuner/DemuxIpAddress.h>
+#include <aidl/android/hardware/tv/tuner/DemuxIpFilterSettings.h>
+#include <aidl/android/hardware/tv/tuner/DemuxIpFilterType.h>
+#include <aidl/android/hardware/tv/tuner/DemuxMmtpFilterSettings.h>
+#include <aidl/android/hardware/tv/tuner/DemuxMmtpFilterType.h>
+#include <aidl/android/hardware/tv/tuner/DemuxQueueNotifyBits.h>
+#include <aidl/android/hardware/tv/tuner/DemuxRecordScIndexType.h>
+#include <aidl/android/hardware/tv/tuner/DemuxScHevcIndex.h>
+#include <aidl/android/hardware/tv/tuner/DemuxScIndex.h>
+#include <aidl/android/hardware/tv/tuner/DemuxTlvFilterSettings.h>
+#include <aidl/android/hardware/tv/tuner/DemuxTlvFilterType.h>
+#include <aidl/android/hardware/tv/tuner/DemuxTsFilterSettings.h>
+#include <aidl/android/hardware/tv/tuner/DemuxTsFilterType.h>
+#include <aidl/android/hardware/tv/tuner/DemuxTsIndex.h>
+#include <aidl/android/hardware/tv/tuner/DvrSettings.h>
+#include <aidl/android/hardware/tv/tuner/FrontendAnalogAftFlag.h>
+#include <aidl/android/hardware/tv/tuner/FrontendAnalogSettings.h>
+#include <aidl/android/hardware/tv/tuner/FrontendAnalogSifStandard.h>
+#include <aidl/android/hardware/tv/tuner/FrontendAnalogType.h>
+#include <aidl/android/hardware/tv/tuner/FrontendAtsc3Bandwidth.h>
+#include <aidl/android/hardware/tv/tuner/FrontendAtsc3CodeRate.h>
+#include <aidl/android/hardware/tv/tuner/FrontendAtsc3DemodOutputFormat.h>
+#include <aidl/android/hardware/tv/tuner/FrontendAtsc3Fec.h>
+#include <aidl/android/hardware/tv/tuner/FrontendAtsc3Modulation.h>
+#include <aidl/android/hardware/tv/tuner/FrontendAtsc3PlpSettings.h>
+#include <aidl/android/hardware/tv/tuner/FrontendAtsc3Settings.h>
+#include <aidl/android/hardware/tv/tuner/FrontendAtsc3TimeInterleaveMode.h>
+#include <aidl/android/hardware/tv/tuner/FrontendAtscModulation.h>
+#include <aidl/android/hardware/tv/tuner/FrontendAtscSettings.h>
+#include <aidl/android/hardware/tv/tuner/FrontendBandwidth.h>
+#include <aidl/android/hardware/tv/tuner/FrontendCableTimeInterleaveMode.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDtmbBandwidth.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDtmbCapabilities.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDtmbCodeRate.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDtmbGuardInterval.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDtmbModulation.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDtmbSettings.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDtmbTimeInterleaveMode.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDtmbTransmissionMode.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbcAnnex.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbcBandwidth.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbcModulation.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbcOuterFec.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbcSettings.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbsCodeRate.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbsModulation.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbsPilot.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbsRolloff.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbsScanType.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbsSettings.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbsStandard.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbsVcmMode.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbtBandwidth.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbtCoderate.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbtConstellation.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbtGuardInterval.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbtHierarchy.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbtPlpMode.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbtSettings.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbtStandard.h>
+#include <aidl/android/hardware/tv/tuner/FrontendDvbtTransmissionMode.h>
+#include <aidl/android/hardware/tv/tuner/FrontendGuardInterval.h>
+#include <aidl/android/hardware/tv/tuner/FrontendInnerFec.h>
+#include <aidl/android/hardware/tv/tuner/FrontendInterleaveMode.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbs3Coderate.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbs3Modulation.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbs3Rolloff.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbs3Settings.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbsCoderate.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbsModulation.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbsRolloff.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbsSettings.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbsStreamIdType.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbtBandwidth.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbtCoderate.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbtGuardInterval.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbtMode.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbtModulation.h>
+#include <aidl/android/hardware/tv/tuner/FrontendIsdbtSettings.h>
+#include <aidl/android/hardware/tv/tuner/FrontendModulation.h>
+#include <aidl/android/hardware/tv/tuner/FrontendModulationStatus.h>
+#include <aidl/android/hardware/tv/tuner/FrontendRollOff.h>
+#include <aidl/android/hardware/tv/tuner/FrontendScanAtsc3PlpInfo.h>
+#include <aidl/android/hardware/tv/tuner/FrontendScanMessageStandard.h>
+#include <aidl/android/hardware/tv/tuner/FrontendSpectralInversion.h>
+#include <aidl/android/hardware/tv/tuner/FrontendStatus.h>
+#include <aidl/android/hardware/tv/tuner/FrontendStatusAtsc3PlpInfo.h>
+#include <aidl/android/hardware/tv/tuner/FrontendStatusType.h>
+#include <aidl/android/hardware/tv/tuner/FrontendTransmissionMode.h>
+#include <aidl/android/hardware/tv/tuner/FrontendType.h>
+#include <aidl/android/hardware/tv/tuner/LnbPosition.h>
+#include <aidl/android/hardware/tv/tuner/LnbTone.h>
+#include <aidl/android/hardware/tv/tuner/LnbVoltage.h>
+#include <aidl/android/hardware/tv/tuner/PlaybackSettings.h>
+#include <aidl/android/hardware/tv/tuner/RecordSettings.h>
+#include <aidl/android/hardware/tv/tuner/VideoStreamType.h>
+#include <aidlcommonsupport/NativeHandle.h>
 #include <android-base/logging.h>
 #include <media/stagefright/foundation/ADebug.h>
 #include <nativehelper/JNIHelp.h>
 #include <nativehelper/ScopedLocalRef.h>
-#include <utils/NativeHandle.h>
+#include <utils/Log.h>
+
+#include "android_media_MediaCodecLinearBlock.h"
+#include "android_runtime/AndroidRuntime.h"
 
 #pragma GCC diagnostic ignored "-Wunused-function"
 
-using ::android::hardware::Void;
-using ::android::hardware::hidl_bitfield;
-using ::android::hardware::hidl_vec;
-using ::android::hardware::tv::tuner::V1_0::AudioExtraMetaData;
-using ::android::hardware::tv::tuner::V1_0::DataFormat;
-using ::android::hardware::tv::tuner::V1_0::DemuxAlpFilterSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxAlpFilterType;
-using ::android::hardware::tv::tuner::V1_0::DemuxAlpLengthType;
-using ::android::hardware::tv::tuner::V1_0::DemuxCapabilities;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterDownloadEvent;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterDownloadSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterIpPayloadEvent;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterMediaEvent;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterMmtpRecordEvent;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterPesDataSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterPesEvent;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterRecordSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterSectionBits;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterSectionEvent;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterSectionSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterTemiEvent;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterTsRecordEvent;
-using ::android::hardware::tv::tuner::V1_0::DemuxIpAddress;
-using ::android::hardware::tv::tuner::V1_0::DemuxIpFilterSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxIpFilterType;
-using ::android::hardware::tv::tuner::V1_0::DemuxMmtpFilterSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType;
-using ::android::hardware::tv::tuner::V1_0::DemuxMmtpPid;
-using ::android::hardware::tv::tuner::V1_0::DemuxQueueNotifyBits;
-using ::android::hardware::tv::tuner::V1_0::DemuxRecordScIndexType;
-using ::android::hardware::tv::tuner::V1_0::DemuxScHevcIndex;
-using ::android::hardware::tv::tuner::V1_0::DemuxScIndex;
-using ::android::hardware::tv::tuner::V1_0::DemuxTlvFilterSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxTlvFilterType;
-using ::android::hardware::tv::tuner::V1_0::DemuxTpid;
-using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
-using ::android::hardware::tv::tuner::V1_0::DemuxTsIndex;
-using ::android::hardware::tv::tuner::V1_0::DvrSettings;
-using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSettings;
-using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard;
-using ::android::hardware::tv::tuner::V1_0::FrontendAnalogType;
-using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Bandwidth;
-using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3CodeRate;
-using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3DemodOutputFormat;
-using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Fec;
-using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation;
-using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3PlpSettings;
-using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Settings;
-using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3TimeInterleaveMode;
-using ::android::hardware::tv::tuner::V1_0::FrontendAtscSettings;
-using ::android::hardware::tv::tuner::V1_0::FrontendAtscModulation;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbcOuterFec;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSettings;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSpectralInversion;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbsCodeRate;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbsPilot;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbsRolloff;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbsSettings;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbsVcmMode;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbtCoderate;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbtConstellation;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbtPlpMode;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
-using ::android::hardware::tv::tuner::V1_0::FrontendInnerFec;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Coderate;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Rolloff;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Settings;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsCoderate;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsRolloff;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsSettings;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsStreamIdType;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtCoderate;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtSettings;
-using ::android::hardware::tv::tuner::V1_0::FrontendModulationStatus;
-using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo;
-using ::android::hardware::tv::tuner::V1_0::FrontendStatus;
-using ::android::hardware::tv::tuner::V1_0::FrontendStatusAtsc3PlpInfo;
-using ::android::hardware::tv::tuner::V1_0::FrontendStatusType;
-using ::android::hardware::tv::tuner::V1_0::FrontendType;
-using ::android::hardware::tv::tuner::V1_0::LnbPosition;
-using ::android::hardware::tv::tuner::V1_0::LnbTone;
-using ::android::hardware::tv::tuner::V1_0::LnbVoltage;
-using ::android::hardware::tv::tuner::V1_0::PlaybackSettings;
-using ::android::hardware::tv::tuner::V1_0::RecordSettings;
-using ::android::hardware::tv::tuner::V1_1::AudioStreamType;
-using ::android::hardware::tv::tuner::V1_1::AvStreamType;
-using ::android::hardware::tv::tuner::V1_1::Constant;
-using ::android::hardware::tv::tuner::V1_1::Constant64Bit;
-using ::android::hardware::tv::tuner::V1_1::FrontendAnalogAftFlag;
-using ::android::hardware::tv::tuner::V1_1::FrontendAnalogSettingsExt1_1;
-using ::android::hardware::tv::tuner::V1_1::FrontendBandwidth;
-using ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode;
-using ::android::hardware::tv::tuner::V1_1::FrontendDvbcBandwidth;
-using ::android::hardware::tv::tuner::V1_1::FrontendDvbsScanType;
-using ::android::hardware::tv::tuner::V1_1::FrontendDvbcSettingsExt1_1;
-using ::android::hardware::tv::tuner::V1_1::FrontendDvbsSettingsExt1_1;
-using ::android::hardware::tv::tuner::V1_1::FrontendDvbtSettingsExt1_1;
-using ::android::hardware::tv::tuner::V1_1::FrontendDtmbBandwidth;
-using ::android::hardware::tv::tuner::V1_1::FrontendDtmbCapabilities;
-using ::android::hardware::tv::tuner::V1_1::FrontendDtmbCodeRate;
-using ::android::hardware::tv::tuner::V1_1::FrontendDtmbGuardInterval;
-using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation;
-using ::android::hardware::tv::tuner::V1_1::FrontendDtmbSettings;
-using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTimeInterleaveMode;
-using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode;
-using ::android::hardware::tv::tuner::V1_1::FrontendGuardInterval;
-using ::android::hardware::tv::tuner::V1_1::FrontendInterleaveMode;
-using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
-using ::android::hardware::tv::tuner::V1_1::FrontendRollOff;
-using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;
-using ::android::hardware::tv::tuner::V1_1::FrontendStatusExt1_1;
-using ::android::hardware::tv::tuner::V1_1::FrontendStatusTypeExt1_1;
-using ::android::hardware::tv::tuner::V1_1::FrontendTransmissionMode;
-using ::android::hardware::tv::tuner::V1_1::VideoStreamType;
+using ::aidl::android::hardware::tv::tuner::AudioExtraMetaData;
+using ::aidl::android::hardware::tv::tuner::AudioStreamType;
+using ::aidl::android::hardware::tv::tuner::AvStreamType;
+using ::aidl::android::hardware::tv::tuner::Constant;
+using ::aidl::android::hardware::tv::tuner::Constant64Bit;
+using ::aidl::android::hardware::tv::tuner::DataFormat;
+using ::aidl::android::hardware::tv::tuner::DemuxAlpFilterSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxAlpFilterSettingsFilterSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxAlpFilterType;
+using ::aidl::android::hardware::tv::tuner::DemuxAlpLengthType;
+using ::aidl::android::hardware::tv::tuner::DemuxCapabilities;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterAvSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterDownloadEvent;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterDownloadSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterIpPayloadEvent;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterMainType;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterMediaEvent;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterMediaEventExtraMetaData;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterMmtpRecordEvent;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterPesDataSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterPesEvent;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterRecordSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterScIndexMask;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterSectionBits;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterSectionEvent;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterSectionSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterSectionSettingsCondition;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterSectionSettingsConditionTableInfo;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterSubType;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterTemiEvent;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterTsRecordEvent;
+using ::aidl::android::hardware::tv::tuner::DemuxIpAddress;
+using ::aidl::android::hardware::tv::tuner::DemuxIpAddressIpAddress;
+using ::aidl::android::hardware::tv::tuner::DemuxIpFilterSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxIpFilterSettingsFilterSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxIpFilterType;
+using ::aidl::android::hardware::tv::tuner::DemuxMmtpFilterSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxMmtpFilterSettingsFilterSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxMmtpFilterType;
+using ::aidl::android::hardware::tv::tuner::DemuxQueueNotifyBits;
+using ::aidl::android::hardware::tv::tuner::DemuxRecordScIndexType;
+using ::aidl::android::hardware::tv::tuner::DemuxScHevcIndex;
+using ::aidl::android::hardware::tv::tuner::DemuxScIndex;
+using ::aidl::android::hardware::tv::tuner::DemuxTlvFilterSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxTlvFilterSettingsFilterSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxTlvFilterType;
+using ::aidl::android::hardware::tv::tuner::DemuxTsFilterSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxTsFilterSettingsFilterSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxTsFilterType;
+using ::aidl::android::hardware::tv::tuner::DemuxTsIndex;
+using ::aidl::android::hardware::tv::tuner::DvrSettings;
+using ::aidl::android::hardware::tv::tuner::FrontendAnalogAftFlag;
+using ::aidl::android::hardware::tv::tuner::FrontendAnalogSettings;
+using ::aidl::android::hardware::tv::tuner::FrontendAnalogSifStandard;
+using ::aidl::android::hardware::tv::tuner::FrontendAnalogType;
+using ::aidl::android::hardware::tv::tuner::FrontendAtsc3Bandwidth;
+using ::aidl::android::hardware::tv::tuner::FrontendAtsc3CodeRate;
+using ::aidl::android::hardware::tv::tuner::FrontendAtsc3DemodOutputFormat;
+using ::aidl::android::hardware::tv::tuner::FrontendAtsc3Fec;
+using ::aidl::android::hardware::tv::tuner::FrontendAtsc3Modulation;
+using ::aidl::android::hardware::tv::tuner::FrontendAtsc3PlpSettings;
+using ::aidl::android::hardware::tv::tuner::FrontendAtsc3Settings;
+using ::aidl::android::hardware::tv::tuner::FrontendAtsc3TimeInterleaveMode;
+using ::aidl::android::hardware::tv::tuner::FrontendAtscModulation;
+using ::aidl::android::hardware::tv::tuner::FrontendAtscSettings;
+using ::aidl::android::hardware::tv::tuner::FrontendBandwidth;
+using ::aidl::android::hardware::tv::tuner::FrontendCableTimeInterleaveMode;
+using ::aidl::android::hardware::tv::tuner::FrontendDtmbBandwidth;
+using ::aidl::android::hardware::tv::tuner::FrontendDtmbCapabilities;
+using ::aidl::android::hardware::tv::tuner::FrontendDtmbCodeRate;
+using ::aidl::android::hardware::tv::tuner::FrontendDtmbGuardInterval;
+using ::aidl::android::hardware::tv::tuner::FrontendDtmbModulation;
+using ::aidl::android::hardware::tv::tuner::FrontendDtmbSettings;
+using ::aidl::android::hardware::tv::tuner::FrontendDtmbTimeInterleaveMode;
+using ::aidl::android::hardware::tv::tuner::FrontendDtmbTransmissionMode;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbcAnnex;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbcBandwidth;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbcModulation;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbcOuterFec;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbcSettings;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbsCodeRate;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbsModulation;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbsPilot;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbsRolloff;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbsScanType;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbsSettings;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbsStandard;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbsVcmMode;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbtBandwidth;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbtCoderate;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbtConstellation;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbtGuardInterval;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbtHierarchy;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbtPlpMode;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbtSettings;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbtStandard;
+using ::aidl::android::hardware::tv::tuner::FrontendDvbtTransmissionMode;
+using ::aidl::android::hardware::tv::tuner::FrontendGuardInterval;
+using ::aidl::android::hardware::tv::tuner::FrontendInnerFec;
+using ::aidl::android::hardware::tv::tuner::FrontendInterleaveMode;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbs3Coderate;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbs3Modulation;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbs3Rolloff;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbs3Settings;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbsCoderate;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbsModulation;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbsRolloff;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbsSettings;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbsStreamIdType;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbtBandwidth;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbtCoderate;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbtGuardInterval;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbtMode;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbtModulation;
+using ::aidl::android::hardware::tv::tuner::FrontendIsdbtSettings;
+using ::aidl::android::hardware::tv::tuner::FrontendModulation;
+using ::aidl::android::hardware::tv::tuner::FrontendModulationStatus;
+using ::aidl::android::hardware::tv::tuner::FrontendRollOff;
+using ::aidl::android::hardware::tv::tuner::FrontendScanAtsc3PlpInfo;
+using ::aidl::android::hardware::tv::tuner::FrontendScanMessageStandard;
+using ::aidl::android::hardware::tv::tuner::FrontendSpectralInversion;
+using ::aidl::android::hardware::tv::tuner::FrontendStatus;
+using ::aidl::android::hardware::tv::tuner::FrontendStatusAtsc3PlpInfo;
+using ::aidl::android::hardware::tv::tuner::FrontendStatusType;
+using ::aidl::android::hardware::tv::tuner::FrontendTransmissionMode;
+using ::aidl::android::hardware::tv::tuner::FrontendType;
+using ::aidl::android::hardware::tv::tuner::LnbPosition;
+using ::aidl::android::hardware::tv::tuner::LnbTone;
+using ::aidl::android::hardware::tv::tuner::LnbVoltage;
+using ::aidl::android::hardware::tv::tuner::PlaybackSettings;
+using ::aidl::android::hardware::tv::tuner::RecordSettings;
+using ::aidl::android::hardware::tv::tuner::VideoStreamType;
 
 struct fields_t {
     jfieldID tunerContext;
@@ -192,17 +318,16 @@
 
 static fields_t gFields;
 
-
 static int IP_V4_LENGTH = 4;
 static int IP_V6_LENGTH = 16;
 
 void DestroyCallback(const C2Buffer * buf, void *arg) {
     android::sp<android::MediaEvent> event = (android::MediaEvent *)arg;
     android::Mutex::Autolock autoLock(event->mLock);
-    if (event->mLinearBlockObj != NULL) {
+    if (event->mLinearBlockObj != nullptr) {
         JNIEnv *env = android::AndroidRuntime::getJNIEnv();
         env->DeleteWeakGlobalRef(event->mLinearBlockObj);
-        event->mLinearBlockObj = NULL;
+        event->mLinearBlockObj = nullptr;
     }
 
     event->mAvHandleRefCnt--;
@@ -211,11 +336,9 @@
 }
 
 namespace android {
-
 /////////////// LnbClientCallbackImpl ///////////////////////
-
 void LnbClientCallbackImpl::onEvent(const LnbEventType lnbEventType) {
-    ALOGD("LnbClientCallbackImpl::onEvent, type=%d", lnbEventType);
+    ALOGV("LnbClientCallbackImpl::onEvent, type=%d", lnbEventType);
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jobject lnb(env->NewLocalRef(mLnbObj));
     if (!env->IsSameObject(lnb, nullptr)) {
@@ -229,14 +352,14 @@
     }
 }
 
-void LnbClientCallbackImpl::onDiseqcMessage(const hidl_vec<uint8_t>& diseqcMessage) {
-    ALOGD("LnbClientCallbackImpl::onDiseqcMessage");
+void LnbClientCallbackImpl::onDiseqcMessage(const vector<uint8_t> &diseqcMessage) {
+    ALOGV("LnbClientCallbackImpl::onDiseqcMessage");
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jobject lnb(env->NewLocalRef(mLnbObj));
     if (!env->IsSameObject(lnb, nullptr)) {
         jbyteArray array = env->NewByteArray(diseqcMessage.size());
-        env->SetByteArrayRegion(
-                array, 0, diseqcMessage.size(), reinterpret_cast<jbyte*>(diseqcMessage[0]));
+        env->SetByteArrayRegion(array, 0, diseqcMessage.size(),
+                                reinterpret_cast<const jbyte *>(&diseqcMessage[0]));
         env->CallVoidMethod(
                 lnb,
                 gFields.onLnbDiseqcMessageID,
@@ -248,22 +371,21 @@
 }
 
 void LnbClientCallbackImpl::setLnb(jweak lnbObj) {
-    ALOGD("LnbClientCallbackImpl::setLnb");
+    ALOGV("LnbClientCallbackImpl::setLnb");
     mLnbObj = lnbObj;
 }
 
 LnbClientCallbackImpl::~LnbClientCallbackImpl() {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
-    if (mLnbObj != NULL) {
+    if (mLnbObj != nullptr) {
         env->DeleteWeakGlobalRef(mLnbObj);
-        mLnbObj = NULL;
+        mLnbObj = nullptr;
     }
 }
 
 /////////////// DvrClientCallbackImpl ///////////////////////
-
 void DvrClientCallbackImpl::onRecordStatus(RecordStatus status) {
-    ALOGD("DvrClientCallbackImpl::onRecordStatus");
+    ALOGV("DvrClientCallbackImpl::onRecordStatus");
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jobject dvr(env->NewLocalRef(mDvrObj));
     if (!env->IsSameObject(dvr, nullptr)) {
@@ -278,7 +400,7 @@
 }
 
 void DvrClientCallbackImpl::onPlaybackStatus(PlaybackStatus status) {
-    ALOGD("DvrClientCallbackImpl::onPlaybackStatus");
+    ALOGV("DvrClientCallbackImpl::onPlaybackStatus");
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jobject dvr(env->NewLocalRef(mDvrObj));
     if (!env->IsSameObject(dvr, nullptr)) {
@@ -293,20 +415,19 @@
 }
 
 void DvrClientCallbackImpl::setDvr(jweak dvrObj) {
-    ALOGD("DvrClientCallbackImpl::setDvr");
+    ALOGV("DvrClientCallbackImpl::setDvr");
     mDvrObj = dvrObj;
 }
 
 DvrClientCallbackImpl::~DvrClientCallbackImpl() {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
-    if (mDvrObj != NULL) {
+    if (mDvrObj != nullptr) {
         env->DeleteWeakGlobalRef(mDvrObj);
-        mDvrObj = NULL;
+        mDvrObj = nullptr;
     }
 }
 
 /////////////// C2DataIdInfo ///////////////////////
-
 C2DataIdInfo::C2DataIdInfo(uint32_t index, uint64_t value) : C2Param(kParamSize, index) {
     CHECK(isGlobal());
     CHECK_EQ(C2Param::INFO, kind());
@@ -316,40 +437,44 @@
 }
 
 /////////////// MediaEvent ///////////////////////
-
-MediaEvent::MediaEvent(sp<FilterClient> filterClient, hidl_handle avHandle,
-        uint64_t dataId, uint64_t dataSize, jobject obj) : mFilterClient(filterClient),
-        mDataId(dataId), mDataSize(dataSize), mBuffer(nullptr),
-        mDataIdRefCnt(0), mAvHandleRefCnt(0), mIonHandle(nullptr) {
+MediaEvent::MediaEvent(sp<FilterClient> filterClient, native_handle_t *avHandle, uint64_t dataId,
+                       uint64_t dataSize, jobject obj)
+      : mFilterClient(filterClient),
+        mDataId(dataId),
+        mDataSize(dataSize),
+        mBuffer(nullptr),
+        mDataIdRefCnt(0),
+        mAvHandleRefCnt(0),
+        mIonHandle(nullptr) {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     mMediaEventObj = env->NewWeakGlobalRef(obj);
-    mAvHandle = native_handle_clone(avHandle.getNativeHandle());
-    mLinearBlockObj = NULL;
+    mAvHandle = avHandle;
+    mLinearBlockObj = nullptr;
 }
 
 MediaEvent::~MediaEvent() {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     env->DeleteWeakGlobalRef(mMediaEventObj);
-    mMediaEventObj = NULL;
+    mMediaEventObj = nullptr;
     native_handle_delete(mAvHandle);
-    if (mIonHandle != NULL) {
+    if (mIonHandle != nullptr) {
         delete mIonHandle;
     }
     std::shared_ptr<C2Buffer> pC2Buffer = mC2Buffer.lock();
-    if (pC2Buffer != NULL) {
+    if (pC2Buffer != nullptr) {
         pC2Buffer->unregisterOnDestroyNotify(&DestroyCallback, this);
     }
 
-    if (mLinearBlockObj != NULL) {
+    if (mLinearBlockObj != nullptr) {
         env->DeleteWeakGlobalRef(mLinearBlockObj);
-        mLinearBlockObj = NULL;
+        mLinearBlockObj = nullptr;
     }
 
-    mFilterClient = NULL;
+    mFilterClient = nullptr;
 }
 
 void MediaEvent::finalize() {
-    if (mAvHandleRefCnt == 0 && mFilterClient != NULL) {
+    if (mAvHandleRefCnt == 0 && mFilterClient != nullptr) {
         mFilterClient->releaseAvHandle(
                 mAvHandle, mDataIdRefCnt == 0 ? mDataId : 0);
         native_handle_close(mAvHandle);
@@ -357,11 +482,11 @@
 }
 
 jobject MediaEvent::getLinearBlock() {
-    ALOGD("MediaEvent::getLinearBlock");
-    if (mAvHandle == NULL) {
-        return NULL;
+    ALOGV("MediaEvent::getLinearBlock");
+    if (mAvHandle == nullptr) {
+        return nullptr;
     }
-    if (mLinearBlockObj != NULL) {
+    if (mLinearBlockObj != nullptr) {
         return mLinearBlockObj;
     }
 
@@ -374,13 +499,13 @@
     uint64_t avSharedMemSize = info.size;
 
     if (mAvHandle->numFds == 0) {
-        if (avSharedHandle == NULL) {
+        if (avSharedHandle == nullptr) {
             ALOGE("Shared AV memory handle is not initialized.");
-            return NULL;
+            return nullptr;
         }
         if (avSharedHandle->numFds == 0) {
             ALOGE("Shared AV memory handle is empty.");
-            return NULL;
+            return nullptr;
         }
         fd = avSharedHandle->data[0];
         dataSize = avSharedMemSize;
@@ -398,7 +523,7 @@
             // event has value, use it as the index
             memIndex = mAvHandle->data[mAvHandle->numFds];
         } else {
-            if (avSharedHandle != NULL) {
+            if (avSharedHandle != nullptr) {
                 numInts = avSharedHandle->numInts;
                 if (numInts > 0) {
                     // If the first int in the shared native handle has value, use it as the index
@@ -413,7 +538,7 @@
     if (block != nullptr) {
         // CreateLinearBlock delete mIonHandle after it create block successfully.
         // ToDo: coordinate who is response to delete mIonHandle
-        mIonHandle = NULL;
+        mIonHandle = nullptr;
         JNIEnv *env = AndroidRuntime::getJNIEnv();
         std::unique_ptr<JMediaCodecLinearBlock> context{new JMediaCodecLinearBlock};
         context->mBlock = block;
@@ -444,8 +569,8 @@
                     reinterpret_cast<const native_handle_t*>(mIonHandle)));
         native_handle_delete(const_cast<native_handle_t*>(
                     reinterpret_cast<const native_handle_t*>(mIonHandle)));
-        mIonHandle = NULL;
-        return NULL;
+        mIonHandle = nullptr;
+        return nullptr;
     }
 }
 
@@ -455,31 +580,24 @@
 }
 
 /////////////// FilterClientCallbackImpl ///////////////////////
-
-jobjectArray FilterClientCallbackImpl::getSectionEvent(
-        jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events) {
+void FilterClientCallbackImpl::getSectionEvent(jobjectArray &arr, const int size,
+                                               const DemuxFilterEvent &event) {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/SectionEvent");
     jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(IIII)V");
 
-    for (int i = 0; i < events.size(); i++) {
-        auto event = events[i];
-        DemuxFilterSectionEvent sectionEvent = event.section();
+    const DemuxFilterSectionEvent &sectionEvent = event.get<DemuxFilterEvent::Tag::section>();
+    jint tableId = static_cast<jint>(sectionEvent.tableId);
+    jint version = static_cast<jint>(sectionEvent.version);
+    jint sectionNum = static_cast<jint>(sectionEvent.sectionNum);
+    jint dataLength = static_cast<jint>(sectionEvent.dataLength);
 
-        jint tableId = static_cast<jint>(sectionEvent.tableId);
-        jint version = static_cast<jint>(sectionEvent.version);
-        jint sectionNum = static_cast<jint>(sectionEvent.sectionNum);
-        jint dataLength = static_cast<jint>(sectionEvent.dataLength);
-
-        jobject obj =
-                env->NewObject(eventClazz, eventInit, tableId, version, sectionNum, dataLength);
-        env->SetObjectArrayElement(arr, i, obj);
-    }
-    return arr;
+    jobject obj = env->NewObject(eventClazz, eventInit, tableId, version, sectionNum, dataLength);
+    env->SetObjectArrayElement(arr, size, obj);
 }
 
-jobjectArray FilterClientCallbackImpl::getMediaEvent(
-        jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events) {
+void FilterClientCallbackImpl::getMediaEvent(jobjectArray &arr, const int size,
+                                             const DemuxFilterEvent &event) {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/MediaEvent");
     jmethodID eventInit = env->GetMethodID(eventClazz,
@@ -488,353 +606,284 @@
             "ZJIZLandroid/media/tv/tuner/filter/AudioDescriptor;)V");
     jfieldID eventContext = env->GetFieldID(eventClazz, "mNativeContext", "J");
 
-    for (int i = 0; i < events.size(); i++) {
-        auto event = events[i];
-        DemuxFilterMediaEvent mediaEvent = event.media();
+    const DemuxFilterMediaEvent &mediaEvent = event.get<DemuxFilterEvent::Tag::media>();
+    jobject audioDescriptor = nullptr;
+    if (mediaEvent.extraMetaData.getTag() == DemuxFilterMediaEventExtraMetaData::Tag::audio) {
+        jclass adClazz = env->FindClass("android/media/tv/tuner/filter/AudioDescriptor");
+        jmethodID adInit = env->GetMethodID(adClazz, "<init>", "(BBCBBB)V");
 
-        jobject audioDescriptor = NULL;
-        if (mediaEvent.extraMetaData.getDiscriminator()
-                == DemuxFilterMediaEvent::ExtraMetaData::hidl_discriminator::audio) {
-            jclass adClazz = env->FindClass("android/media/tv/tuner/filter/AudioDescriptor");
-            jmethodID adInit = env->GetMethodID(adClazz, "<init>", "(BBCBBB)V");
+        const AudioExtraMetaData &ad =
+                mediaEvent.extraMetaData.get<DemuxFilterMediaEventExtraMetaData::Tag::audio>();
+        jbyte adFade = static_cast<jbyte>(ad.adFade);
+        jbyte adPan = static_cast<jbyte>(ad.adPan);
+        jchar versionTextTag = static_cast<jchar>(ad.versionTextTag);
+        jbyte adGainCenter = static_cast<jbyte>(ad.adGainCenter);
+        jbyte adGainFront = static_cast<jbyte>(ad.adGainFront);
+        jbyte adGainSurround = static_cast<jbyte>(ad.adGainSurround);
 
-            AudioExtraMetaData ad = mediaEvent.extraMetaData.audio();
-            jbyte adFade = static_cast<jbyte>(ad.adFade);
-            jbyte adPan = static_cast<jbyte>(ad.adPan);
-            jchar versionTextTag = static_cast<jchar>(ad.versionTextTag);
-            jbyte adGainCenter = static_cast<jbyte>(ad.adGainCenter);
-            jbyte adGainFront = static_cast<jbyte>(ad.adGainFront);
-            jbyte adGainSurround = static_cast<jbyte>(ad.adGainSurround);
-
-            audioDescriptor =
-                    env->NewObject(adClazz, adInit, adFade, adPan, versionTextTag, adGainCenter,
-                            adGainFront, adGainSurround);
-        }
-
-        jlong dataLength = static_cast<jlong>(mediaEvent.dataLength);
-
-        jint streamId = static_cast<jint>(mediaEvent.streamId);
-        jboolean isPtsPresent = static_cast<jboolean>(mediaEvent.isPtsPresent);
-        jlong pts = static_cast<jlong>(mediaEvent.pts);
-        jlong offset = static_cast<jlong>(mediaEvent.offset);
-        jboolean isSecureMemory = static_cast<jboolean>(mediaEvent.isSecureMemory);
-        jlong avDataId = static_cast<jlong>(mediaEvent.avDataId);
-        jint mpuSequenceNumber = static_cast<jint>(mediaEvent.mpuSequenceNumber);
-        jboolean isPesPrivateData = static_cast<jboolean>(mediaEvent.isPesPrivateData);
-
-        jobject obj =
-                env->NewObject(eventClazz, eventInit, streamId, isPtsPresent, pts, dataLength,
-                offset, NULL, isSecureMemory, avDataId, mpuSequenceNumber, isPesPrivateData,
-                audioDescriptor);
-
-        if (mediaEvent.avMemory.getNativeHandle() != NULL || mediaEvent.avDataId != 0) {
-            sp<MediaEvent> mediaEventSp =
-                           new MediaEvent(mFilterClient, mediaEvent.avMemory,
-                               mediaEvent.avDataId, dataLength + offset, obj);
-            mediaEventSp->mAvHandleRefCnt++;
-            env->SetLongField(obj, eventContext, (jlong) mediaEventSp.get());
-            mediaEventSp->incStrong(obj);
-        }
-
-        env->SetObjectArrayElement(arr, i, obj);
+        audioDescriptor = env->NewObject(adClazz, adInit, adFade, adPan, versionTextTag,
+                                         adGainCenter, adGainFront, adGainSurround);
     }
-    return arr;
+
+    jlong dataLength = static_cast<jlong>(mediaEvent.dataLength);
+    jint streamId = static_cast<jint>(mediaEvent.streamId);
+    jboolean isPtsPresent = static_cast<jboolean>(mediaEvent.isPtsPresent);
+    jlong pts = static_cast<jlong>(mediaEvent.pts);
+    jlong offset = static_cast<jlong>(mediaEvent.offset);
+    jboolean isSecureMemory = static_cast<jboolean>(mediaEvent.isSecureMemory);
+    jlong avDataId = static_cast<jlong>(mediaEvent.avDataId);
+    jint mpuSequenceNumber = static_cast<jint>(mediaEvent.mpuSequenceNumber);
+    jboolean isPesPrivateData = static_cast<jboolean>(mediaEvent.isPesPrivateData);
+
+    jobject obj = env->NewObject(eventClazz, eventInit, streamId, isPtsPresent, pts, dataLength,
+                                 offset, nullptr, isSecureMemory, avDataId, mpuSequenceNumber,
+                                 isPesPrivateData, audioDescriptor);
+
+    if (mediaEvent.avMemory.fds.size() > 0 || mediaEvent.avDataId != 0) {
+        sp<MediaEvent> mediaEventSp =
+                new MediaEvent(mFilterClient, makeFromAidl(mediaEvent.avMemory),
+                               mediaEvent.avDataId, dataLength + offset, obj);
+        mediaEventSp->mAvHandleRefCnt++;
+        env->SetLongField(obj, eventContext, (jlong)mediaEventSp.get());
+        mediaEventSp->incStrong(obj);
+    }
+
+    env->SetObjectArrayElement(arr, size, obj);
 }
 
-jobjectArray FilterClientCallbackImpl::getPesEvent(
-        jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events) {
+void FilterClientCallbackImpl::getPesEvent(jobjectArray &arr, const int size,
+                                           const DemuxFilterEvent &event) {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/PesEvent");
     jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(III)V");
 
-    for (int i = 0; i < events.size(); i++) {
-        auto event = events[i];
-        DemuxFilterPesEvent pesEvent = event.pes();
+    const DemuxFilterPesEvent &pesEvent = event.get<DemuxFilterEvent::Tag::pes>();
+    jint streamId = static_cast<jint>(pesEvent.streamId);
+    jint dataLength = static_cast<jint>(pesEvent.dataLength);
+    jint mpuSequenceNumber = static_cast<jint>(pesEvent.mpuSequenceNumber);
 
-        jint streamId = static_cast<jint>(pesEvent.streamId);
-        jint dataLength = static_cast<jint>(pesEvent.dataLength);
-        jint mpuSequenceNumber = static_cast<jint>(pesEvent.mpuSequenceNumber);
-
-        jobject obj =
-                env->NewObject(eventClazz, eventInit, streamId, dataLength, mpuSequenceNumber);
-        env->SetObjectArrayElement(arr, i, obj);
-    }
-    return arr;
+    jobject obj = env->NewObject(eventClazz, eventInit, streamId, dataLength, mpuSequenceNumber);
+    env->SetObjectArrayElement(arr, size, obj);
 }
 
-jobjectArray FilterClientCallbackImpl::getTsRecordEvent(
-        jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events,
-                const std::vector<DemuxFilterEventExt::Event>& eventsExt) {
+void FilterClientCallbackImpl::getTsRecordEvent(jobjectArray &arr, const int size,
+                                                const DemuxFilterEvent &event) {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/TsRecordEvent");
     jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(IIIJJI)V");
 
-    for (int i = 0; i < events.size(); i++) {
-        auto event = events[i];
-        DemuxFilterTsRecordEvent tsRecordEvent = event.tsRecord();
-        DemuxPid pid = tsRecordEvent.pid;
+    const DemuxFilterTsRecordEvent &tsRecordEvent = event.get<DemuxFilterEvent::Tag::tsRecord>();
+    DemuxPid pid = tsRecordEvent.pid;
 
-        jint jpid = static_cast<jint>(Constant::INVALID_TS_PID);
-
-        if (pid.getDiscriminator() == DemuxPid::hidl_discriminator::tPid) {
-            jpid = static_cast<jint>(pid.tPid());
-        } else if (pid.getDiscriminator() == DemuxPid::hidl_discriminator::mmtpPid) {
-            jpid = static_cast<jint>(pid.mmtpPid());
-        }
-
-        jint sc = 0;
-
-        if (tsRecordEvent.scIndexMask.getDiscriminator()
-                == DemuxFilterTsRecordEvent::ScIndexMask::hidl_discriminator::sc) {
-            sc = static_cast<jint>(tsRecordEvent.scIndexMask.sc());
-        } else if (tsRecordEvent.scIndexMask.getDiscriminator()
-                == DemuxFilterTsRecordEvent::ScIndexMask::hidl_discriminator::scHevc) {
-            sc = static_cast<jint>(tsRecordEvent.scIndexMask.scHevc());
-        }
-
-        jint ts = static_cast<jint>(tsRecordEvent.tsIndexMask);
-
-        jlong byteNumber = static_cast<jlong>(tsRecordEvent.byteNumber);
-
-        jlong pts;
-        jlong firstMbInSlice;
-        if (eventsExt.size() > i && eventsExt[i].getDiscriminator() ==
-                    DemuxFilterEventExt::Event::hidl_discriminator::tsRecord) {
-            pts = static_cast<jlong>(eventsExt[i].tsRecord().pts);
-            firstMbInSlice = static_cast<jint>(eventsExt[i].tsRecord().firstMbInSlice);
-        } else {
-            pts = static_cast<jlong>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
-            firstMbInSlice = static_cast<jint>(Constant::INVALID_FIRST_MACROBLOCK_IN_SLICE);
-        }
-
-        jobject obj =
-                env->NewObject(eventClazz, eventInit, jpid, ts, sc, byteNumber,
-                        pts, firstMbInSlice);
-        env->SetObjectArrayElement(arr, i, obj);
+    jint jpid = static_cast<jint>(Constant::INVALID_TS_PID);
+    if (pid.getTag() == DemuxPid::Tag::tPid) {
+        jpid = static_cast<jint>(pid.get<DemuxPid::Tag::tPid>());
+    } else if (pid.getTag() == DemuxPid::Tag::mmtpPid) {
+        jpid = static_cast<jint>(pid.get<DemuxPid::Tag::mmtpPid>());
     }
-    return arr;
+
+    jint sc = 0;
+    if (tsRecordEvent.scIndexMask.getTag() == DemuxFilterScIndexMask::Tag::scIndex) {
+        sc = static_cast<jint>(
+                tsRecordEvent.scIndexMask.get<DemuxFilterScIndexMask::Tag::scIndex>());
+    } else if (tsRecordEvent.scIndexMask.getTag() == DemuxFilterScIndexMask::Tag::scHevc) {
+        sc = static_cast<jint>(
+                tsRecordEvent.scIndexMask.get<DemuxFilterScIndexMask::Tag::scHevc>());
+    }
+
+    jint ts = static_cast<jint>(tsRecordEvent.tsIndexMask);
+    jlong byteNumber = static_cast<jlong>(tsRecordEvent.byteNumber);
+    jlong pts = static_cast<jlong>(tsRecordEvent.pts);
+    jint firstMbInSlice = static_cast<jint>(tsRecordEvent.firstMbInSlice);
+
+    jobject obj =
+            env->NewObject(eventClazz, eventInit, jpid, ts, sc, byteNumber, pts, firstMbInSlice);
+    env->SetObjectArrayElement(arr, size, obj);
 }
 
-jobjectArray FilterClientCallbackImpl::getMmtpRecordEvent(
-        jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events,
-                const std::vector<DemuxFilterEventExt::Event>& eventsExt) {
+void FilterClientCallbackImpl::getMmtpRecordEvent(jobjectArray &arr, const int size,
+                                                  const DemuxFilterEvent &event) {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/MmtpRecordEvent");
     jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(IJIJII)V");
 
-    for (int i = 0; i < events.size(); i++) {
-        auto event = events[i];
+    const DemuxFilterMmtpRecordEvent &mmtpRecordEvent =
+            event.get<DemuxFilterEvent::Tag::mmtpRecord>();
+    jint scHevcIndexMask = static_cast<jint>(mmtpRecordEvent.scHevcIndexMask);
+    jlong byteNumber = static_cast<jlong>(mmtpRecordEvent.byteNumber);
+    jint mpuSequenceNumber = static_cast<jint>(mmtpRecordEvent.mpuSequenceNumber);
+    jlong pts = static_cast<jlong>(mmtpRecordEvent.pts);
+    jint firstMbInSlice = static_cast<jint>(mmtpRecordEvent.firstMbInSlice);
+    jlong tsIndexMask = static_cast<jlong>(mmtpRecordEvent.tsIndexMask);
 
-        DemuxFilterMmtpRecordEvent mmtpRecordEvent = event.mmtpRecord();
-
-        jint scHevcIndexMask = static_cast<jint>(mmtpRecordEvent.scHevcIndexMask);
-        jlong byteNumber = static_cast<jlong>(mmtpRecordEvent.byteNumber);
-
-        jint mpuSequenceNumber;
-        jlong pts;
-        jlong firstMbInSlice;
-        jlong tsIndexMask;
-
-        if (eventsExt.size() > i && eventsExt[i].getDiscriminator() ==
-                    DemuxFilterEventExt::Event::hidl_discriminator::mmtpRecord) {
-            mpuSequenceNumber = static_cast<jint>(eventsExt[i].mmtpRecord().mpuSequenceNumber);
-            pts = static_cast<jlong>(eventsExt[i].mmtpRecord().pts);
-            firstMbInSlice = static_cast<jint>(eventsExt[i].mmtpRecord().firstMbInSlice);
-            tsIndexMask = static_cast<jint>(eventsExt[i].mmtpRecord().tsIndexMask);
-        } else {
-            mpuSequenceNumber =
-                    static_cast<jint>(Constant::INVALID_MMTP_RECORD_EVENT_MPT_SEQUENCE_NUM);
-            pts = static_cast<jlong>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
-            firstMbInSlice = static_cast<jint>(Constant::INVALID_FIRST_MACROBLOCK_IN_SLICE);
-            tsIndexMask = 0;
-        }
-
-        jobject obj =
-                env->NewObject(eventClazz, eventInit, scHevcIndexMask, byteNumber,
-                        mpuSequenceNumber, pts, firstMbInSlice, tsIndexMask);
-        env->SetObjectArrayElement(arr, i, obj);
-    }
-    return arr;
+    jobject obj = env->NewObject(eventClazz, eventInit, scHevcIndexMask, byteNumber,
+                                 mpuSequenceNumber, pts, firstMbInSlice, tsIndexMask);
+    env->SetObjectArrayElement(arr, size, obj);
 }
 
-jobjectArray FilterClientCallbackImpl::getDownloadEvent(
-        jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events) {
+void FilterClientCallbackImpl::getDownloadEvent(jobjectArray &arr, const int size,
+                                                const DemuxFilterEvent &event) {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/DownloadEvent");
     jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(IIIII)V");
 
-    for (int i = 0; i < events.size(); i++) {
-        auto event = events[i];
-        DemuxFilterDownloadEvent downloadEvent = event.download();
+    const DemuxFilterDownloadEvent &downloadEvent = event.get<DemuxFilterEvent::Tag::download>();
+    jint itemId = static_cast<jint>(downloadEvent.itemId);
+    jint mpuSequenceNumber = static_cast<jint>(downloadEvent.mpuSequenceNumber);
+    jint itemFragmentIndex = static_cast<jint>(downloadEvent.itemFragmentIndex);
+    jint lastItemFragmentIndex = static_cast<jint>(downloadEvent.lastItemFragmentIndex);
+    jint dataLength = static_cast<jint>(downloadEvent.dataLength);
 
-        jint itemId = static_cast<jint>(downloadEvent.itemId);
-        jint mpuSequenceNumber = static_cast<jint>(downloadEvent.mpuSequenceNumber);
-        jint itemFragmentIndex = static_cast<jint>(downloadEvent.itemFragmentIndex);
-        jint lastItemFragmentIndex = static_cast<jint>(downloadEvent.lastItemFragmentIndex);
-        jint dataLength = static_cast<jint>(downloadEvent.dataLength);
-
-        jobject obj =
-                env->NewObject(eventClazz, eventInit, itemId, mpuSequenceNumber, itemFragmentIndex,
-                        lastItemFragmentIndex, dataLength);
-        env->SetObjectArrayElement(arr, i, obj);
-    }
-    return arr;
+    jobject obj = env->NewObject(eventClazz, eventInit, itemId, mpuSequenceNumber,
+                                 itemFragmentIndex, lastItemFragmentIndex, dataLength);
+    env->SetObjectArrayElement(arr, size, obj);
 }
 
-jobjectArray FilterClientCallbackImpl::getIpPayloadEvent(
-        jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events) {
+void FilterClientCallbackImpl::getIpPayloadEvent(jobjectArray &arr, const int size,
+                                                 const DemuxFilterEvent &event) {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/IpPayloadEvent");
     jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(I)V");
 
-    for (int i = 0; i < events.size(); i++) {
-        auto event = events[i];
-        DemuxFilterIpPayloadEvent ipPayloadEvent = event.ipPayload();
-        jint dataLength = static_cast<jint>(ipPayloadEvent.dataLength);
-        jobject obj = env->NewObject(eventClazz, eventInit, dataLength);
-        env->SetObjectArrayElement(arr, i, obj);
-    }
-    return arr;
+    const DemuxFilterIpPayloadEvent &ipPayloadEvent = event.get<DemuxFilterEvent::Tag::ipPayload>();
+    jint dataLength = static_cast<jint>(ipPayloadEvent.dataLength);
+    jobject obj = env->NewObject(eventClazz, eventInit, dataLength);
+    env->SetObjectArrayElement(arr, size, obj);
 }
 
-jobjectArray FilterClientCallbackImpl::getTemiEvent(
-        jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events) {
+void FilterClientCallbackImpl::getTemiEvent(jobjectArray &arr, const int size,
+                                            const DemuxFilterEvent &event) {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/TemiEvent");
     jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(JB[B)V");
 
-    for (int i = 0; i < events.size(); i++) {
-        auto event = events[i];
-        DemuxFilterTemiEvent temiEvent = event.temi();
-        jlong pts = static_cast<jlong>(temiEvent.pts);
-        jbyte descrTag = static_cast<jbyte>(temiEvent.descrTag);
-        std::vector<uint8_t> descrData = temiEvent.descrData;
+    const DemuxFilterTemiEvent &temiEvent = event.get<DemuxFilterEvent::Tag::temi>();
+    jlong pts = static_cast<jlong>(temiEvent.pts);
+    jbyte descrTag = static_cast<jbyte>(temiEvent.descrTag);
+    std::vector<uint8_t> descrData = temiEvent.descrData;
 
-        jbyteArray array = env->NewByteArray(descrData.size());
-        env->SetByteArrayRegion(
-                array, 0, descrData.size(), reinterpret_cast<jbyte*>(&descrData[0]));
+    jbyteArray array = env->NewByteArray(descrData.size());
+    env->SetByteArrayRegion(array, 0, descrData.size(), reinterpret_cast<jbyte *>(&descrData[0]));
 
-        jobject obj = env->NewObject(eventClazz, eventInit, pts, descrTag, array);
-        env->SetObjectArrayElement(arr, i, obj);
-    }
-    return arr;
+    jobject obj = env->NewObject(eventClazz, eventInit, pts, descrTag, array);
+    env->SetObjectArrayElement(arr, size, obj);
 }
 
-jobjectArray FilterClientCallbackImpl::getScramblingStatusEvent(
-        jobjectArray& arr, const std::vector<DemuxFilterEventExt::Event>& eventsExt) {
+void FilterClientCallbackImpl::getScramblingStatusEvent(jobjectArray &arr, const int size,
+                                                        const DemuxFilterEvent &event) {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/ScramblingStatusEvent");
     jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(I)V");
 
-    auto scramblingStatus = eventsExt[0].monitorEvent().scramblingStatus();
-    jobject obj = env->NewObject(eventClazz, eventInit, static_cast<jint>(scramblingStatus));
-    env->SetObjectArrayElement(arr, 0, obj);
-    return arr;
+    const DemuxFilterMonitorEvent &scramblingStatus =
+            event.get<DemuxFilterEvent::Tag::monitorEvent>()
+                    .get<DemuxFilterMonitorEvent::Tag::scramblingStatus>();
+    jobject obj = env->NewObject(eventClazz, eventInit, scramblingStatus);
+    env->SetObjectArrayElement(arr, size, obj);
 }
 
-jobjectArray FilterClientCallbackImpl::getIpCidChangeEvent(
-        jobjectArray& arr, const std::vector<DemuxFilterEventExt::Event>& eventsExt) {
+void FilterClientCallbackImpl::getIpCidChangeEvent(jobjectArray &arr, const int size,
+                                                   const DemuxFilterEvent &event) {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/IpCidChangeEvent");
     jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(I)V");
 
-    auto cid = eventsExt[0].monitorEvent().cid();
-    jobject obj = env->NewObject(eventClazz, eventInit, static_cast<jint>(cid));
-    env->SetObjectArrayElement(arr, 0, obj);
-    return arr;
+    const DemuxFilterMonitorEvent &cid = event.get<DemuxFilterEvent::Tag::monitorEvent>()
+                                                 .get<DemuxFilterMonitorEvent::Tag::cid>();
+    jobject obj = env->NewObject(eventClazz, eventInit, cid);
+    env->SetObjectArrayElement(arr, size, obj);
 }
 
-jobjectArray FilterClientCallbackImpl::getRestartEvent(
-        jobjectArray& arr, const std::vector<DemuxFilterEventExt::Event>& eventsExt) {
+void FilterClientCallbackImpl::getRestartEvent(jobjectArray &arr, const int size,
+                                               const DemuxFilterEvent &event) {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/RestartEvent");
     jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(I)V");
 
-    auto startId = eventsExt[0].startId();
+    const int32_t &startId = event.get<DemuxFilterEvent::Tag::startId>();
     jobject obj = env->NewObject(eventClazz, eventInit, static_cast<jint>(startId));
-    env->SetObjectArrayElement(arr, 0, obj);
-    return arr;
+    env->SetObjectArrayElement(arr, size, obj);
 }
 
-void FilterClientCallbackImpl::onFilterEvent_1_1(const DemuxFilterEvent& filterEvent,
-        const DemuxFilterEventExt& filterEventExt) {
-    ALOGD("FilterClientCallbackImpl::onFilterEvent_1_1");
-
+void FilterClientCallbackImpl::onFilterEvent(const vector<DemuxFilterEvent> &events) {
+    ALOGV("FilterClientCallbackImpl::onFilterEvent");
     JNIEnv *env = AndroidRuntime::getJNIEnv();
+    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/FilterEvent");
     jobjectArray array;
 
-    std::vector<DemuxFilterEvent::Event> events = filterEvent.events;
-    std::vector<DemuxFilterEventExt::Event> eventsExt = filterEventExt.events;
-    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/FilterEvent");
+    if (!events.empty()) {
+        array = env->NewObjectArray(events.size(), eventClazz, nullptr);
+    }
 
-    if (events.empty() && !eventsExt.empty()) {
-        // Monitor event should be sent with one DemuxFilterMonitorEvent in DemuxFilterEventExt.
-        array = env->NewObjectArray(1, eventClazz, NULL);
-        auto eventExt = eventsExt[0];
-        switch (eventExt.getDiscriminator()) {
-            case DemuxFilterEventExt::Event::hidl_discriminator::monitorEvent: {
-                switch (eventExt.monitorEvent().getDiscriminator()) {
-                    case DemuxFilterMonitorEvent::hidl_discriminator::scramblingStatus: {
-                        array = getScramblingStatusEvent(array, eventsExt);
+    for (int i = 0, arraySize = 0; i < events.size(); i++) {
+        const DemuxFilterEvent &event = events[i];
+        switch (event.getTag()) {
+            case DemuxFilterEvent::Tag::media: {
+                getMediaEvent(array, arraySize, event);
+                arraySize++;
+                break;
+            }
+            case DemuxFilterEvent::Tag::section: {
+                getSectionEvent(array, arraySize, event);
+                arraySize++;
+                break;
+            }
+            case DemuxFilterEvent::Tag::pes: {
+                getPesEvent(array, arraySize, event);
+                arraySize++;
+                break;
+            }
+            case DemuxFilterEvent::Tag::tsRecord: {
+                getTsRecordEvent(array, arraySize, event);
+                arraySize++;
+                break;
+            }
+            case DemuxFilterEvent::Tag::mmtpRecord: {
+                getMmtpRecordEvent(array, arraySize, event);
+                arraySize++;
+                break;
+            }
+            case DemuxFilterEvent::Tag::download: {
+                getDownloadEvent(array, arraySize, event);
+                arraySize++;
+                break;
+            }
+            case DemuxFilterEvent::Tag::ipPayload: {
+                getIpPayloadEvent(array, arraySize, event);
+                arraySize++;
+                break;
+            }
+            case DemuxFilterEvent::Tag::temi: {
+                getTemiEvent(array, arraySize, event);
+                arraySize++;
+                break;
+            }
+            case DemuxFilterEvent::Tag::monitorEvent: {
+                switch (event.get<DemuxFilterEvent::Tag::monitorEvent>().getTag()) {
+                    case DemuxFilterMonitorEvent::Tag::scramblingStatus: {
+                        getScramblingStatusEvent(array, arraySize, event);
+                        arraySize++;
                         break;
                     }
-                    case DemuxFilterMonitorEvent::hidl_discriminator::cid: {
-                        array = getIpCidChangeEvent(array, eventsExt);
+                    case DemuxFilterMonitorEvent::Tag::cid: {
+                        getIpCidChangeEvent(array, arraySize, event);
+                        arraySize++;
                         break;
                     }
                     default: {
+                        ALOGE("FilterClientCallbackImpl::onFilterEvent: unknown MonitorEvent");
                         break;
                     }
                 }
                 break;
             }
-            case DemuxFilterEventExt::Event::hidl_discriminator::startId: {
-                array = getRestartEvent(array, eventsExt);
+            case DemuxFilterEvent::Tag::startId: {
+                getRestartEvent(array, arraySize, event);
+                arraySize++;
                 break;
             }
             default: {
-                break;
-            }
-        }
-    }
-
-    if (!events.empty()) {
-        array = env->NewObjectArray(events.size(), eventClazz, NULL);
-        auto event = events[0];
-        switch (event.getDiscriminator()) {
-            case DemuxFilterEvent::Event::hidl_discriminator::media: {
-                array = getMediaEvent(array, events);
-                break;
-            }
-            case DemuxFilterEvent::Event::hidl_discriminator::section: {
-                array = getSectionEvent(array, events);
-                break;
-            }
-            case DemuxFilterEvent::Event::hidl_discriminator::pes: {
-                array = getPesEvent(array, events);
-                break;
-            }
-            case DemuxFilterEvent::Event::hidl_discriminator::tsRecord: {
-                array = getTsRecordEvent(array, events, eventsExt);
-                break;
-            }
-            case DemuxFilterEvent::Event::hidl_discriminator::mmtpRecord: {
-                array = getMmtpRecordEvent(array, events, eventsExt);
-                break;
-            }
-            case DemuxFilterEvent::Event::hidl_discriminator::download: {
-                array = getDownloadEvent(array, events);
-                break;
-            }
-            case DemuxFilterEvent::Event::hidl_discriminator::ipPayload: {
-                array = getIpPayloadEvent(array, events);
-                break;
-            }
-            case DemuxFilterEvent::Event::hidl_discriminator::temi: {
-                array = getTemiEvent(array, events);
-                break;
-            }
-            default: {
+                ALOGE("FilterClientCallbackImpl::onFilterEvent: unknown DemuxFilterEvent");
                 break;
             }
         }
@@ -846,22 +895,13 @@
                 gFields.onFilterEventID,
                 array);
     } else {
-        ALOGE("FilterClientCallbackImpl::onFilterEvent_1_1:"
-                "Filter object has been freed. Ignoring callback.");
+        ALOGE("FilterClientCallbackImpl::onFilterEvent:"
+              "Filter object has been freed. Ignoring callback.");
     }
 }
 
-void FilterClientCallbackImpl::onFilterEvent(const DemuxFilterEvent& filterEvent) {
-    ALOGD("FilterClientCallbackImpl::onFilterEvent");
-    std::vector<DemuxFilterEventExt::Event> emptyEventsExt;
-    DemuxFilterEventExt emptyFilterEventExt {
-            .events = emptyEventsExt,
-    };
-    return onFilterEvent_1_1(filterEvent, emptyFilterEventExt);
-}
-
 void FilterClientCallbackImpl::onFilterStatus(const DemuxFilterStatus status) {
-    ALOGD("FilterClientCallbackImpl::onFilterStatus");
+    ALOGV("FilterClientCallbackImpl::onFilterStatus");
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jobject filter(env->NewLocalRef(mFilterObj));
     if (!env->IsSameObject(filter, nullptr)) {
@@ -876,7 +916,7 @@
 }
 
 void FilterClientCallbackImpl::setFilter(jweak filterObj, sp<FilterClient> filterClient) {
-    ALOGD("FilterClientCallbackImpl::setFilter");
+    ALOGV("FilterClientCallbackImpl::setFilter");
     // Java Object
     mFilterObj = filterObj;
     mFilterClient = filterClient;
@@ -884,19 +924,18 @@
 
 FilterClientCallbackImpl::~FilterClientCallbackImpl() {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
-    if (mFilterObj != NULL) {
+    if (mFilterObj != nullptr) {
         env->DeleteWeakGlobalRef(mFilterObj);
-        mFilterObj = NULL;
+        mFilterObj = nullptr;
     }
-    mFilterClient = NULL;
+    mFilterClient = nullptr;
 }
 
 /////////////// FrontendClientCallbackImpl ///////////////////////
-
 FrontendClientCallbackImpl::FrontendClientCallbackImpl(jweak tunerObj) : mObject(tunerObj) {}
 
 void FrontendClientCallbackImpl::onEvent(FrontendEventType frontendEventType) {
-    ALOGD("FrontendClientCallbackImpl::onEvent, type=%d", frontendEventType);
+    ALOGV("FrontendClientCallbackImpl::onEvent, type=%d", frontendEventType);
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jobject frontend(env->NewLocalRef(mObject));
     if (!env->IsSameObject(frontend, nullptr)) {
@@ -912,7 +951,7 @@
 
 void FrontendClientCallbackImpl::onScanMessage(
         FrontendScanMessageType type, const FrontendScanMessage& message) {
-    ALOGD("FrontendClientCallbackImpl::onScanMessage, type=%d", type);
+    ALOGV("FrontendClientCallbackImpl::onScanMessage, type=%d", type);
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jclass clazz = env->FindClass("android/media/tv/tuner/Tuner");
     jobject frontend(env->NewLocalRef(mObject));
@@ -923,7 +962,7 @@
     }
     switch(type) {
         case FrontendScanMessageType::LOCKED: {
-            if (message.isLocked()) {
+            if (message.get<FrontendScanMessage::Tag::isLocked>()) {
                 env->CallVoidMethod(
                         frontend,
                         env->GetMethodID(clazz, "onLocked", "()V"));
@@ -931,7 +970,7 @@
             break;
         }
         case FrontendScanMessageType::END: {
-            if (message.isEnd()) {
+            if (message.get<FrontendScanMessage::Tag::isEnd>()) {
                 env->CallVoidMethod(
                         frontend,
                         env->GetMethodID(clazz, "onScanStopped", "()V"));
@@ -939,14 +978,12 @@
             break;
         }
         case FrontendScanMessageType::PROGRESS_PERCENT: {
-            env->CallVoidMethod(
-                    frontend,
-                    env->GetMethodID(clazz, "onProgress", "(I)V"),
-                    (jint) message.progressPercent());
+            env->CallVoidMethod(frontend, env->GetMethodID(clazz, "onProgress", "(I)V"),
+                                (jint)message.get<FrontendScanMessage::Tag::progressPercent>());
             break;
         }
         case FrontendScanMessageType::FREQUENCY: {
-            std::vector<uint32_t> v = message.frequencies();
+            std::vector<int32_t> v = message.get<FrontendScanMessage::Tag::frequencies>();
             jintArray freqs = env->NewIntArray(v.size());
             env->SetIntArrayRegion(freqs, 0, v.size(), reinterpret_cast<jint*>(&v[0]));
 
@@ -957,7 +994,7 @@
             break;
         }
         case FrontendScanMessageType::SYMBOL_RATE: {
-            std::vector<uint32_t> v = message.symbolRates();
+            std::vector<int32_t> v = message.get<FrontendScanMessage::Tag::symbolRates>();
             jintArray symbolRates = env->NewIntArray(v.size());
             env->SetIntArrayRegion(symbolRates, 0, v.size(), reinterpret_cast<jint*>(&v[0]));
 
@@ -968,21 +1005,17 @@
             break;
         }
         case FrontendScanMessageType::HIERARCHY: {
-            env->CallVoidMethod(
-                    frontend,
-                    env->GetMethodID(clazz, "onHierarchy", "(I)V"),
-                    (jint) message.hierarchy());
+            env->CallVoidMethod(frontend, env->GetMethodID(clazz, "onHierarchy", "(I)V"),
+                                (jint)message.get<FrontendScanMessage::Tag::hierarchy>());
             break;
         }
         case FrontendScanMessageType::ANALOG_TYPE: {
-            env->CallVoidMethod(
-                    frontend,
-                    env->GetMethodID(clazz, "onSignalType", "(I)V"),
-                    (jint) message.analogType());
+            env->CallVoidMethod(frontend, env->GetMethodID(clazz, "onSignalType", "(I)V"),
+                                (jint)message.get<FrontendScanMessage::Tag::analogType>());
             break;
         }
         case FrontendScanMessageType::PLP_IDS: {
-            std::vector<uint8_t> v = message.plpIds();
+            std::vector<uint8_t> v = message.get<FrontendScanMessage::Tag::plpIds>();
             std::vector<jint> jintV(v.begin(), v.end());
             jintArray plpIds = env->NewIntArray(v.size());
             env->SetIntArrayRegion(plpIds, 0, jintV.size(), &jintV[0]);
@@ -994,7 +1027,7 @@
             break;
         }
         case FrontendScanMessageType::GROUP_IDS: {
-            std::vector<uint8_t> v = message.groupIds();
+            std::vector<uint8_t> v = message.get<FrontendScanMessage::groupIds>();
             std::vector<jint> jintV(v.begin(), v.end());
             jintArray groupIds = env->NewIntArray(v.size());
             env->SetIntArrayRegion(groupIds, 0, jintV.size(), &jintV[0]);
@@ -1006,7 +1039,7 @@
             break;
         }
         case FrontendScanMessageType::INPUT_STREAM_IDS: {
-            std::vector<uint16_t> v = message.inputStreamIds();
+            std::vector<char16_t> v = message.get<FrontendScanMessage::inputStreamIds>();
             std::vector<jint> jintV(v.begin(), v.end());
             jintArray streamIds = env->NewIntArray(v.size());
             env->SetIntArrayRegion(streamIds, 0, jintV.size(), &jintV[0]);
@@ -1018,24 +1051,22 @@
             break;
         }
         case FrontendScanMessageType::STANDARD: {
-            FrontendScanMessage::Standard std = message.std();
+            FrontendScanMessageStandard std = message.get<FrontendScanMessage::std>();
             jint standard;
-            if (std.getDiscriminator() == FrontendScanMessage::Standard::hidl_discriminator::sStd) {
-                standard = (jint) std.sStd();
+            if (std.getTag() == FrontendScanMessageStandard::Tag::sStd) {
+                standard = (jint)std.get<FrontendScanMessageStandard::Tag::sStd>();
                 env->CallVoidMethod(
                         frontend,
                         env->GetMethodID(clazz, "onDvbsStandard", "(I)V"),
                         standard);
-            } else if (std.getDiscriminator() ==
-                    FrontendScanMessage::Standard::hidl_discriminator::tStd) {
-                standard = (jint) std.tStd();
+            } else if (std.getTag() == FrontendScanMessageStandard::Tag::tStd) {
+                standard = (jint)std.get<FrontendScanMessageStandard::Tag::tStd>();
                 env->CallVoidMethod(
                         frontend,
                         env->GetMethodID(clazz, "onDvbtStandard", "(I)V"),
                         standard);
-            } else if (std.getDiscriminator() ==
-                    FrontendScanMessage::Standard::hidl_discriminator::sifStd) {
-                standard = (jint) std.sifStd();
+            } else if (std.getTag() == FrontendScanMessageStandard::Tag::sifStd) {
+                standard = (jint)std.get<FrontendScanMessageStandard::Tag::sifStd>();
                 env->CallVoidMethod(
                         frontend,
                         env->GetMethodID(clazz, "onAnalogSifStandard", "(I)V"),
@@ -1046,8 +1077,9 @@
         case FrontendScanMessageType::ATSC3_PLP_INFO: {
             jclass plpClazz = env->FindClass("android/media/tv/tuner/frontend/Atsc3PlpInfo");
             jmethodID init = env->GetMethodID(plpClazz, "<init>", "(IZ)V");
-            std::vector<FrontendScanAtsc3PlpInfo> plpInfos = message.atsc3PlpInfos();
-            jobjectArray array = env->NewObjectArray(plpInfos.size(), plpClazz, NULL);
+            std::vector<FrontendScanAtsc3PlpInfo> plpInfos =
+                    message.get<FrontendScanMessage::atsc3PlpInfos>();
+            jobjectArray array = env->NewObjectArray(plpInfos.size(), plpClazz, nullptr);
 
             for (int i = 0; i < plpInfos.size(); i++) {
                 auto info = plpInfos[i];
@@ -1064,82 +1096,67 @@
                     array);
             break;
         }
-    }
-}
-
-void FrontendClientCallbackImpl::onScanMessageExt1_1(FrontendScanMessageTypeExt1_1 type,
-        const FrontendScanMessageExt1_1& message) {
-    ALOGD("FrontendClientCallbackImpl::onScanMessageExt1_1, type=%d", type);
-    JNIEnv *env = AndroidRuntime::getJNIEnv();
-    jclass clazz = env->FindClass("android/media/tv/tuner/Tuner");
-    jobject frontend(env->NewLocalRef(mObject));
-    if (env->IsSameObject(frontend, nullptr)) {
-        ALOGE("FrontendClientCallbackImpl::onScanMessageExt1_1:"
-                "Frontend object has been freed. Ignoring callback.");
-        return;
-    }
-    switch(type) {
-        case FrontendScanMessageTypeExt1_1::MODULATION: {
-            jint modulation = -1;
-            switch (message.modulation().getDiscriminator()) {
-                case FrontendModulation::hidl_discriminator::dvbc: {
-                    modulation = (jint) message.modulation().dvbc();
+        case FrontendScanMessageType::MODULATION: {
+            jint modulationType = -1;
+            FrontendModulation modulation = message.get<FrontendScanMessage::modulation>();
+            switch (modulation.getTag()) {
+                case FrontendModulation::Tag::dvbc: {
+                    modulationType = (jint)modulation.get<FrontendModulation::Tag::dvbc>();
                     break;
                 }
-                case FrontendModulation::hidl_discriminator::dvbt: {
-                    modulation = (jint) message.modulation().dvbt();
+                case FrontendModulation::Tag::dvbt: {
+                    modulationType = (jint)modulation.get<FrontendModulation::Tag::dvbt>();
                     break;
                 }
-                case FrontendModulation::hidl_discriminator::dvbs: {
-                    modulation = (jint) message.modulation().dvbs();
+                case FrontendModulation::Tag::dvbs: {
+                    modulationType = (jint)modulation.get<FrontendModulation::Tag::dvbs>();
                     break;
                 }
-                case FrontendModulation::hidl_discriminator::isdbs: {
-                    modulation = (jint) message.modulation().isdbs();
+                case FrontendModulation::Tag::isdbs: {
+                    modulationType = (jint)modulation.get<FrontendModulation::Tag::isdbs>();
                     break;
                 }
-                case FrontendModulation::hidl_discriminator::isdbs3: {
-                    modulation = (jint) message.modulation().isdbs3();
+                case FrontendModulation::Tag::isdbs3: {
+                    modulationType = (jint)modulation.get<FrontendModulation::Tag::isdbs3>();
                     break;
                 }
-                case FrontendModulation::hidl_discriminator::isdbt: {
-                    modulation = (jint) message.modulation().isdbt();
+                case FrontendModulation::Tag::isdbt: {
+                    modulationType = (jint)modulation.get<FrontendModulation::Tag::isdbt>();
                     break;
                 }
-                case FrontendModulation::hidl_discriminator::atsc: {
-                    modulation = (jint) message.modulation().atsc();
+                case FrontendModulation::Tag::atsc: {
+                    modulationType = (jint)modulation.get<FrontendModulation::Tag::atsc>();
                     break;
                 }
-                case FrontendModulation::hidl_discriminator::atsc3: {
-                    modulation = (jint) message.modulation().atsc3();
+                case FrontendModulation::Tag::atsc3: {
+                    modulationType = (jint)modulation.get<FrontendModulation::Tag::atsc3>();
                     break;
                 }
-                case FrontendModulation::hidl_discriminator::dtmb: {
-                    modulation = (jint) message.modulation().dtmb();
+                case FrontendModulation::Tag::dtmb: {
+                    modulationType = (jint)modulation.get<FrontendModulation::Tag::dtmb>();
                     break;
                 }
                 default: {
                     break;
                 }
             }
-            if (modulation > 0) {
-                env->CallVoidMethod(
-                        frontend,
-                        env->GetMethodID(clazz, "onModulationReported", "(I)V"),
-                        modulation);
+            if (modulationType > 0) {
+                env->CallVoidMethod(frontend,
+                                    env->GetMethodID(clazz, "onModulationReported", "(I)V"),
+                                    modulationType);
             }
             break;
         }
-        case FrontendScanMessageTypeExt1_1::HIGH_PRIORITY: {
-            bool isHighPriority = message.isHighPriority();
+        case FrontendScanMessageType::HIGH_PRIORITY: {
+            bool isHighPriority = message.get<FrontendScanMessage::Tag::isHighPriority>();
             env->CallVoidMethod(
                     frontend,
                     env->GetMethodID(clazz, "onPriorityReported", "(Z)V"),
                     isHighPriority);
             break;
         }
-        case FrontendScanMessageTypeExt1_1::DVBC_ANNEX: {
-            jint dvbcAnnex = (jint) message.annex();
+        case FrontendScanMessageType::DVBC_ANNEX: {
+            jint dvbcAnnex = (jint)message.get<FrontendScanMessage::Tag::annex>();
             env->CallVoidMethod(
                     frontend,
                     env->GetMethodID(clazz, "onDvbcAnnexReported", "(I)V"),
@@ -1153,59 +1170,57 @@
 
 FrontendClientCallbackImpl::~FrontendClientCallbackImpl() {
     JNIEnv *env = AndroidRuntime::getJNIEnv();
-    if (mObject != NULL) {
+    if (mObject != nullptr) {
         env->DeleteWeakGlobalRef(mObject);
-        mObject = NULL;
+        mObject = nullptr;
     }
 }
 
 /////////////// Tuner ///////////////////////
-
 sp<TunerClient> JTuner::mTunerClient;
 
-JTuner::JTuner(JNIEnv *env, jobject thiz)
-    : mClass(NULL) {
+JTuner::JTuner(JNIEnv *env, jobject thiz) : mClass(nullptr) {
     jclass clazz = env->GetObjectClass(thiz);
-    CHECK(clazz != NULL);
+    CHECK(clazz != nullptr);
 
     mClass = (jclass)env->NewGlobalRef(clazz);
     mObject = env->NewWeakGlobalRef(thiz);
-    if (mTunerClient == NULL) {
+    if (mTunerClient == nullptr) {
         mTunerClient = new TunerClient();
     }
 
-    mSharedFeId = (int) Constant::INVALID_FRONTEND_ID;
+    mSharedFeId = (int)Constant::INVALID_FRONTEND_ID;
 }
 
 JTuner::~JTuner() {
-    if (mFeClient != NULL) {
+    if (mFeClient != nullptr) {
         mFeClient->close();
     }
-    if (mDemuxClient != NULL) {
+    if (mDemuxClient != nullptr) {
         mDemuxClient->close();
     }
     JNIEnv *env = AndroidRuntime::getJNIEnv();
 
     env->DeleteWeakGlobalRef(mObject);
     env->DeleteGlobalRef(mClass);
-    mTunerClient = NULL;
-    mFeClient = NULL;
-    mDemuxClient = NULL;
-    mClass = NULL;
-    mObject = NULL;
+    mTunerClient = nullptr;
+    mFeClient = nullptr;
+    mDemuxClient = nullptr;
+    mClass = nullptr;
+    mObject = nullptr;
 }
 
 jint JTuner::getTunerVersion() {
-    ALOGD("JTuner::getTunerVersion()");
-    return (jint) mTunerClient->getHalTunerVersion();
+    ALOGV("JTuner::getTunerVersion()");
+    return (jint)mTunerClient->getHalTunerVersion();
 }
 
 jobject JTuner::getFrontendIds() {
-    ALOGD("JTuner::getFrontendIds()");
-    vector<FrontendId> ids = mTunerClient->getFrontendIds();
+    ALOGV("JTuner::getFrontendIds()");
+    vector<int32_t> ids = mTunerClient->getFrontendIds();
     if (ids.size() == 0) {
         ALOGW("Frontend isn't available");
-        return NULL;
+        return nullptr;
     }
 
     JNIEnv *env = AndroidRuntime::getJNIEnv();
@@ -1216,9 +1231,9 @@
     jclass integerClazz = env->FindClass("java/lang/Integer");
     jmethodID intInit = env->GetMethodID(integerClazz, "<init>", "(I)V");
 
-    for (int i=0; i < ids.size(); i++) {
-       jobject idObj = env->NewObject(integerClazz, intInit, ids[i]);
-       env->CallBooleanMethod(obj, arrayListAdd, idObj);
+    for (int i = 0; i < ids.size(); i++) {
+        jobject idObj = env->NewObject(integerClazz, intInit, ids[i]);
+        env->CallBooleanMethod(obj, arrayListAdd, idObj);
     }
     return obj;
 }
@@ -1226,14 +1241,14 @@
 jobject JTuner::openFrontendByHandle(int feHandle) {
     // TODO: Handle reopening frontend with different handle
     sp<FrontendClient> feClient = mTunerClient->openFrontend(feHandle);
-    if (feClient == NULL) {
+    if (feClient == nullptr) {
         ALOGE("Failed to open frontend");
-        return NULL;
+        return nullptr;
     }
     mFeClient = feClient;
 
     mFeId = mFeClient->getId();
-    if (mDemuxClient != NULL) {
+    if (mDemuxClient != nullptr) {
         mDemuxClient->setFrontendDataSource(mFeClient);
     }
 
@@ -1242,7 +1257,7 @@
     if (env->IsSameObject(tuner, nullptr)) {
         ALOGE("openFrontendByHandle"
                 "Tuner object has been freed. Failed to open frontend.");
-        return NULL;
+        return nullptr;
     }
 
     sp<FrontendClientCallbackImpl> feClientCb =
@@ -1257,7 +1272,7 @@
 }
 
 int JTuner::shareFrontend(int feId) {
-    if (mFeClient != NULL) {
+    if (mFeClient != nullptr) {
         ALOGE("Cannot share frontend:%d because this session is already holding %d",
               feId, mFeClient->getId());
         return (int)Result::INVALID_STATE;
@@ -1267,127 +1282,124 @@
     return (int)Result::SUCCESS;
 }
 
-jobject JTuner::getAnalogFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps) {
+jobject JTuner::getAnalogFrontendCaps(JNIEnv *env, FrontendCapabilities &caps) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/AnalogFrontendCapabilities");
     jmethodID capsInit = env->GetMethodID(clazz, "<init>", "(II)V");
 
-    jint typeCap = caps.analogCaps().typeCap;
-    jint sifStandardCap = caps.analogCaps().sifStandardCap;
+    jint typeCap = caps.get<FrontendCapabilities::Tag::analogCaps>().typeCap;
+    jint sifStandardCap = caps.get<FrontendCapabilities::Tag::analogCaps>().sifStandardCap;
     return env->NewObject(clazz, capsInit, typeCap, sifStandardCap);
 }
 
-jobject JTuner::getAtsc3FrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps) {
+jobject JTuner::getAtsc3FrontendCaps(JNIEnv *env, FrontendCapabilities &caps) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/Atsc3FrontendCapabilities");
     jmethodID capsInit = env->GetMethodID(clazz, "<init>", "(IIIIII)V");
 
-    jint bandwidthCap = caps.atsc3Caps().bandwidthCap;
-    jint modulationCap = caps.atsc3Caps().modulationCap;
-    jint timeInterleaveModeCap = caps.atsc3Caps().timeInterleaveModeCap;
-    jint codeRateCap = caps.atsc3Caps().codeRateCap;
-    jint fecCap = caps.atsc3Caps().fecCap;
-    jint demodOutputFormatCap = caps.atsc3Caps().demodOutputFormatCap;
+    jint bandwidthCap = caps.get<FrontendCapabilities::Tag::atsc3Caps>().bandwidthCap;
+    jint modulationCap = caps.get<FrontendCapabilities::Tag::atsc3Caps>().modulationCap;
+    jint timeInterleaveModeCap =
+            caps.get<FrontendCapabilities::Tag::atsc3Caps>().timeInterleaveModeCap;
+    jint codeRateCap = caps.get<FrontendCapabilities::Tag::atsc3Caps>().codeRateCap;
+    jint fecCap = caps.get<FrontendCapabilities::Tag::atsc3Caps>().fecCap;
+    jint demodOutputFormatCap =
+            caps.get<FrontendCapabilities::Tag::atsc3Caps>().demodOutputFormatCap;
 
     return env->NewObject(clazz, capsInit, bandwidthCap, modulationCap, timeInterleaveModeCap,
             codeRateCap, fecCap, demodOutputFormatCap);
 }
 
-jobject JTuner::getAtscFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps) {
+jobject JTuner::getAtscFrontendCaps(JNIEnv *env, FrontendCapabilities &caps) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/AtscFrontendCapabilities");
     jmethodID capsInit = env->GetMethodID(clazz, "<init>", "(I)V");
 
-    jint modulationCap = caps.atscCaps().modulationCap;
+    jint modulationCap = caps.get<FrontendCapabilities::Tag::atscCaps>().modulationCap;
 
     return env->NewObject(clazz, capsInit, modulationCap);
 }
 
-jobject JTuner::getDvbcFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps) {
+jobject JTuner::getDvbcFrontendCaps(JNIEnv *env, FrontendCapabilities &caps) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbcFrontendCapabilities");
     jmethodID capsInit = env->GetMethodID(clazz, "<init>", "(IJI)V");
 
-    jint modulationCap = caps.dvbcCaps().modulationCap;
-    jlong fecCap = caps.dvbcCaps().fecCap;
-    jint annexCap = caps.dvbcCaps().annexCap;
+    jint modulationCap = caps.get<FrontendCapabilities::Tag::dvbcCaps>().modulationCap;
+    jlong fecCap = caps.get<FrontendCapabilities::Tag::dvbcCaps>().fecCap;
+    jint annexCap = caps.get<FrontendCapabilities::Tag::dvbcCaps>().annexCap;
 
     return env->NewObject(clazz, capsInit, modulationCap, fecCap, annexCap);
 }
 
-jobject JTuner::getDvbsFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps) {
+jobject JTuner::getDvbsFrontendCaps(JNIEnv *env, FrontendCapabilities &caps) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbsFrontendCapabilities");
     jmethodID capsInit = env->GetMethodID(clazz, "<init>", "(IJI)V");
 
-    jint modulationCap = caps.dvbsCaps().modulationCap;
-    jlong innerfecCap = caps.dvbsCaps().innerfecCap;
-    jint standard = caps.dvbsCaps().standard;
+    jint modulationCap = caps.get<FrontendCapabilities::Tag::dvbsCaps>().modulationCap;
+    jlong innerfecCap = caps.get<FrontendCapabilities::Tag::dvbsCaps>().innerfecCap;
+    jint standard = caps.get<FrontendCapabilities::Tag::dvbsCaps>().standard;
 
     return env->NewObject(clazz, capsInit, modulationCap, innerfecCap, standard);
 }
 
-jobject JTuner::getDvbtFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps) {
+jobject JTuner::getDvbtFrontendCaps(JNIEnv *env, FrontendCapabilities &caps) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbtFrontendCapabilities");
     jmethodID capsInit = env->GetMethodID(clazz, "<init>", "(IIIIIIZZ)V");
 
-    jint transmissionModeCap = caps.dvbtCaps().transmissionModeCap;
-    jint bandwidthCap = caps.dvbtCaps().bandwidthCap;
-    jint constellationCap = caps.dvbtCaps().constellationCap;
-    jint coderateCap = caps.dvbtCaps().coderateCap;
-    jint hierarchyCap = caps.dvbtCaps().hierarchyCap;
-    jint guardIntervalCap = caps.dvbtCaps().guardIntervalCap;
-    jboolean isT2Supported = caps.dvbtCaps().isT2Supported;
-    jboolean isMisoSupported = caps.dvbtCaps().isMisoSupported;
+    jint transmissionModeCap = caps.get<FrontendCapabilities::Tag::dvbtCaps>().transmissionModeCap;
+    jint bandwidthCap = caps.get<FrontendCapabilities::Tag::dvbtCaps>().bandwidthCap;
+    jint constellationCap = caps.get<FrontendCapabilities::Tag::dvbtCaps>().constellationCap;
+    jint coderateCap = caps.get<FrontendCapabilities::Tag::dvbtCaps>().coderateCap;
+    jint hierarchyCap = caps.get<FrontendCapabilities::Tag::dvbtCaps>().hierarchyCap;
+    jint guardIntervalCap = caps.get<FrontendCapabilities::Tag::dvbtCaps>().guardIntervalCap;
+    jboolean isT2Supported = caps.get<FrontendCapabilities::Tag::dvbtCaps>().isT2Supported;
+    jboolean isMisoSupported = caps.get<FrontendCapabilities::Tag::dvbtCaps>().isMisoSupported;
 
     return env->NewObject(clazz, capsInit, transmissionModeCap, bandwidthCap, constellationCap,
             coderateCap, hierarchyCap, guardIntervalCap, isT2Supported, isMisoSupported);
 }
 
-jobject JTuner::getIsdbs3FrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps) {
+jobject JTuner::getIsdbs3FrontendCaps(JNIEnv *env, FrontendCapabilities &caps) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/Isdbs3FrontendCapabilities");
     jmethodID capsInit = env->GetMethodID(clazz, "<init>", "(II)V");
 
-    jint modulationCap = caps.isdbs3Caps().modulationCap;
-    jint coderateCap = caps.isdbs3Caps().coderateCap;
+    jint modulationCap = caps.get<FrontendCapabilities::Tag::isdbs3Caps>().modulationCap;
+    jint coderateCap = caps.get<FrontendCapabilities::Tag::isdbs3Caps>().coderateCap;
 
     return env->NewObject(clazz, capsInit, modulationCap, coderateCap);
 }
 
-jobject JTuner::getIsdbsFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps) {
+jobject JTuner::getIsdbsFrontendCaps(JNIEnv *env, FrontendCapabilities &caps) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/IsdbsFrontendCapabilities");
     jmethodID capsInit = env->GetMethodID(clazz, "<init>", "(II)V");
 
-    jint modulationCap = caps.isdbsCaps().modulationCap;
-    jint coderateCap = caps.isdbsCaps().coderateCap;
+    jint modulationCap = caps.get<FrontendCapabilities::Tag::isdbsCaps>().modulationCap;
+    jint coderateCap = caps.get<FrontendCapabilities::Tag::isdbsCaps>().coderateCap;
 
     return env->NewObject(clazz, capsInit, modulationCap, coderateCap);
 }
 
-jobject JTuner::getIsdbtFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps) {
+jobject JTuner::getIsdbtFrontendCaps(JNIEnv *env, FrontendCapabilities &caps) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/IsdbtFrontendCapabilities");
     jmethodID capsInit = env->GetMethodID(clazz, "<init>", "(IIIII)V");
 
-    jint modeCap = caps.isdbtCaps().modeCap;
-    jint bandwidthCap = caps.isdbtCaps().bandwidthCap;
-    jint modulationCap = caps.isdbtCaps().modulationCap;
-    jint coderateCap = caps.isdbtCaps().coderateCap;
-    jint guardIntervalCap = caps.isdbtCaps().guardIntervalCap;
+    jint modeCap = caps.get<FrontendCapabilities::Tag::isdbtCaps>().modeCap;
+    jint bandwidthCap = caps.get<FrontendCapabilities::Tag::isdbtCaps>().bandwidthCap;
+    jint modulationCap = caps.get<FrontendCapabilities::Tag::isdbtCaps>().modulationCap;
+    jint coderateCap = caps.get<FrontendCapabilities::Tag::isdbtCaps>().coderateCap;
+    jint guardIntervalCap = caps.get<FrontendCapabilities::Tag::isdbtCaps>().guardIntervalCap;
 
     return env->NewObject(clazz, capsInit, modeCap, bandwidthCap, modulationCap, coderateCap,
             guardIntervalCap);
 }
 
-jobject JTuner::getDtmbFrontendCaps(JNIEnv *env, int id) {
+jobject JTuner::getDtmbFrontendCaps(JNIEnv *env, FrontendCapabilities &caps) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DtmbFrontendCapabilities");
     jmethodID capsInit = env->GetMethodID(clazz, "<init>", "(IIIIII)V");
 
-    shared_ptr<FrontendDtmbCapabilities> dtmbCaps = mTunerClient->getFrontendDtmbCapabilities(id);
-    if (dtmbCaps == NULL) {
-        return NULL;
-    }
-
-    jint modulationCap = dtmbCaps->modulationCap;
-    jint transmissionModeCap = dtmbCaps->transmissionModeCap;
-    jint guardIntervalCap = dtmbCaps->guardIntervalCap;
-    jint interleaveModeCap = dtmbCaps->interleaveModeCap;
-    jint codeRateCap = dtmbCaps->codeRateCap;
-    jint bandwidthCap = dtmbCaps->bandwidthCap;
+    jint modulationCap = caps.get<FrontendCapabilities::Tag::dtmbCaps>().modulationCap;
+    jint transmissionModeCap = caps.get<FrontendCapabilities::Tag::dtmbCaps>().transmissionModeCap;
+    jint guardIntervalCap = caps.get<FrontendCapabilities::Tag::dtmbCaps>().guardIntervalCap;
+    jint interleaveModeCap = caps.get<FrontendCapabilities::Tag::dtmbCaps>().interleaveModeCap;
+    jint codeRateCap = caps.get<FrontendCapabilities::Tag::dtmbCaps>().codeRateCap;
+    jint bandwidthCap = caps.get<FrontendCapabilities::Tag::dtmbCaps>().bandwidthCap;
 
     return env->NewObject(clazz, capsInit, modulationCap, transmissionModeCap, guardIntervalCap,
             interleaveModeCap, codeRateCap, bandwidthCap);
@@ -1396,8 +1408,8 @@
 jobject JTuner::getFrontendInfo(int id) {
     shared_ptr<FrontendInfo> feInfo;
     feInfo = mTunerClient->getFrontendInfo(id);
-    if (feInfo == NULL) {
-        return NULL;
+    if (feInfo == nullptr) {
+        return nullptr;
     }
 
     JNIEnv *env = AndroidRuntime::getJNIEnv();
@@ -1416,70 +1428,60 @@
     env->SetIntArrayRegion(
             statusCaps, 0, feInfo->statusCaps.size(),
             reinterpret_cast<jint*>(&feInfo->statusCaps[0]));
-    FrontendInfo::FrontendCapabilities caps = feInfo->frontendCaps;
+    FrontendCapabilities caps = feInfo->frontendCaps;
 
-    jobject jcaps = NULL;
-
-    if (feInfo->type == static_cast<FrontendType>(
-            ::android::hardware::tv::tuner::V1_1::FrontendType::DTMB)) {
-        jcaps = getDtmbFrontendCaps(env, id);
-    }
-
+    jobject jcaps = nullptr;
     switch(feInfo->type) {
         case FrontendType::ANALOG:
-            if (FrontendInfo::FrontendCapabilities::hidl_discriminator::analogCaps
-                    == caps.getDiscriminator()) {
+            if (FrontendCapabilities::Tag::analogCaps == caps.getTag()) {
                 jcaps = getAnalogFrontendCaps(env, caps);
             }
             break;
         case FrontendType::ATSC3:
-            if (FrontendInfo::FrontendCapabilities::hidl_discriminator::atsc3Caps
-                    == caps.getDiscriminator()) {
+            if (FrontendCapabilities::Tag::atsc3Caps == caps.getTag()) {
                 jcaps = getAtsc3FrontendCaps(env, caps);
             }
             break;
         case FrontendType::ATSC:
-            if (FrontendInfo::FrontendCapabilities::hidl_discriminator::atscCaps
-                    == caps.getDiscriminator()) {
+            if (FrontendCapabilities::Tag::atscCaps == caps.getTag()) {
                 jcaps = getAtscFrontendCaps(env, caps);
             }
             break;
         case FrontendType::DVBC:
-            if (FrontendInfo::FrontendCapabilities::hidl_discriminator::dvbcCaps
-                    == caps.getDiscriminator()) {
+            if (FrontendCapabilities::Tag::dvbcCaps == caps.getTag()) {
                 jcaps = getDvbcFrontendCaps(env, caps);
             }
             break;
         case FrontendType::DVBS:
-            if (FrontendInfo::FrontendCapabilities::hidl_discriminator::dvbsCaps
-                    == caps.getDiscriminator()) {
+            if (FrontendCapabilities::Tag::dvbsCaps == caps.getTag()) {
                 jcaps = getDvbsFrontendCaps(env, caps);
             }
             break;
         case FrontendType::DVBT:
-            if (FrontendInfo::FrontendCapabilities::hidl_discriminator::dvbtCaps
-                    == caps.getDiscriminator()) {
+            if (FrontendCapabilities::Tag::dvbtCaps == caps.getTag()) {
                 jcaps = getDvbtFrontendCaps(env, caps);
             }
             break;
         case FrontendType::ISDBS:
-            if (FrontendInfo::FrontendCapabilities::hidl_discriminator::isdbsCaps
-                    == caps.getDiscriminator()) {
+            if (FrontendCapabilities::Tag::isdbsCaps == caps.getTag()) {
                 jcaps = getIsdbsFrontendCaps(env, caps);
             }
             break;
         case FrontendType::ISDBS3:
-            if (FrontendInfo::FrontendCapabilities::hidl_discriminator::isdbs3Caps
-                    == caps.getDiscriminator()) {
+            if (FrontendCapabilities::Tag::isdbs3Caps == caps.getTag()) {
                 jcaps = getIsdbs3FrontendCaps(env, caps);
             }
             break;
         case FrontendType::ISDBT:
-            if (FrontendInfo::FrontendCapabilities::hidl_discriminator::isdbtCaps
-                    == caps.getDiscriminator()) {
+            if (FrontendCapabilities::Tag::isdbtCaps == caps.getTag()) {
                 jcaps = getIsdbtFrontendCaps(env, caps);
             }
             break;
+        case FrontendType::DTMB:
+            if (FrontendCapabilities::Tag::dtmbCaps == caps.getTag()) {
+                jcaps = getDtmbFrontendCaps(env, caps);
+            }
+            break;
         default:
             break;
     }
@@ -1490,21 +1492,21 @@
 }
 
 jobject JTuner::openLnbByHandle(int handle) {
-    if (mTunerClient == NULL) {
-        return NULL;
+    if (mTunerClient == nullptr) {
+        return nullptr;
     }
 
     sp<LnbClient> lnbClient;
     sp<LnbClientCallbackImpl> callback = new LnbClientCallbackImpl();
     lnbClient = mTunerClient->openLnb(handle);
-    if (lnbClient == NULL) {
+    if (lnbClient == nullptr) {
         ALOGD("Failed to open lnb, handle = %d", handle);
-        return NULL;
+        return nullptr;
     }
 
     if (lnbClient->setCallback(callback) != Result::SUCCESS) {
         ALOGD("Failed to set lnb callback");
-        return NULL;
+        return nullptr;
     }
 
     JNIEnv *env = AndroidRuntime::getJNIEnv();
@@ -1520,8 +1522,8 @@
 }
 
 jobject JTuner::openLnbByName(jstring name) {
-    if (mTunerClient == NULL) {
-        return NULL;
+    if (mTunerClient == nullptr) {
+        return nullptr;
     }
 
     JNIEnv *env = AndroidRuntime::getJNIEnv();
@@ -1529,14 +1531,14 @@
     sp<LnbClient> lnbClient;
     sp<LnbClientCallbackImpl> callback = new LnbClientCallbackImpl();
     lnbClient = mTunerClient->openLnbByName(lnbName);
-    if (lnbClient == NULL) {
+    if (lnbClient == nullptr) {
         ALOGD("Failed to open lnb by name, name = %s", lnbName.c_str());
-        return NULL;
+        return nullptr;
     }
 
     if (lnbClient->setCallback(callback) != Result::SUCCESS) {
         ALOGD("Failed to set lnb callback");
-        return NULL;
+        return nullptr;
     }
 
     jobject lnbObj = env->NewObject(
@@ -1550,12 +1552,12 @@
     return lnbObj;
 }
 
-int JTuner::tune(const FrontendSettings& settings, const FrontendSettingsExt1_1& settingsExt1_1) {
+int JTuner::tune(const FrontendSettings &settings) {
     if (mFeClient == nullptr) {
         ALOGE("frontend is not initialized");
         return (int)Result::INVALID_STATE;
     }
-    return (int) mFeClient->tune(settings, settingsExt1_1);
+    return (int)mFeClient->tune(settings);
 }
 
 int JTuner::stopTune() {
@@ -1566,18 +1568,17 @@
     return (int) mFeClient->stopTune();
 }
 
-int JTuner::scan(const FrontendSettings& settings, FrontendScanType scanType,
-        const FrontendSettingsExt1_1& settingsExt1_1) {
-    if (mFeClient == NULL) {
+int JTuner::scan(const FrontendSettings &settings, FrontendScanType scanType) {
+    if (mFeClient == nullptr) {
         ALOGE("frontend client is not initialized");
         return (int)Result::INVALID_STATE;
     }
-    Result result = mFeClient->scan(settings, scanType, settingsExt1_1);
+    Result result = mFeClient->scan(settings, scanType);
     return (int)result;
 }
 
 int JTuner::stopScan() {
-    if (mFeClient == NULL) {
+    if (mFeClient == nullptr) {
         ALOGE("frontend client is not initialized");
         return (int)Result::INVALID_STATE;
     }
@@ -1586,11 +1587,11 @@
 }
 
 int JTuner::setLnb(sp<LnbClient> lnbClient) {
-    if (mFeClient == NULL) {
+    if (mFeClient == nullptr) {
         ALOGE("frontend client is not initialized");
         return (int)Result::INVALID_STATE;
     }
-    if (lnbClient == NULL) {
+    if (lnbClient == nullptr) {
         ALOGE("lnb is not initialized");
         return (int)Result::INVALID_STATE;
     }
@@ -1599,7 +1600,7 @@
 }
 
 int JTuner::setLna(bool enable) {
-    if (mFeClient == NULL) {
+    if (mFeClient == nullptr) {
         ALOGE("frontend client is not initialized");
         return (int)Result::INVALID_STATE;
     }
@@ -1614,13 +1615,13 @@
 
     if (mDemuxClient == nullptr) {
         mDemuxClient = mTunerClient->openDemux(handle);
-        if (mDemuxClient == NULL) {
+        if (mDemuxClient == nullptr) {
             ALOGE("Failed to open demux");
             return Result::UNKNOWN_ERROR;
         }
-        if (mFeClient != NULL) {
+        if (mFeClient != nullptr) {
             return mDemuxClient->setFrontendDataSource(mFeClient);
-        } else if (mSharedFeId != (int) Constant::INVALID_FRONTEND_ID) {
+        } else if (mSharedFeId != (int)Constant::INVALID_FRONTEND_ID) {
             return mDemuxClient->setFrontendDataSourceById(mSharedFeId);
         }
     }
@@ -1631,28 +1632,28 @@
 jint JTuner::close() {
     Result res = Result::SUCCESS;
 
-    if (mFeClient != NULL) {
+    if (mFeClient != nullptr) {
         res = mFeClient->close();
         if (res != Result::SUCCESS) {
-            return (jint) res;
+            return (jint)res;
         }
-        mFeClient = NULL;
+        mFeClient = nullptr;
     }
-    if (mDemuxClient != NULL) {
+    if (mDemuxClient != nullptr) {
         res = mDemuxClient->close();
         if (res != Result::SUCCESS) {
-            return (jint) res;
+            return (jint)res;
         }
-        mDemuxClient = NULL;
+        mDemuxClient = nullptr;
     }
 
-    mSharedFeId = (int) Constant::INVALID_FRONTEND_ID;
-    return (jint) res;
+    mSharedFeId = (int)Constant::INVALID_FRONTEND_ID;
+    return (jint)res;
 }
 
 jobject JTuner::getAvSyncHwId(sp<FilterClient> filterClient) {
-    if (mDemuxClient == NULL) {
-        return NULL;
+    if (mDemuxClient == nullptr) {
+        return nullptr;
     }
 
     int avSyncHwId = mDemuxClient->getAvSyncHwId(filterClient);
@@ -1662,12 +1663,12 @@
         jmethodID intInit = env->GetMethodID(integerClazz, "<init>", "(I)V");
         return env->NewObject(integerClazz, intInit, avSyncHwId);
     }
-    return NULL;
+    return nullptr;
 }
 
 jobject JTuner::getAvSyncTime(jint id) {
-    if (mDemuxClient == NULL) {
-        return NULL;
+    if (mDemuxClient == nullptr) {
+        return nullptr;
     }
     long time = mDemuxClient->getAvSyncTime((int)id);
     if (time >= 0) {
@@ -1676,19 +1677,18 @@
         jmethodID longInit = env->GetMethodID(longClazz, "<init>", "(J)V");
         return env->NewObject(longClazz, longInit, static_cast<jlong>(time));
     }
-    return NULL;
+    return nullptr;
 }
 
 int JTuner::connectCiCam(jint id) {
-    if (mDemuxClient == NULL) {
+    if (mDemuxClient == nullptr) {
         return (int)Result::NOT_INITIALIZED;
     }
-    Result r = mDemuxClient->connectCiCam((int)id);
-    return (int) r;
+    return (int)mDemuxClient->connectCiCam((int)id);
 }
 
 int JTuner::linkCiCam(int id) {
-    if (mFeClient == NULL) {
+    if (mFeClient == nullptr) {
         ALOGE("frontend client is not initialized");
         return (int)Constant::INVALID_LTS_ID;
     }
@@ -1696,35 +1696,30 @@
 }
 
 int JTuner::disconnectCiCam() {
-    if (mDemuxClient == NULL) {
+    if (mDemuxClient == nullptr) {
         return (int)Result::NOT_INITIALIZED;
     }
-    Result r = mDemuxClient->disconnectCiCam();
-    return (int) r;
+    return (int)mDemuxClient->disconnectCiCam();
 }
 
-
 int JTuner::unlinkCiCam(int id) {
-    if (mFeClient == NULL) {
+    if (mFeClient == nullptr) {
         ALOGE("frontend client is not initialized");
         return (int)Result::INVALID_STATE;
     }
-
-    Result r = mFeClient->unlinkCiCamToFrontend(id);
-
-    return (int) r;
+    return (int)mFeClient->unlinkCiCamToFrontend(id);
 }
 
 jobject JTuner::openDescrambler() {
-    ALOGD("JTuner::openDescrambler");
+    ALOGV("JTuner::openDescrambler");
     if (mTunerClient == nullptr || mDemuxClient == nullptr) {
-        return NULL;
+        return nullptr;
     }
     sp<DescramblerClient> descramblerClient = mTunerClient->openDescrambler(0/*unused*/);
 
-    if (descramblerClient == NULL) {
+    if (descramblerClient == nullptr) {
         ALOGD("Failed to open descrambler");
-        return NULL;
+        return nullptr;
     }
 
     descramblerClient->setDemuxSource(mDemuxClient);
@@ -1742,31 +1737,28 @@
 }
 
 jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) {
-    if (mDemuxClient == NULL) {
-        return NULL;
+    if (mDemuxClient == nullptr) {
+        return nullptr;
     }
 
     sp<FilterClient> filterClient;
     sp<FilterClientCallbackImpl> callback = new FilterClientCallbackImpl();
     filterClient = mDemuxClient->openFilter(type, bufferSize, callback);
-    if (filterClient == NULL) {
+    if (filterClient == nullptr) {
         ALOGD("Failed to open filter, type = %d", type.mainType);
-        return NULL;
+        return nullptr;
     }
-    uint64_t fId;
+    int64_t fId;
     Result res = filterClient->getId64Bit(fId);
     if (res != Result::SUCCESS) {
-        uint32_t id;
+        int32_t id;
         filterClient->getId(id);
-        fId = static_cast<uint64_t>(id);
+        fId = static_cast<int64_t>(id);
     }
 
     JNIEnv *env = AndroidRuntime::getJNIEnv();
-    jobject filterObj =
-            env->NewObject(
-                    env->FindClass("android/media/tv/tuner/filter/Filter"),
-                    gFields.filterInitID,
-                    (jlong) fId);
+    jobject filterObj = env->NewObject(env->FindClass("android/media/tv/tuner/filter/Filter"),
+                                       gFields.filterInitID, (jlong)fId);
 
     filterClient->incStrong(filterObj);
     env->SetLongField(filterObj, gFields.filterContext, (jlong)filterClient.get());
@@ -1776,8 +1768,8 @@
 }
 
 jobject JTuner::openTimeFilter() {
-    if (mDemuxClient == NULL) {
-        return NULL;
+    if (mDemuxClient == nullptr) {
+        return nullptr;
     }
 
     JNIEnv *env = AndroidRuntime::getJNIEnv();
@@ -1786,9 +1778,9 @@
                     env->FindClass("android/media/tv/tuner/filter/TimeFilter"),
                     gFields.timeFilterInitID);
     sp<TimeFilterClient> timeFilterClient = mDemuxClient->openTimeFilter();
-    if (timeFilterClient == NULL) {
+    if (timeFilterClient == nullptr) {
         ALOGD("Failed to open time filter.");
-        return NULL;
+        return nullptr;
     }
     timeFilterClient->incStrong(timeFilterObj);
     env->SetLongField(timeFilterObj, gFields.timeFilterContext, (jlong)timeFilterClient.get());
@@ -1798,15 +1790,15 @@
 
 jobject JTuner::openDvr(DvrType type, jlong bufferSize) {
     ALOGD("JTuner::openDvr");
-    if (mDemuxClient == NULL) {
-        return NULL;
+    if (mDemuxClient == nullptr) {
+        return nullptr;
     }
     sp<DvrClient> dvrClient;
     sp<DvrClientCallbackImpl> callback = new DvrClientCallbackImpl();
     dvrClient = mDemuxClient->openDvr(type, (int) bufferSize, callback);
 
-    if (dvrClient == NULL) {
-        return NULL;
+    if (dvrClient == nullptr) {
+        return nullptr;
     }
 
     JNIEnv *env = AndroidRuntime::getJNIEnv();
@@ -1833,14 +1825,14 @@
 }
 
 jobject JTuner::getDemuxCaps() {
-    if (mTunerClient == NULL) {
-        return NULL;
+    if (mTunerClient == nullptr) {
+        return nullptr;
     }
 
     shared_ptr<DemuxCapabilities> caps;
     caps = mTunerClient->getDemuxCaps();
-    if (caps == NULL) {
-        return NULL;
+    if (caps == nullptr) {
+        return nullptr;
     }
 
     JNIEnv *env = AndroidRuntime::getJNIEnv();
@@ -1870,25 +1862,19 @@
 }
 
 jobject JTuner::getFrontendStatus(jintArray types) {
-    if (mFeClient == NULL) {
-        return NULL;
+    if (mFeClient == nullptr) {
+        return nullptr;
     }
     JNIEnv *env = AndroidRuntime::getJNIEnv();
     jsize size = env->GetArrayLength(types);
     jint intTypes[size];
     env->GetIntArrayRegion(types, 0, size, intTypes);
     std::vector<FrontendStatusType> v;
-    std::vector<FrontendStatusTypeExt1_1> v_1_1;
     for (int i = 0; i < size; i++) {
-        if (isV1_1ExtendedStatusType(intTypes[i])) {
-            v_1_1.push_back(static_cast<FrontendStatusTypeExt1_1>(intTypes[i]));
-        } else {
-            v.push_back(static_cast<FrontendStatusType>(intTypes[i]));
-        }
+        v.push_back(static_cast<FrontendStatusType>(intTypes[i]));
     }
 
-    hidl_vec<FrontendStatus> status = mFeClient->getStatus(v);
-    hidl_vec<FrontendStatusExt1_1> status_1_1 = mFeClient->getStatusExtended_1_1(v_1_1);
+    vector<FrontendStatus> status = mFeClient->getStatus(v);
 
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/FrontendStatus");
     jmethodID init = env->GetMethodID(clazz, "<init>", "()V");
@@ -1900,96 +1886,114 @@
     jmethodID initBoolean = env->GetMethodID(booleanClazz, "<init>", "(Z)V");
 
     for (auto s : status) {
-        switch(s.getDiscriminator()) {
-            case FrontendStatus::hidl_discriminator::isDemodLocked: {
+        switch (s.getTag()) {
+            case FrontendStatus::Tag::isDemodLocked: {
                 jfieldID field = env->GetFieldID(clazz, "mIsDemodLocked", "Ljava/lang/Boolean;");
-                jobject newBooleanObj = env->NewObject(
-                        booleanClazz, initBoolean, static_cast<jboolean>(s.isDemodLocked()));
+                jobject newBooleanObj =
+                        env->NewObject(booleanClazz, initBoolean,
+                                       static_cast<jboolean>(
+                                               s.get<FrontendStatus::Tag::isDemodLocked>()));
                 env->SetObjectField(statusObj, field, newBooleanObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::snr: {
+            case FrontendStatus::Tag::snr: {
                 jfieldID field = env->GetFieldID(clazz, "mSnr", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.snr()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(s.get<FrontendStatus::Tag::snr>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::ber: {
+            case FrontendStatus::Tag::ber: {
                 jfieldID field = env->GetFieldID(clazz, "mBer", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.ber()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(s.get<FrontendStatus::Tag::ber>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::per: {
+            case FrontendStatus::Tag::per: {
                 jfieldID field = env->GetFieldID(clazz, "mPer", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.per()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(s.get<FrontendStatus::Tag::per>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::preBer: {
+            case FrontendStatus::Tag::preBer: {
                 jfieldID field = env->GetFieldID(clazz, "mPerBer", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.preBer()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(s.get<FrontendStatus::Tag::preBer>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::signalQuality: {
+            case FrontendStatus::Tag::signalQuality: {
                 jfieldID field = env->GetFieldID(clazz, "mSignalQuality", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.signalQuality()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(
+                                               s.get<FrontendStatus::Tag::signalQuality>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::signalStrength: {
+            case FrontendStatus::Tag::signalStrength: {
                 jfieldID field = env->GetFieldID(clazz, "mSignalStrength", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.signalStrength()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(
+                                               s.get<FrontendStatus::Tag::signalStrength>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::symbolRate: {
+            case FrontendStatus::Tag::symbolRate: {
                 jfieldID field = env->GetFieldID(clazz, "mSymbolRate", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.symbolRate()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(s.get<FrontendStatus::Tag::symbolRate>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::innerFec: {
+            case FrontendStatus::Tag::innerFec: {
                 jfieldID field = env->GetFieldID(clazz, "mInnerFec", "Ljava/lang/Long;");
                 jclass longClazz = env->FindClass("java/lang/Long");
                 jmethodID initLong = env->GetMethodID(longClazz, "<init>", "(J)V");
-                jobject newLongObj = env->NewObject(
-                        longClazz, initLong, static_cast<jlong>(s.innerFec()));
+                jobject newLongObj =
+                        env->NewObject(longClazz, initLong,
+                                       static_cast<jlong>(s.get<FrontendStatus::Tag::innerFec>()));
                 env->SetObjectField(statusObj, field, newLongObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::modulation: {
+            case FrontendStatus::Tag::modulationStatus: {
                 jfieldID field = env->GetFieldID(clazz, "mModulation", "Ljava/lang/Integer;");
-                FrontendModulationStatus modulation = s.modulation();
+                FrontendModulationStatus modulation =
+                        s.get<FrontendStatus::Tag::modulationStatus>();
                 jint intModulation;
                 bool valid = true;
-                switch(modulation.getDiscriminator()) {
-                    case FrontendModulationStatus::hidl_discriminator::dvbc: {
-                        intModulation = static_cast<jint>(modulation.dvbc());
+                switch (modulation.getTag()) {
+                    case FrontendModulationStatus::Tag::dvbc: {
+                        intModulation = static_cast<jint>(
+                                modulation.get<FrontendModulationStatus::Tag::dvbc>());
                         break;
                     }
-                    case FrontendModulationStatus::hidl_discriminator::dvbs: {
-                        intModulation = static_cast<jint>(modulation.dvbs());
+                    case FrontendModulationStatus::Tag::dvbs: {
+                        intModulation = static_cast<jint>(
+                                modulation.get<FrontendModulationStatus::Tag::dvbs>());
                         break;
                     }
-                    case FrontendModulationStatus::hidl_discriminator::isdbs: {
-                        intModulation = static_cast<jint>(modulation.isdbs());
+                    case FrontendModulationStatus::Tag::isdbs: {
+                        intModulation = static_cast<jint>(
+                                modulation.get<FrontendModulationStatus::Tag::isdbs>());
                         break;
                     }
-                    case FrontendModulationStatus::hidl_discriminator::isdbs3: {
-                        intModulation = static_cast<jint>(modulation.isdbs3());
+                    case FrontendModulationStatus::Tag::isdbs3: {
+                        intModulation = static_cast<jint>(
+                                modulation.get<FrontendModulationStatus::Tag::isdbs3>());
                         break;
                     }
-                    case FrontendModulationStatus::hidl_discriminator::isdbt: {
-                        intModulation = static_cast<jint>(modulation.isdbt());
+                    case FrontendModulationStatus::Tag::isdbt: {
+                        intModulation = static_cast<jint>(
+                                modulation.get<FrontendModulationStatus::Tag::isdbt>());
                         break;
                     }
                     default: {
@@ -2003,51 +2007,58 @@
                 }
                 break;
             }
-            case FrontendStatus::hidl_discriminator::inversion: {
+            case FrontendStatus::Tag::inversion: {
                 jfieldID field = env->GetFieldID(clazz, "mInversion", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.inversion()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(s.get<FrontendStatus::Tag::inversion>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::lnbVoltage: {
+            case FrontendStatus::Tag::lnbVoltage: {
                 jfieldID field = env->GetFieldID(clazz, "mLnbVoltage", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.lnbVoltage()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(s.get<FrontendStatus::Tag::lnbVoltage>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::plpId: {
+            case FrontendStatus::Tag::plpId: {
                 jfieldID field = env->GetFieldID(clazz, "mPlpId", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.plpId()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(s.get<FrontendStatus::Tag::plpId>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::isEWBS: {
+            case FrontendStatus::Tag::isEWBS: {
                 jfieldID field = env->GetFieldID(clazz, "mIsEwbs", "Ljava/lang/Boolean;");
-                jobject newBooleanObj = env->NewObject(
-                        booleanClazz, initBoolean, static_cast<jboolean>(s.isEWBS()));
+                jobject newBooleanObj =
+                        env->NewObject(booleanClazz, initBoolean,
+                                       static_cast<jboolean>(s.get<FrontendStatus::Tag::isEWBS>()));
                 env->SetObjectField(statusObj, field, newBooleanObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::agc: {
+            case FrontendStatus::Tag::agc: {
                 jfieldID field = env->GetFieldID(clazz, "mAgc", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.agc()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(s.get<FrontendStatus::Tag::agc>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::isLnaOn: {
+            case FrontendStatus::Tag::isLnaOn: {
                 jfieldID field = env->GetFieldID(clazz, "mIsLnaOn", "Ljava/lang/Boolean;");
-                jobject newBooleanObj = env->NewObject(
-                        booleanClazz, initBoolean, static_cast<jboolean>(s.isLnaOn()));
+                jobject newBooleanObj =
+                        env->NewObject(booleanClazz, initBoolean,
+                                       static_cast<jboolean>(
+                                               s.get<FrontendStatus::Tag::isLnaOn>()));
                 env->SetObjectField(statusObj, field, newBooleanObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::isLayerError: {
+            case FrontendStatus::Tag::isLayerError: {
                 jfieldID field = env->GetFieldID(clazz, "mIsLayerErrors", "[Z");
-                hidl_vec<bool> layerErr = s.isLayerError();
+                vector<bool> layerErr = s.get<FrontendStatus::Tag::isLayerError>();
 
                 jbooleanArray valObj = env->NewBooleanArray(layerErr.size());
 
@@ -2058,44 +2069,48 @@
                 env->SetObjectField(statusObj, field, valObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::mer: {
+            case FrontendStatus::Tag::mer: {
                 jfieldID field = env->GetFieldID(clazz, "mMer", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.mer()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(s.get<FrontendStatus::Tag::mer>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::freqOffset: {
+            case FrontendStatus::Tag::freqOffset: {
                 jfieldID field = env->GetFieldID(clazz, "mFreqOffset", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.freqOffset()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(s.get<FrontendStatus::Tag::freqOffset>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::hierarchy: {
+            case FrontendStatus::Tag::hierarchy: {
                 jfieldID field = env->GetFieldID(clazz, "mHierarchy", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.hierarchy()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(s.get<FrontendStatus::Tag::hierarchy>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::isRfLocked: {
+            case FrontendStatus::Tag::isRfLocked: {
                 jfieldID field = env->GetFieldID(clazz, "mIsRfLocked", "Ljava/lang/Boolean;");
-                jobject newBooleanObj = env->NewObject(
-                        booleanClazz, initBoolean, static_cast<jboolean>(s.isRfLocked()));
+                jobject newBooleanObj =
+                        env->NewObject(booleanClazz, initBoolean,
+                                       static_cast<jboolean>(
+                                               s.get<FrontendStatus::Tag::isRfLocked>()));
                 env->SetObjectField(statusObj, field, newBooleanObj);
                 break;
             }
-            case FrontendStatus::hidl_discriminator::plpInfo: {
+            case FrontendStatus::Tag::plpInfo: {
                 jfieldID field = env->GetFieldID(clazz, "mPlpInfo",
                         "[Landroid/media/tv/tuner/frontend/FrontendStatus$Atsc3PlpTuningInfo;");
                 jclass plpClazz = env->FindClass(
                         "android/media/tv/tuner/frontend/FrontendStatus$Atsc3PlpTuningInfo");
                 jmethodID initPlp = env->GetMethodID(plpClazz, "<init>", "(IZI)V");
 
-                hidl_vec<FrontendStatusAtsc3PlpInfo> plpInfos = s.plpInfo();
-
-                jobjectArray valObj = env->NewObjectArray(plpInfos.size(), plpClazz, NULL);
+                vector<FrontendStatusAtsc3PlpInfo> plpInfos = s.get<FrontendStatus::Tag::plpInfo>();
+                jobjectArray valObj = env->NewObjectArray(plpInfos.size(), plpClazz, nullptr);
                 for (int i = 0; i < plpInfos.size(); i++) {
                     auto info = plpInfos[i];
                     jint plpId = (jint) info.plpId;
@@ -2109,74 +2124,75 @@
                 env->SetObjectField(statusObj, field, valObj);
                 break;
             }
-            default: {
-                break;
-            }
-        }
-    }
-
-    for (auto s : status_1_1) {
-        switch(s.getDiscriminator()) {
-            case FrontendStatusExt1_1::hidl_discriminator::modulations: {
+            case FrontendStatus::Tag::modulations: {
                 jfieldID field = env->GetFieldID(clazz, "mModulationsExt", "[I");
-                std::vector<FrontendModulation> v = s.modulations();
+                std::vector<FrontendModulation> v = s.get<FrontendStatus::Tag::modulations>();
 
                 jintArray valObj = env->NewIntArray(v.size());
                 bool valid = false;
                 jint m[1];
                 for (int i = 0; i < v.size(); i++) {
                     auto modulation = v[i];
-                    switch(modulation.getDiscriminator()) {
-                        case FrontendModulation::hidl_discriminator::dvbc: {
-                            m[0] = static_cast<jint>(modulation.dvbc());
+                    switch (modulation.getTag()) {
+                        case FrontendModulation::Tag::dvbc: {
+                            m[0] = static_cast<jint>(
+                                    modulation.get<FrontendModulation::Tag::dvbc>());
                             env->SetIntArrayRegion(valObj, i, 1, m);
                             valid = true;
                             break;
                         }
-                        case FrontendModulation::hidl_discriminator::dvbs: {
-                            m[0] = static_cast<jint>(modulation.dvbs());
+                        case FrontendModulation::Tag::dvbs: {
+                            m[0] = static_cast<jint>(
+                                    modulation.get<FrontendModulation::Tag::dvbs>());
                             env->SetIntArrayRegion(valObj, i, 1, m);
                             valid = true;
                            break;
                         }
-                        case FrontendModulation::hidl_discriminator::dvbt: {
-                            m[0] = static_cast<jint>(modulation.dvbt());
+                        case FrontendModulation::Tag::dvbt: {
+                            m[0] = static_cast<jint>(
+                                    modulation.get<FrontendModulation::Tag::dvbt>());
                             env->SetIntArrayRegion(valObj, i, 1, m);
                             valid = true;
                             break;
                         }
-                        case FrontendModulation::hidl_discriminator::isdbs: {
-                            m[0] = static_cast<jint>(modulation.isdbs());
+                        case FrontendModulation::Tag::isdbs: {
+                            m[0] = static_cast<jint>(
+                                    modulation.get<FrontendModulation::Tag::isdbs>());
                             env->SetIntArrayRegion(valObj, i, 1, m);
                             valid = true;
                             break;
                         }
-                        case FrontendModulation::hidl_discriminator::isdbs3: {
-                            m[0] = static_cast<jint>(modulation.isdbs3());
+                        case FrontendModulation::Tag::isdbs3: {
+                            m[0] = static_cast<jint>(
+                                    modulation.get<FrontendModulation::Tag::isdbs3>());
                             env->SetIntArrayRegion(valObj, i, 1, m);
                             valid = true;
                             break;
                         }
-                        case FrontendModulation::hidl_discriminator::isdbt: {
-                            m[0] = static_cast<jint>(modulation.isdbt());
+                        case FrontendModulation::Tag::isdbt: {
+                            m[0] = static_cast<jint>(
+                                    modulation.get<FrontendModulation::Tag::isdbt>());
                             env->SetIntArrayRegion(valObj, i, 1, m);
                             valid = true;
                             break;
                         }
-                        case FrontendModulation::hidl_discriminator::atsc: {
-                            m[0] = static_cast<jint>(modulation.atsc());
+                        case FrontendModulation::Tag::atsc: {
+                            m[0] = static_cast<jint>(
+                                    modulation.get<FrontendModulation::Tag::atsc>());
                             env->SetIntArrayRegion(valObj, i, 1, m);
                             valid = true;
                             break;
                         }
-                        case FrontendModulation::hidl_discriminator::atsc3: {
-                            m[0] = static_cast<jint>(modulation.atsc3());
+                        case FrontendModulation::Tag::atsc3: {
+                            m[0] = static_cast<jint>(
+                                    modulation.get<FrontendModulation::Tag::atsc3>());
                             env->SetIntArrayRegion(valObj, i, 1, m);
                             valid = true;
                             break;
                         }
-                        case FrontendModulation::hidl_discriminator::dtmb: {
-                            m[0] = static_cast<jint>(modulation.dtmb());
+                        case FrontendModulation::Tag::dtmb: {
+                            m[0] = static_cast<jint>(
+                                    modulation.get<FrontendModulation::Tag::dtmb>());
                             env->SetIntArrayRegion(valObj, i, 1, m);
                             valid = true;
                             break;
@@ -2190,9 +2206,9 @@
                 }
                 break;
             }
-            case FrontendStatusExt1_1::hidl_discriminator::bers: {
+            case FrontendStatus::Tag::bers: {
                 jfieldID field = env->GetFieldID(clazz, "mBers", "[I");
-                std::vector<uint32_t> v = s.bers();
+                std::vector<int32_t> v = s.get<FrontendStatus::Tag::bers>();
 
                 jintArray valObj = env->NewIntArray(v.size());
                 env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast<jint*>(&v[0]));
@@ -2200,10 +2216,9 @@
                 env->SetObjectField(statusObj, field, valObj);
                 break;
             }
-            case FrontendStatusExt1_1::hidl_discriminator::codeRates: {
+            case FrontendStatus::Tag::codeRates: {
                 jfieldID field = env->GetFieldID(clazz, "mCodeRates", "[I");
-                std::vector<::android::hardware::tv::tuner::V1_1::FrontendInnerFec> v
-                        = s.codeRates();
+                std::vector<FrontendInnerFec> v = s.get<FrontendStatus::Tag::codeRates>();
 
                 jintArray valObj = env->NewIntArray(v.size());
                 env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast<jint*>(&v[0]));
@@ -2211,30 +2226,35 @@
                 env->SetObjectField(statusObj, field, valObj);
                 break;
             }
-            case FrontendStatusExt1_1::hidl_discriminator::bandwidth: {
+            case FrontendStatus::Tag::bandwidth: {
                 jfieldID field = env->GetFieldID(clazz, "mBandwidth", "Ljava/lang/Integer;");
-                auto bandwidth = s.bandwidth();
+                auto bandwidth = s.get<FrontendStatus::Tag::bandwidth>();
                 jint intBandwidth;
                 bool valid = true;
-                switch(bandwidth.getDiscriminator()) {
-                    case FrontendBandwidth::hidl_discriminator::atsc3: {
-                        intBandwidth = static_cast<jint>(bandwidth.atsc3());
+                switch (bandwidth.getTag()) {
+                    case FrontendBandwidth::Tag::atsc3: {
+                        intBandwidth =
+                                static_cast<jint>(bandwidth.get<FrontendBandwidth::Tag::atsc3>());
                         break;
                     }
-                    case FrontendBandwidth::hidl_discriminator::dvbt: {
-                        intBandwidth = static_cast<jint>(bandwidth.dvbt());
+                    case FrontendBandwidth::Tag::dvbt: {
+                        intBandwidth =
+                                static_cast<jint>(bandwidth.get<FrontendBandwidth::Tag::dvbt>());
                         break;
                     }
-                    case FrontendBandwidth::hidl_discriminator::dvbc: {
-                        intBandwidth = static_cast<jint>(bandwidth.dvbc());
+                    case FrontendBandwidth::Tag::dvbc: {
+                        intBandwidth =
+                                static_cast<jint>(bandwidth.get<FrontendBandwidth::Tag::dvbc>());
                         break;
                     }
-                    case FrontendBandwidth::hidl_discriminator::isdbt: {
-                        intBandwidth = static_cast<jint>(bandwidth.isdbt());
+                    case FrontendBandwidth::Tag::isdbt: {
+                        intBandwidth =
+                                static_cast<jint>(bandwidth.get<FrontendBandwidth::Tag::isdbt>());
                         break;
                     }
-                    case FrontendBandwidth::hidl_discriminator::dtmb: {
-                        intBandwidth = static_cast<jint>(bandwidth.dtmb());
+                    case FrontendBandwidth::Tag::dtmb: {
+                        intBandwidth =
+                                static_cast<jint>(bandwidth.get<FrontendBandwidth::Tag::dtmb>());
                         break;
                     }
                     default:
@@ -2247,22 +2267,25 @@
                 }
                 break;
             }
-            case FrontendStatusExt1_1::hidl_discriminator::interval: {
+            case FrontendStatus::Tag::interval: {
                 jfieldID field = env->GetFieldID(clazz, "mGuardInterval", "Ljava/lang/Integer;");
-                auto interval = s.interval();
+                auto interval = s.get<FrontendStatus::Tag::interval>();
                 jint intInterval;
                 bool valid = true;
-                switch(interval.getDiscriminator()) {
-                    case FrontendGuardInterval::hidl_discriminator::dvbt: {
-                        intInterval = static_cast<jint>(interval.dvbt());
+                switch (interval.getTag()) {
+                    case FrontendGuardInterval::Tag::dvbt: {
+                        intInterval =
+                                static_cast<jint>(interval.get<FrontendGuardInterval::Tag::dvbt>());
                         break;
                     }
-                    case FrontendGuardInterval::hidl_discriminator::isdbt: {
-                        intInterval = static_cast<jint>(interval.isdbt());
+                    case FrontendGuardInterval::Tag::isdbt: {
+                        intInterval = static_cast<jint>(
+                                interval.get<FrontendGuardInterval::Tag::isdbt>());
                         break;
                     }
-                    case FrontendGuardInterval::hidl_discriminator::dtmb: {
-                        intInterval = static_cast<jint>(interval.dtmb());
+                    case FrontendGuardInterval::Tag::dtmb: {
+                        intInterval =
+                                static_cast<jint>(interval.get<FrontendGuardInterval::Tag::dtmb>());
                         break;
                     }
                     default:
@@ -2275,22 +2298,25 @@
                 }
                 break;
             }
-            case FrontendStatusExt1_1::hidl_discriminator::transmissionMode: {
+            case FrontendStatus::Tag::transmissionMode: {
                 jfieldID field = env->GetFieldID(clazz, "mTransmissionMode", "Ljava/lang/Integer;");
-                auto transmissionMode = s.transmissionMode();
+                auto transmissionMode = s.get<FrontendStatus::Tag::transmissionMode>();
                 jint intTransmissionMode;
                 bool valid = true;
-                switch(transmissionMode.getDiscriminator()) {
-                    case FrontendTransmissionMode::hidl_discriminator::dvbt: {
-                        intTransmissionMode = static_cast<jint>(transmissionMode.dvbt());
+                switch (transmissionMode.getTag()) {
+                    case FrontendTransmissionMode::Tag::dvbt: {
+                        intTransmissionMode = static_cast<jint>(
+                                transmissionMode.get<FrontendTransmissionMode::Tag::dvbt>());
                         break;
                     }
-                    case FrontendTransmissionMode::hidl_discriminator::isdbt: {
-                        intTransmissionMode = static_cast<jint>(transmissionMode.isdbt());
+                    case FrontendTransmissionMode::Tag::isdbt: {
+                        intTransmissionMode = static_cast<jint>(
+                                transmissionMode.get<FrontendTransmissionMode::Tag::isdbt>());
                         break;
                     }
-                    case FrontendTransmissionMode::hidl_discriminator::dtmb: {
-                        intTransmissionMode = static_cast<jint>(transmissionMode.dtmb());
+                    case FrontendTransmissionMode::Tag::dtmb: {
+                        intTransmissionMode = static_cast<jint>(
+                                transmissionMode.get<FrontendTransmissionMode::Tag::dtmb>());
                         break;
                     }
                     default:
@@ -2303,44 +2329,48 @@
                 }
                 break;
             }
-            case FrontendStatusExt1_1::hidl_discriminator::uec: {
+            case FrontendStatus::Tag::uec: {
                 jfieldID field = env->GetFieldID(clazz, "mUec", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.uec()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(s.get<FrontendStatus::Tag::uec>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatusExt1_1::hidl_discriminator::systemId: {
+            case FrontendStatus::Tag::systemId: {
                 jfieldID field = env->GetFieldID(clazz, "mSystemId", "Ljava/lang/Integer;");
-                jobject newIntegerObj = env->NewObject(
-                        intClazz, initInt, static_cast<jint>(s.systemId()));
+                jobject newIntegerObj =
+                        env->NewObject(intClazz, initInt,
+                                       static_cast<jint>(s.get<FrontendStatus::Tag::systemId>()));
                 env->SetObjectField(statusObj, field, newIntegerObj);
                 break;
             }
-            case FrontendStatusExt1_1::hidl_discriminator::interleaving: {
+            case FrontendStatus::Tag::interleaving: {
                 jfieldID field = env->GetFieldID(clazz, "mInterleaving", "[I");
-
-                std::vector<FrontendInterleaveMode> v = s.interleaving();
+                std::vector<FrontendInterleaveMode> v = s.get<FrontendStatus::Tag::interleaving>();
                 jintArray valObj = env->NewIntArray(v.size());
                 bool valid = false;
                 jint in[1];
                 for (int i = 0; i < v.size(); i++) {
                     auto interleaving = v[i];
-                    switch(interleaving.getDiscriminator()) {
-                        case FrontendInterleaveMode::hidl_discriminator::atsc3: {
-                            in[0] = static_cast<jint>(interleaving.atsc3());
+                    switch (interleaving.getTag()) {
+                        case FrontendInterleaveMode::Tag::atsc3: {
+                            in[0] = static_cast<jint>(
+                                    interleaving.get<FrontendInterleaveMode::Tag::atsc3>());
                             env->SetIntArrayRegion(valObj, i, 1, in);
                             valid = true;
                             break;
                         }
-                        case FrontendInterleaveMode::hidl_discriminator::dvbc: {
-                            in[0] = static_cast<jint>(interleaving.dvbc());
+                        case FrontendInterleaveMode::Tag::dvbc: {
+                            in[0] = static_cast<jint>(
+                                    interleaving.get<FrontendInterleaveMode::Tag::dvbc>());
                             env->SetIntArrayRegion(valObj, i, 1, in);
                             valid = true;
                            break;
                         }
-                        case FrontendInterleaveMode::hidl_discriminator::dtmb: {
-                            in[0] = static_cast<jint>(interleaving.dtmb());
+                        case FrontendInterleaveMode::Tag::dtmb: {
+                            in[0] = static_cast<jint>(
+                                    interleaving.get<FrontendInterleaveMode::Tag::dtmb>());
                             env->SetIntArrayRegion(valObj, i, 1, in);
                             valid = true;
                            break;
@@ -2354,9 +2384,9 @@
                 }
                 break;
             }
-            case FrontendStatusExt1_1::hidl_discriminator::isdbtSegment: {
+            case FrontendStatus::Tag::isdbtSegment: {
                 jfieldID field = env->GetFieldID(clazz, "mIsdbtSegment", "[I");
-                std::vector<uint8_t> v = s.isdbtSegment();
+                std::vector<uint8_t> v = s.get<FrontendStatus::Tag::isdbtSegment>();
 
                 jintArray valObj = env->NewIntArray(v.size());
                 env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast<jint*>(&v[0]));
@@ -2364,9 +2394,9 @@
                 env->SetObjectField(statusObj, field, valObj);
                 break;
             }
-            case FrontendStatusExt1_1::hidl_discriminator::tsDataRate: {
+            case FrontendStatus::Tag::tsDataRate: {
                 jfieldID field = env->GetFieldID(clazz, "mTsDataRate", "[I");
-                std::vector<uint32_t> v = s.tsDataRate();
+                std::vector<int32_t> v = s.get<FrontendStatus::Tag::tsDataRate>();
 
                 jintArray valObj = env->NewIntArray(v.size());
                 env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast<jint*>(&v[0]));
@@ -2374,22 +2404,22 @@
                 env->SetObjectField(statusObj, field, valObj);
                 break;
             }
-            case FrontendStatusExt1_1::hidl_discriminator::rollOff: {
+            case FrontendStatus::Tag::rollOff: {
                 jfieldID field = env->GetFieldID(clazz, "mRollOff", "Ljava/lang/Integer;");
-                auto rollOff = s.rollOff();
+                auto rollOff = s.get<FrontendStatus::Tag::rollOff>();
                 jint intRollOff;
                 bool valid = true;
-                switch(rollOff.getDiscriminator()) {
-                    case FrontendRollOff::hidl_discriminator::dvbs: {
-                        intRollOff = static_cast<jint>(rollOff.dvbs());
+                switch (rollOff.getTag()) {
+                    case FrontendRollOff::Tag::dvbs: {
+                        intRollOff = static_cast<jint>(rollOff.get<FrontendRollOff::Tag::dvbs>());
                         break;
                     }
-                    case FrontendRollOff::hidl_discriminator::isdbs: {
-                        intRollOff = static_cast<jint>(rollOff.isdbs());
+                    case FrontendRollOff::Tag::isdbs: {
+                        intRollOff = static_cast<jint>(rollOff.get<FrontendRollOff::Tag::isdbs>());
                         break;
                     }
-                    case FrontendRollOff::hidl_discriminator::isdbs3: {
-                        intRollOff = static_cast<jint>(rollOff.isdbs3());
+                    case FrontendRollOff::Tag::isdbs3: {
+                        intRollOff = static_cast<jint>(rollOff.get<FrontendRollOff::Tag::isdbs3>());
                         break;
                     }
                     default:
@@ -2402,24 +2432,29 @@
                 }
                 break;
             }
-            case FrontendStatusExt1_1::hidl_discriminator::isMiso: {
+            case FrontendStatus::Tag::isMiso: {
                 jfieldID field = env->GetFieldID(clazz, "mIsMisoEnabled", "Ljava/lang/Boolean;");
-                jobject newBooleanObj = env->NewObject(
-                        booleanClazz, initBoolean, static_cast<jboolean>(s.isMiso()));
+                jobject newBooleanObj =
+                        env->NewObject(booleanClazz, initBoolean,
+                                       static_cast<jboolean>(s.get<FrontendStatus::Tag::isMiso>()));
                 env->SetObjectField(statusObj, field, newBooleanObj);
                 break;
             }
-            case FrontendStatusExt1_1::hidl_discriminator::isLinear: {
+            case FrontendStatus::Tag::isLinear: {
                 jfieldID field = env->GetFieldID(clazz, "mIsLinear", "Ljava/lang/Boolean;");
-                jobject newBooleanObj = env->NewObject(
-                        booleanClazz, initBoolean, static_cast<jboolean>(s.isLinear()));
+                jobject newBooleanObj =
+                        env->NewObject(booleanClazz, initBoolean,
+                                       static_cast<jboolean>(
+                                               s.get<FrontendStatus::Tag::isLinear>()));
                 env->SetObjectField(statusObj, field, newBooleanObj);
                 break;
             }
-            case FrontendStatusExt1_1::hidl_discriminator::isShortFrames: {
+            case FrontendStatus::Tag::isShortFrames: {
                 jfieldID field = env->GetFieldID(clazz, "mIsShortFrames", "Ljava/lang/Boolean;");
-                jobject newBooleanObj = env->NewObject(
-                        booleanClazz, initBoolean, static_cast<jboolean>(s.isShortFrames()));
+                jobject newBooleanObj =
+                        env->NewObject(booleanClazz, initBoolean,
+                                       static_cast<jboolean>(
+                                               s.get<FrontendStatus::Tag::isShortFrames>()));
                 env->SetObjectField(statusObj, field, newBooleanObj);
                 break;
             }
@@ -2431,33 +2466,28 @@
     return statusObj;
 }
 
-bool JTuner::isV1_1ExtendedStatusType(int type) {
-    return (type > static_cast<int>(FrontendStatusType::ATSC3_PLP_INFO)
-                && type <= static_cast<int>(FrontendStatusTypeExt1_1::IS_SHORT_FRAMES));
-}
-
 jint JTuner::closeFrontend() {
     Result r = Result::SUCCESS;
 
-    if (mFeClient != NULL) {
+    if (mFeClient != nullptr) {
         r = mFeClient->close();
     }
     if (r == Result::SUCCESS) {
-        mFeClient = NULL;
+        mFeClient = nullptr;
     }
-    return (jint) r;
+    return (jint)r;
 }
 
 jint JTuner::closeDemux() {
     Result r = Result::SUCCESS;
 
-    if (mDemuxClient != NULL) {
+    if (mDemuxClient != nullptr) {
         r = mDemuxClient->close();
     }
     if (r == Result::SUCCESS) {
-        mDemuxClient = NULL;
+        mDemuxClient = nullptr;
     }
-    return (jint) r;
+    return (jint)r;
 }
 }  // namespace android
 
@@ -2468,14 +2498,14 @@
 static sp<JTuner> setTuner(JNIEnv *env, jobject thiz, const sp<JTuner> &tuner) {
     sp<JTuner> old = (JTuner *)env->GetLongField(thiz, gFields.tunerContext);
 
-    if (tuner != NULL) {
+    if (tuner != nullptr) {
         tuner->incStrong(thiz);
     }
-    if (old != NULL) {
+    if (old != nullptr) {
         old->decStrong(thiz);
     }
 
-    if (tuner != NULL) {
+    if (tuner != nullptr) {
         env->SetLongField(thiz, gFields.tunerContext, (jlong)tuner.get());
     }
 
@@ -2492,25 +2522,25 @@
 
 static DemuxPid getDemuxPid(int pidType, int pid) {
     DemuxPid demuxPid;
-    if ((int)pidType == 1) {
-        demuxPid.tPid(static_cast<DemuxTpid>(pid));
-    } else if ((int)pidType == 2) {
-        demuxPid.mmtpPid(static_cast<DemuxMmtpPid>(pid));
+    if (pidType == 1) {
+        demuxPid.set<DemuxPid::tPid>(pid);
+    } else if (pidType == 2) {
+        demuxPid.set<DemuxPid::mmtpPid>(pid);
     }
     return demuxPid;
 }
 
-static uint32_t getFrontendSettingsFreq(JNIEnv *env, const jobject& settings) {
+static int32_t getFrontendSettingsFreq(JNIEnv *env, const jobject &settings) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/FrontendSettings");
     jfieldID freqField = env->GetFieldID(clazz, "mFrequency", "I");
-    uint32_t freq = static_cast<uint32_t>(env->GetIntField(settings, freqField));
+    int32_t freq = static_cast<int32_t>(env->GetIntField(settings, freqField));
     return freq;
 }
 
-static uint32_t getFrontendSettingsEndFreq(JNIEnv *env, const jobject& settings) {
+static int32_t getFrontendSettingsEndFreq(JNIEnv *env, const jobject &settings) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/FrontendSettings");
     jfieldID endFreqField = env->GetFieldID(clazz, "mEndFrequency", "I");
-    uint32_t endFreq = static_cast<uint32_t>(env->GetIntField(settings, endFreqField));
+    int32_t endFreq = static_cast<int32_t>(env->GetIntField(settings, endFreqField));
     return endFreq;
 }
 
@@ -2525,7 +2555,9 @@
 
 static FrontendSettings getAnalogFrontendSettings(JNIEnv *env, const jobject& settings) {
     FrontendSettings frontendSettings;
-    uint32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t endFreq = getFrontendSettingsEndFreq(env, settings);
+    FrontendSpectralInversion inversion = getFrontendSettingsSpectralInversion(env, settings);
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/AnalogFrontendSettings");
     FrontendAnalogType analogType =
             static_cast<FrontendAnalogType>(
@@ -2533,29 +2565,21 @@
     FrontendAnalogSifStandard sifStandard =
             static_cast<FrontendAnalogSifStandard>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mSifStandard", "I")));
-    FrontendAnalogSettings frontendAnalogSettings {
+    FrontendAnalogAftFlag aftFlag = static_cast<FrontendAnalogAftFlag>(
+            env->GetIntField(settings, env->GetFieldID(clazz, "mAftFlag", "I")));
+    FrontendAnalogSettings frontendAnalogSettings{
             .frequency = freq,
+            .endFrequency = endFreq,
             .type = analogType,
             .sifStandard = sifStandard,
+            .aftFlag = aftFlag,
+            .inversion = inversion,
     };
-    frontendSettings.analog(frontendAnalogSettings);
+    frontendSettings.set<FrontendSettings::Tag::analog>(frontendAnalogSettings);
     return frontendSettings;
 }
 
-static void getAnalogFrontendSettingsExt1_1(JNIEnv *env, const jobject& settings,
-        FrontendSettingsExt1_1& settingsExt1_1) {
-    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/AnalogFrontendSettings");
-    FrontendAnalogAftFlag aftFlag =
-            static_cast<FrontendAnalogAftFlag>(
-                    env->GetIntField(settings, env->GetFieldID(clazz, "mAftFlag", "I")));
-    FrontendAnalogSettingsExt1_1 analogExt1_1 {
-        .aftFlag = aftFlag,
-    };
-    settingsExt1_1.settingExt.analog(analogExt1_1);
-}
-
-static hidl_vec<FrontendAtsc3PlpSettings> getAtsc3PlpSettings(
-        JNIEnv *env, const jobject& settings) {
+static vector<FrontendAtsc3PlpSettings> getAtsc3PlpSettings(JNIEnv *env, const jobject &settings) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/Atsc3FrontendSettings");
     jobjectArray plpSettings =
             reinterpret_cast<jobjectArray>(
@@ -2567,13 +2591,12 @@
     int len = env->GetArrayLength(plpSettings);
 
     jclass plpClazz = env->FindClass("android/media/tv/tuner/frontend/Atsc3PlpSettings");
-    hidl_vec<FrontendAtsc3PlpSettings> plps = hidl_vec<FrontendAtsc3PlpSettings>(len);
+    vector<FrontendAtsc3PlpSettings> plps = vector<FrontendAtsc3PlpSettings>(len);
     // parse PLP settings
     for (int i = 0; i < len; i++) {
         jobject plp = env->GetObjectArrayElement(plpSettings, i);
-        uint8_t plpId =
-                static_cast<uint8_t>(
-                        env->GetIntField(plp, env->GetFieldID(plpClazz, "mPlpId", "I")));
+        int8_t plpId = static_cast<int8_t>(
+                env->GetIntField(plp, env->GetFieldID(plpClazz, "mPlpId", "I")));
         FrontendAtsc3Modulation modulation =
                 static_cast<FrontendAtsc3Modulation>(
                         env->GetIntField(plp, env->GetFieldID(plpClazz, "mModulation", "I")));
@@ -2601,9 +2624,10 @@
 
 static FrontendSettings getAtsc3FrontendSettings(JNIEnv *env, const jobject& settings) {
     FrontendSettings frontendSettings;
-    uint32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t endFreq = getFrontendSettingsEndFreq(env, settings);
+    FrontendSpectralInversion inversion = getFrontendSettingsSpectralInversion(env, settings);
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/Atsc3FrontendSettings");
-
     FrontendAtsc3Bandwidth bandwidth =
             static_cast<FrontendAtsc3Bandwidth>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mBandwidth", "I")));
@@ -2611,35 +2635,42 @@
             static_cast<FrontendAtsc3DemodOutputFormat>(
                     env->GetIntField(
                             settings, env->GetFieldID(clazz, "mDemodOutputFormat", "I")));
-    hidl_vec<FrontendAtsc3PlpSettings> plps = getAtsc3PlpSettings(env, settings);
-    FrontendAtsc3Settings frontendAtsc3Settings {
+    vector<FrontendAtsc3PlpSettings> plps = getAtsc3PlpSettings(env, settings);
+    FrontendAtsc3Settings frontendAtsc3Settings{
             .frequency = freq,
+            .endFrequency = endFreq,
             .bandwidth = bandwidth,
             .demodOutputFormat = demod,
             .plpSettings = plps,
+            .inversion = inversion,
     };
-    frontendSettings.atsc3(frontendAtsc3Settings);
+    frontendSettings.set<FrontendSettings::Tag::atsc3>(frontendAtsc3Settings);
     return frontendSettings;
 }
 
 static FrontendSettings getAtscFrontendSettings(JNIEnv *env, const jobject& settings) {
     FrontendSettings frontendSettings;
-    uint32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t endFreq = getFrontendSettingsEndFreq(env, settings);
+    FrontendSpectralInversion inversion = getFrontendSettingsSpectralInversion(env, settings);
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/AtscFrontendSettings");
     FrontendAtscModulation modulation =
             static_cast<FrontendAtscModulation>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I")));
-    FrontendAtscSettings frontendAtscSettings {
+    FrontendAtscSettings frontendAtscSettings{
             .frequency = freq,
+            .endFrequency = endFreq,
             .modulation = modulation,
+            .inversion = inversion,
     };
-    frontendSettings.atsc(frontendAtscSettings);
+    frontendSettings.set<FrontendSettings::Tag::atsc>(frontendAtscSettings);
     return frontendSettings;
 }
 
 static FrontendSettings getDvbcFrontendSettings(JNIEnv *env, const jobject& settings) {
     FrontendSettings frontendSettings;
-    uint32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t endFreq = getFrontendSettingsEndFreq(env, settings);
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbcFrontendSettings");
     FrontendDvbcModulation modulation =
             static_cast<FrontendDvbcModulation>(
@@ -2647,49 +2678,36 @@
     FrontendInnerFec innerFec =
             static_cast<FrontendInnerFec>(
                     env->GetLongField(settings, env->GetFieldID(clazz, "mInnerFec", "J")));
-    uint32_t symbolRate =
-            static_cast<uint32_t>(
-                    env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I")));
+    int32_t symbolRate = static_cast<int32_t>(
+            env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I")));
     FrontendDvbcOuterFec outerFec =
             static_cast<FrontendDvbcOuterFec>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mOuterFec", "I")));
     FrontendDvbcAnnex annex =
             static_cast<FrontendDvbcAnnex>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mAnnex", "I")));
-    FrontendDvbcSpectralInversion spectralInversion =
-            static_cast<FrontendDvbcSpectralInversion>(
-                    env->GetIntField(
-                            settings, env->GetFieldID(clazz, "mSpectralInversion", "I")));
-    FrontendDvbcSettings frontendDvbcSettings {
+    FrontendSpectralInversion spectralInversion = static_cast<FrontendSpectralInversion>(
+            env->GetIntField(settings, env->GetFieldID(clazz, "mSpectralInversion", "I")));
+    FrontendCableTimeInterleaveMode interleaveMode = static_cast<FrontendCableTimeInterleaveMode>(
+            env->GetIntField(settings, env->GetFieldID(clazz, "mInterleaveMode", "I")));
+    FrontendDvbcBandwidth bandwidth = static_cast<FrontendDvbcBandwidth>(
+            env->GetIntField(settings, env->GetFieldID(clazz, "mBandwidth", "I")));
+    FrontendDvbcSettings frontendDvbcSettings{
             .frequency = freq,
+            .endFrequency = endFreq,
             .modulation = modulation,
             .fec = innerFec,
             .symbolRate = symbolRate,
             .outerFec = outerFec,
             .annex = annex,
-            .spectralInversion = spectralInversion,
+            .inversion = spectralInversion,
+            .interleaveMode = interleaveMode,
+            .bandwidth = bandwidth,
     };
-    frontendSettings.dvbc(frontendDvbcSettings);
+    frontendSettings.set<FrontendSettings::Tag::dvbc>(frontendDvbcSettings);
     return frontendSettings;
 }
 
-static void getDvbcFrontendSettingsExt1_1(JNIEnv *env, const jobject& settings,
-        FrontendSettingsExt1_1& settingsExt1_1) {
-    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbcFrontendSettings");
-    FrontendCableTimeInterleaveMode interleaveMode =
-            static_cast<FrontendCableTimeInterleaveMode>(
-                    env->GetIntField(settings, env->GetFieldID(clazz, "mInterleaveMode", "I")));
-    FrontendDvbcBandwidth bandwidth =
-            static_cast<FrontendDvbcBandwidth>(
-                    env->GetIntField(settings, env->GetFieldID(clazz, "mBandwidth", "I")));
-
-    FrontendDvbcSettingsExt1_1 dvbcExt1_1 {
-        .interleaveMode = interleaveMode,
-        .bandwidth = bandwidth,
-    };
-    settingsExt1_1.settingExt.dvbc(dvbcExt1_1);
-}
-
 static FrontendDvbsCodeRate getDvbsCodeRate(JNIEnv *env, const jobject& settings) {
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbsFrontendSettings");
     jobject jcodeRate =
@@ -2712,11 +2730,8 @@
             static_cast<bool>(
                     env->GetBooleanField(
                             jcodeRate, env->GetFieldID(codeRateClazz, "mIsShortFrames", "Z")));
-    uint32_t bitsPer1000Symbol =
-            static_cast<uint32_t>(
-                    env->GetIntField(
-                            jcodeRate, env->GetFieldID(
-                                    codeRateClazz, "mBitsPer1000Symbol", "I")));
+    int32_t bitsPer1000Symbol = static_cast<int32_t>(
+            env->GetIntField(jcodeRate, env->GetFieldID(codeRateClazz, "mBitsPer1000Symbol", "I")));
     FrontendDvbsCodeRate coderate {
             .fec = innerFec,
             .isLinear = isLinear,
@@ -2728,33 +2743,37 @@
 
 static FrontendSettings getDvbsFrontendSettings(JNIEnv *env, const jobject& settings) {
     FrontendSettings frontendSettings;
-    uint32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t endFreq = getFrontendSettingsEndFreq(env, settings);
+    FrontendSpectralInversion inversion = getFrontendSettingsSpectralInversion(env, settings);
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbsFrontendSettings");
-
     FrontendDvbsModulation modulation =
             static_cast<FrontendDvbsModulation>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I")));
-    uint32_t symbolRate =
-            static_cast<uint32_t>(
-                    env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I")));
+    int32_t symbolRate = static_cast<int32_t>(
+            env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I")));
     FrontendDvbsRolloff rolloff =
             static_cast<FrontendDvbsRolloff>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mRolloff", "I")));
     FrontendDvbsPilot pilot =
             static_cast<FrontendDvbsPilot>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mPilot", "I")));
-    uint32_t inputStreamId =
-            static_cast<uint32_t>(
-                    env->GetIntField(settings, env->GetFieldID(clazz, "mInputStreamId", "I")));
+    int32_t inputStreamId = static_cast<int32_t>(
+            env->GetIntField(settings, env->GetFieldID(clazz, "mInputStreamId", "I")));
     FrontendDvbsStandard standard =
             static_cast<FrontendDvbsStandard>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mStandard", "I")));
     FrontendDvbsVcmMode vcmMode =
             static_cast<FrontendDvbsVcmMode>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mVcmMode", "I")));
+    FrontendDvbsScanType scanType = static_cast<FrontendDvbsScanType>(
+            env->GetIntField(settings, env->GetFieldID(clazz, "mScanType", "I")));
+    bool isDiseqcRxMessage = static_cast<bool>(
+            env->GetBooleanField(settings, env->GetFieldID(clazz, "mIsDiseqcRxMessage", "Z")));
 
-    FrontendDvbsSettings frontendDvbsSettings {
+    FrontendDvbsSettings frontendDvbsSettings{
             .frequency = freq,
+            .endFrequency = endFreq,
             .modulation = modulation,
             .symbolRate = symbolRate,
             .rolloff = rolloff,
@@ -2762,37 +2781,26 @@
             .inputStreamId = inputStreamId,
             .standard = standard,
             .vcmMode = vcmMode,
+            .scanType = scanType,
+            .isDiseqcRxMessage = isDiseqcRxMessage,
+            .inversion = inversion,
     };
 
     jobject jcodeRate = env->GetObjectField(settings, env->GetFieldID(clazz, "mCodeRate",
             "Landroid/media/tv/tuner/frontend/DvbsCodeRate;"));
-    if (jcodeRate != NULL) {
+    if (jcodeRate != nullptr) {
         frontendDvbsSettings.coderate = getDvbsCodeRate(env, settings);
     }
 
-    frontendSettings.dvbs(frontendDvbsSettings);
+    frontendSettings.set<FrontendSettings::Tag::dvbs>(frontendDvbsSettings);
     return frontendSettings;
 }
 
-static void getDvbsFrontendSettingsExt1_1(JNIEnv *env, const jobject& settings,
-        FrontendSettingsExt1_1& settingsExt1_1) {
-    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbsFrontendSettings");
-    FrontendDvbsScanType scanType =
-            static_cast<FrontendDvbsScanType>(
-                    env->GetIntField(settings, env->GetFieldID(clazz, "mScanType", "I")));
-    bool isDiseqcRxMessage = static_cast<bool>(env->GetBooleanField(
-            settings, env->GetFieldID(clazz, "mIsDiseqcRxMessage", "Z")));
-
-    FrontendDvbsSettingsExt1_1 dvbsExt1_1 {
-        .scanType = scanType,
-        .isDiseqcRxMessage = isDiseqcRxMessage,
-    };
-    settingsExt1_1.settingExt.dvbs(dvbsExt1_1);
-}
-
 static FrontendSettings getDvbtFrontendSettings(JNIEnv *env, const jobject& settings) {
     FrontendSettings frontendSettings;
-    uint32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t endFreq = getFrontendSettingsEndFreq(env, settings);
+    FrontendSpectralInversion inversion = getFrontendSettingsSpectralInversion(env, settings);
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbtFrontendSettings");
     FrontendDvbtTransmissionMode transmissionMode =
             static_cast<FrontendDvbtTransmissionMode>(
@@ -2829,15 +2837,14 @@
     FrontendDvbtPlpMode plpMode =
             static_cast<FrontendDvbtPlpMode>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mPlpMode", "I")));
-    uint8_t plpId =
-            static_cast<uint8_t>(
-                    env->GetIntField(settings, env->GetFieldID(clazz, "mPlpId", "I")));
-    uint8_t plpGroupId =
-            static_cast<uint8_t>(
-                    env->GetIntField(settings, env->GetFieldID(clazz, "mPlpGroupId", "I")));
+    int8_t plpId =
+            static_cast<int8_t>(env->GetIntField(settings, env->GetFieldID(clazz, "mPlpId", "I")));
+    int8_t plpGroupId = static_cast<int8_t>(
+            env->GetIntField(settings, env->GetFieldID(clazz, "mPlpGroupId", "I")));
 
-    FrontendDvbtSettings frontendDvbtSettings {
+    FrontendDvbtSettings frontendDvbtSettings{
             .frequency = freq,
+            .endFrequency = endFreq,
             .transmissionMode = transmissionMode,
             .bandwidth = bandwidth,
             .constellation = constellation,
@@ -2851,33 +2858,16 @@
             .plpMode = plpMode,
             .plpId = plpId,
             .plpGroupId = plpGroupId,
+            .inversion = inversion,
     };
-    frontendSettings.dvbt(frontendDvbtSettings);
+    frontendSettings.set<FrontendSettings::Tag::dvbt>(frontendDvbtSettings);
     return frontendSettings;
 }
 
-static void getDvbtFrontendSettingsExt1_1(JNIEnv *env, const jobject& settings,
-        FrontendSettingsExt1_1& settingsExt1_1) {
-    jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbtFrontendSettings");
-
-    FrontendDvbtSettingsExt1_1 dvbtExt1_1;
-    int transmissionMode =
-            env->GetIntField(settings, env->GetFieldID(clazz, "mTransmissionMode", "I"));
-    dvbtExt1_1.transmissionMode = static_cast<
-            ::android::hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode>(
-                    transmissionMode);
-
-    int constellation =
-            env->GetIntField(settings, env->GetFieldID(clazz, "mConstellation", "I"));
-    dvbtExt1_1.constellation = static_cast<
-            ::android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation>(constellation);
-
-    settingsExt1_1.settingExt.dvbt(dvbtExt1_1);
-}
-
 static FrontendSettings getIsdbsFrontendSettings(JNIEnv *env, const jobject& settings) {
     FrontendSettings frontendSettings;
-    uint32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t endFreq = getFrontendSettingsEndFreq(env, settings);
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/IsdbsFrontendSettings");
     uint16_t streamId =
             static_cast<uint16_t>(
@@ -2891,15 +2881,15 @@
     FrontendIsdbsCoderate coderate =
             static_cast<FrontendIsdbsCoderate>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mCodeRate", "I")));
-    uint32_t symbolRate =
-            static_cast<uint32_t>(
-                    env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I")));
+    int32_t symbolRate = static_cast<int32_t>(
+            env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I")));
     FrontendIsdbsRolloff rolloff =
             static_cast<FrontendIsdbsRolloff>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mRolloff", "I")));
 
-    FrontendIsdbsSettings frontendIsdbsSettings {
+    FrontendIsdbsSettings frontendIsdbsSettings{
             .frequency = freq,
+            .endFrequency = endFreq,
             .streamId = streamId,
             .streamIdType = streamIdType,
             .modulation = modulation,
@@ -2907,13 +2897,14 @@
             .symbolRate = symbolRate,
             .rolloff = rolloff,
     };
-    frontendSettings.isdbs(frontendIsdbsSettings);
+    frontendSettings.set<FrontendSettings::Tag::isdbs>(frontendIsdbsSettings);
     return frontendSettings;
 }
 
 static FrontendSettings getIsdbs3FrontendSettings(JNIEnv *env, const jobject& settings) {
     FrontendSettings frontendSettings;
-    uint32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t endFreq = getFrontendSettingsEndFreq(env, settings);
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/Isdbs3FrontendSettings");
     uint16_t streamId =
             static_cast<uint16_t>(
@@ -2927,15 +2918,15 @@
     FrontendIsdbs3Coderate coderate =
             static_cast<FrontendIsdbs3Coderate>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mCodeRate", "I")));
-    uint32_t symbolRate =
-            static_cast<uint32_t>(
-                    env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I")));
+    int32_t symbolRate = static_cast<int32_t>(
+            env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I")));
     FrontendIsdbs3Rolloff rolloff =
             static_cast<FrontendIsdbs3Rolloff>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mRolloff", "I")));
 
-    FrontendIsdbs3Settings frontendIsdbs3Settings {
+    FrontendIsdbs3Settings frontendIsdbs3Settings{
             .frequency = freq,
+            .endFrequency = endFreq,
             .streamId = streamId,
             .streamIdType = streamIdType,
             .modulation = modulation,
@@ -2943,13 +2934,15 @@
             .symbolRate = symbolRate,
             .rolloff = rolloff,
     };
-    frontendSettings.isdbs3(frontendIsdbs3Settings);
+    frontendSettings.set<FrontendSettings::Tag::isdbs3>(frontendIsdbs3Settings);
     return frontendSettings;
 }
 
 static FrontendSettings getIsdbtFrontendSettings(JNIEnv *env, const jobject& settings) {
     FrontendSettings frontendSettings;
-    uint32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t endFreq = getFrontendSettingsEndFreq(env, settings);
+    FrontendSpectralInversion inversion = getFrontendSettingsSpectralInversion(env, settings);
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/IsdbtFrontendSettings");
     FrontendIsdbtModulation modulation =
             static_cast<FrontendIsdbtModulation>(
@@ -2966,26 +2959,29 @@
     FrontendIsdbtGuardInterval guardInterval =
             static_cast<FrontendIsdbtGuardInterval>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mGuardInterval", "I")));
-    uint32_t serviceAreaId =
-            static_cast<uint32_t>(
-                    env->GetIntField(settings, env->GetFieldID(clazz, "mServiceAreaId", "I")));
+    int32_t serviceAreaId = static_cast<int32_t>(
+            env->GetIntField(settings, env->GetFieldID(clazz, "mServiceAreaId", "I")));
 
-    FrontendIsdbtSettings frontendIsdbtSettings {
+    FrontendIsdbtSettings frontendIsdbtSettings{
             .frequency = freq,
+            .endFrequency = endFreq,
             .modulation = modulation,
             .bandwidth = bandwidth,
             .mode = mode,
             .coderate = coderate,
             .guardInterval = guardInterval,
             .serviceAreaId = serviceAreaId,
+            .inversion = inversion,
     };
-    frontendSettings.isdbt(frontendIsdbtSettings);
+    frontendSettings.set<FrontendSettings::Tag::isdbt>(frontendIsdbtSettings);
     return frontendSettings;
 }
 
-static void getDtmbFrontendSettings(JNIEnv *env, const jobject& settings,
-        FrontendSettingsExt1_1& settingsExt1_1) {
-    uint32_t freq = getFrontendSettingsFreq(env, settings);
+static FrontendSettings getDtmbFrontendSettings(JNIEnv *env, const jobject &settings) {
+    FrontendSettings frontendSettings;
+    int32_t freq = getFrontendSettingsFreq(env, settings);
+    int32_t endFreq = getFrontendSettingsEndFreq(env, settings);
+    FrontendSpectralInversion inversion = getFrontendSettingsSpectralInversion(env, settings);
     jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DtmbFrontendSettings");
     FrontendDtmbModulation modulation =
             static_cast<FrontendDtmbModulation>(
@@ -3006,25 +3002,23 @@
             static_cast<FrontendDtmbTimeInterleaveMode>(
                     env->GetIntField(settings, env->GetFieldID(clazz, "mTimeInterleaveMode", "I")));
 
-    FrontendDtmbSettings frontendDtmbSettings {
+    FrontendDtmbSettings frontendDtmbSettings{
             .frequency = freq,
+            .endFrequency = endFreq,
             .modulation = modulation,
             .bandwidth = bandwidth,
             .transmissionMode = transmissionMode,
             .codeRate = codeRate,
             .guardInterval = guardInterval,
             .interleaveMode = interleaveMode,
+            .inversion = inversion,
     };
-    settingsExt1_1.settingExt.dtmb(frontendDtmbSettings);
+    frontendSettings.set<FrontendSettings::Tag::dtmb>(frontendDtmbSettings);
+    return frontendSettings;
 }
 
 static FrontendSettings getFrontendSettings(JNIEnv *env, int type, jobject settings) {
-    ALOGD("getFrontendSettings %d", type);
-
-    if (type == static_cast<int>(::android::hardware::tv::tuner::V1_1::FrontendType::DTMB)) {
-        return FrontendSettings();
-    }
-
+    ALOGV("getFrontendSettings %d", type);
     FrontendType feType = static_cast<FrontendType>(type);
     switch(feType) {
         case FrontendType::ANALOG:
@@ -3045,6 +3039,8 @@
             return getIsdbs3FrontendSettings(env, settings);
         case FrontendType::ISDBT:
             return getIsdbtFrontendSettings(env, settings);
+        case FrontendType::DTMB:
+            return getDtmbFrontendSettings(env, settings);
         default:
             // should never happen because a type is associated with a subclass of
             // FrontendSettings and not set by users
@@ -3054,64 +3050,6 @@
     }
 }
 
-static FrontendSettingsExt1_1 getFrontendSettingsExt1_1(
-        JNIEnv *env, int type, jobject settings, int tunerVersion) {
-    ALOGD("getFrontendSettingsExt1_1 %d", type);
-
-    FrontendSettingsExt1_1 settingsExt1_1 {
-        .endFrequency = static_cast<uint32_t>(Constant::INVALID_FRONTEND_SETTING_FREQUENCY),
-        .inversion = FrontendSpectralInversion::UNDEFINED,
-    };
-    settingsExt1_1.settingExt.noinit();
-
-    if (tunerVersion < TUNER_VERSION_1_1) {
-        return settingsExt1_1;
-    }
-
-    if (type == static_cast<int>(::android::hardware::tv::tuner::V1_1::FrontendType::DTMB)) {
-        getDtmbFrontendSettings(env, settings, settingsExt1_1);
-    } else {
-        FrontendType feType = static_cast<FrontendType>(type);
-        switch(feType) {
-            case FrontendType::DVBS:
-                getDvbsFrontendSettingsExt1_1(env, settings, settingsExt1_1);
-                break;
-            case FrontendType::DVBT:
-                getDvbtFrontendSettingsExt1_1(env, settings, settingsExt1_1);
-                break;
-            case FrontendType::ANALOG:
-                getAnalogFrontendSettingsExt1_1(env, settings, settingsExt1_1);
-                break;
-            case FrontendType::ATSC3:
-                break;
-            case FrontendType::ATSC:
-                break;
-            case FrontendType::DVBC:
-                getDvbcFrontendSettingsExt1_1(env, settings, settingsExt1_1);
-                break;
-            case FrontendType::ISDBS:
-                break;
-            case FrontendType::ISDBS3:
-                break;
-            case FrontendType::ISDBT:
-                break;
-            default:
-                // should never happen because a type is associated with a subclass of
-                // FrontendSettings and not set by users
-                jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException",
-                    "Unsupported frontend type %d", type);
-                return FrontendSettingsExt1_1();
-        }
-    }
-
-    uint32_t endFreq = getFrontendSettingsEndFreq(env, settings);
-    FrontendSpectralInversion inversion = getFrontendSettingsSpectralInversion(env, settings);
-    settingsExt1_1.endFrequency = endFreq;
-    settingsExt1_1.inversion = inversion;
-
-    return settingsExt1_1;
-}
-
 static sp<FilterClient> getFilterClient(JNIEnv *env, jobject filter) {
     return (FilterClient *)env->GetLongField(filter, gFields.filterContext);
 }
@@ -3123,18 +3061,14 @@
 static DvrSettings getDvrSettings(JNIEnv *env, jobject settings, bool isRecorder) {
     DvrSettings dvrSettings;
     jclass clazz = env->FindClass("android/media/tv/tuner/dvr/DvrSettings");
-    uint32_t statusMask =
-            static_cast<uint32_t>(env->GetIntField(
-                    settings, env->GetFieldID(clazz, "mStatusMask", "I")));
-    uint32_t lowThreshold =
-            static_cast<uint32_t>(env->GetLongField(
-                    settings, env->GetFieldID(clazz, "mLowThreshold", "J")));
-    uint32_t highThreshold =
-            static_cast<uint32_t>(env->GetLongField(
-                    settings, env->GetFieldID(clazz, "mHighThreshold", "J")));
-    uint8_t packetSize =
-            static_cast<uint8_t>(env->GetLongField(
-                    settings, env->GetFieldID(clazz, "mPacketSize", "J")));
+    int32_t statusMask = static_cast<int32_t>(
+            env->GetIntField(settings, env->GetFieldID(clazz, "mStatusMask", "I")));
+    int32_t lowThreshold = static_cast<int32_t>(
+            env->GetLongField(settings, env->GetFieldID(clazz, "mLowThreshold", "J")));
+    int32_t highThreshold = static_cast<int32_t>(
+            env->GetLongField(settings, env->GetFieldID(clazz, "mHighThreshold", "J")));
+    int8_t packetSize = static_cast<int8_t>(
+            env->GetLongField(settings, env->GetFieldID(clazz, "mPacketSize", "J")));
     DataFormat dataFormat =
             static_cast<DataFormat>(env->GetIntField(
                     settings, env->GetFieldID(clazz, "mDataFormat", "I")));
@@ -3146,7 +3080,7 @@
                 .dataFormat = dataFormat,
                 .packetSize = packetSize,
         };
-        dvrSettings.record(recordSettings);
+        dvrSettings.set<DvrSettings::Tag::record>(recordSettings);
     } else {
         PlaybackSettings PlaybackSettings {
                 .statusMask = statusMask,
@@ -3155,7 +3089,7 @@
                 .dataFormat = dataFormat,
                 .packetSize = packetSize,
         };
-        dvrSettings.playback(PlaybackSettings);
+        dvrSettings.set<DvrSettings::Tag::playback>(PlaybackSettings);
     }
     return dvrSettings;
 }
@@ -3170,10 +3104,10 @@
 
 static void android_media_tv_Tuner_native_init(JNIEnv *env) {
     jclass clazz = env->FindClass("android/media/tv/tuner/Tuner");
-    CHECK(clazz != NULL);
+    CHECK(clazz != nullptr);
 
     gFields.tunerContext = env->GetFieldID(clazz, "mNativeContext", "J");
-    CHECK(gFields.tunerContext != NULL);
+    CHECK(gFields.tunerContext != nullptr);
 
     gFields.onFrontendEventID = env->GetMethodID(clazz, "onFrontendEvent", "(I)V");
 
@@ -3256,9 +3190,7 @@
 static int android_media_tv_Tuner_tune(JNIEnv *env, jobject thiz, jint type, jobject settings) {
     sp<JTuner> tuner = getTuner(env, thiz);
     FrontendSettings setting = getFrontendSettings(env, type, settings);
-    FrontendSettingsExt1_1 settingExt = getFrontendSettingsExt1_1(
-            env, type, settings, tuner->getTunerVersion());
-    return tuner->tune(setting, settingExt);
+    return tuner->tune(setting);
 }
 
 static int android_media_tv_Tuner_stop_tune(JNIEnv *env, jobject thiz) {
@@ -3270,9 +3202,7 @@
         JNIEnv *env, jobject thiz, jint settingsType, jobject settings, jint scanType) {
     sp<JTuner> tuner = getTuner(env, thiz);
     FrontendSettings setting = getFrontendSettings(env, settingsType, settings);
-    FrontendSettingsExt1_1 settingExt = getFrontendSettingsExt1_1(
-            env, settingsType, settings, tuner->getTunerVersion());
-    return tuner->scan(setting, static_cast<FrontendScanType>(scanType), settingExt);
+    return tuner->scan(setting, static_cast<FrontendScanType>(scanType));
 }
 
 static int android_media_tv_Tuner_stop_scan(JNIEnv *env, jobject thiz) {
@@ -3283,7 +3213,7 @@
 static int android_media_tv_Tuner_set_lnb(JNIEnv *env, jobject thiz, jobject lnb) {
     sp<JTuner> tuner = getTuner(env, thiz);
     sp<LnbClient> lnbClient = getLnbClient(env, lnb);
-    if (lnbClient == NULL) {
+    if (lnbClient == nullptr) {
         ALOGE("lnb is not initialized");
         return (int)Result::INVALID_STATE;
     }
@@ -3304,9 +3234,9 @@
 static jobject android_media_tv_Tuner_get_av_sync_hw_id(
         JNIEnv *env, jobject thiz, jobject filter) {
     sp<FilterClient> filterClient = getFilterClient(env, filter);
-    if (filterClient == NULL) {
+    if (filterClient == nullptr) {
         ALOGD("Failed to get sync ID. Filter client not found");
-        return NULL;
+        return nullptr;
     }
     sp<JTuner> tuner = getTuner(env, thiz);
     return tuner->getAvSyncHwId(filterClient);
@@ -3361,22 +3291,30 @@
         .mainType = mainType,
     };
 
-    switch(mainType) {
+    switch (mainType) {
         case DemuxFilterMainType::TS:
-            filterType.subType.tsFilterType(static_cast<DemuxTsFilterType>(subType));
+            filterType.subType.set<DemuxFilterSubType::Tag::tsFilterType>(
+                    static_cast<DemuxTsFilterType>(subType));
             break;
         case DemuxFilterMainType::MMTP:
-            filterType.subType.mmtpFilterType(static_cast<DemuxMmtpFilterType>(subType));
+            filterType.subType.set<DemuxFilterSubType::Tag::mmtpFilterType>(
+                    static_cast<DemuxMmtpFilterType>(subType));
             break;
         case DemuxFilterMainType::IP:
-            filterType.subType.ipFilterType(static_cast<DemuxIpFilterType>(subType));
+            filterType.subType.set<DemuxFilterSubType::Tag::ipFilterType>(
+                    static_cast<DemuxIpFilterType>(subType));
             break;
         case DemuxFilterMainType::TLV:
-            filterType.subType.tlvFilterType(static_cast<DemuxTlvFilterType>(subType));
+            filterType.subType.set<DemuxFilterSubType::Tag::tlvFilterType>(
+                    static_cast<DemuxTlvFilterType>(subType));
             break;
         case DemuxFilterMainType::ALP:
-            filterType.subType.alpFilterType(static_cast<DemuxAlpFilterType>(subType));
+            filterType.subType.set<DemuxFilterSubType::Tag::alpFilterType>(
+                    static_cast<DemuxAlpFilterType>(subType));
             break;
+        default:
+            ALOGD("Demux Filter Main Type is undefined.");
+            return nullptr;
     }
 
     return tuner->openFilter(filterType, bufferSize);
@@ -3416,16 +3354,16 @@
     return filterSectionBits;
 }
 
-static DemuxFilterSectionSettings::Condition::TableInfo getFilterTableInfo(
-        JNIEnv *env, const jobject& settings) {
+static DemuxFilterSectionSettingsConditionTableInfo getFilterTableInfo(JNIEnv *env,
+                                                                       const jobject &settings) {
     jclass clazz = env->FindClass("android/media/tv/tuner/filter/SectionSettingsWithTableInfo");
     uint16_t tableId = static_cast<uint16_t>(
             env->GetIntField(settings, env->GetFieldID(clazz, "mTableId", "I")));
     uint16_t version = static_cast<uint16_t>(
             env->GetIntField(settings, env->GetFieldID(clazz, "mVersion", "I")));
-    DemuxFilterSectionSettings::Condition::TableInfo tableInfo {
-        .tableId = tableId,
-        .version = version,
+    DemuxFilterSectionSettingsConditionTableInfo tableInfo{
+            .tableId = tableId,
+            .version = version,
     };
     return tableInfo;
 }
@@ -3447,11 +3385,13 @@
     if (env->IsInstanceOf(
             settings,
             env->FindClass("android/media/tv/tuner/filter/SectionSettingsWithSectionBits"))) {
-        filterSectionSettings.condition.sectionBits(getFilterSectionBits(env, settings));
+        filterSectionSettings.condition.set<DemuxFilterSectionSettingsCondition::Tag::sectionBits>(
+                getFilterSectionBits(env, settings));
     } else if (env->IsInstanceOf(
             settings,
             env->FindClass("android/media/tv/tuner/filter/SectionSettingsWithTableInfo"))) {
-        filterSectionSettings.condition.tableInfo(getFilterTableInfo(env, settings));
+        filterSectionSettings.condition.set<DemuxFilterSectionSettingsCondition::Tag::tableInfo>(
+                getFilterTableInfo(env, settings));
     }
     return filterSectionSettings;
 }
@@ -3479,13 +3419,13 @@
     AudioStreamType audioStreamType = static_cast<AudioStreamType>(
             env->GetIntField(settingsObj, env->GetFieldID(clazz, "mAudioStreamType", "I")));
     if (audioStreamType != AudioStreamType::UNDEFINED) {
-        type.audio(audioStreamType);
+        type.set<AvStreamType::Tag::audio>(audioStreamType);
         return true;
     }
     VideoStreamType videoStreamType = static_cast<VideoStreamType>(
             env->GetIntField(settingsObj, env->GetFieldID(clazz, "mVideoStreamType", "I")));
     if (videoStreamType != VideoStreamType::UNDEFINED) {
-        type.video(videoStreamType);
+        type.set<AvStreamType::Tag::video>(videoStreamType);
         return true;
     }
     return false;
@@ -3506,7 +3446,7 @@
 
 static DemuxFilterRecordSettings getFilterRecordSettings(JNIEnv *env, const jobject& settings) {
     jclass clazz = env->FindClass("android/media/tv/tuner/filter/RecordSettings");
-    hidl_bitfield<DemuxTsIndex> tsIndexMask = static_cast<hidl_bitfield<DemuxTsIndex>>(
+    int32_t tsIndexMask = static_cast<int32_t>(
             env->GetIntField(settings, env->GetFieldID(clazz, "mTsIndexMask", "I")));
     DemuxRecordScIndexType scIndexType = static_cast<DemuxRecordScIndexType>(
             env->GetIntField(settings, env->GetFieldID(clazz, "mScIndexType", "I")));
@@ -3517,17 +3457,16 @@
         .scIndexType = scIndexType,
     };
     if (scIndexType == DemuxRecordScIndexType::SC) {
-        filterRecordSettings.scIndexMask.sc(static_cast<hidl_bitfield<DemuxScIndex>>(scIndexMask));
+        filterRecordSettings.scIndexMask.set<DemuxFilterScIndexMask::Tag::scIndex>(scIndexMask);
     } else if (scIndexType == DemuxRecordScIndexType::SC_HEVC) {
-        filterRecordSettings.scIndexMask.scHevc(
-                static_cast<hidl_bitfield<DemuxScHevcIndex>>(scIndexMask));
+        filterRecordSettings.scIndexMask.set<DemuxFilterScIndexMask::Tag::scHevc>(scIndexMask);
     }
     return filterRecordSettings;
 }
 
 static DemuxFilterDownloadSettings getFilterDownloadSettings(JNIEnv *env, const jobject& settings) {
     jclass clazz = env->FindClass("android/media/tv/tuner/filter/DownloadSettings");
-    uint32_t downloadId = static_cast<uint32_t>(
+    int32_t downloadId = static_cast<int32_t>(
             env->GetIntField(settings, env->GetFieldID(clazz, "mDownloadId", "I")));
 
     DemuxFilterDownloadSettings filterDownloadSettings {
@@ -3556,23 +3495,23 @@
     }
 
     if (srcSize == IP_V4_LENGTH) {
-        uint8_t srcAddr[IP_V4_LENGTH];
-        uint8_t dstAddr[IP_V4_LENGTH];
-        env->GetByteArrayRegion(
-                jsrcIpAddress, 0, srcSize, reinterpret_cast<jbyte*>(srcAddr));
-        env->GetByteArrayRegion(
-                jdstIpAddress, 0, dstSize, reinterpret_cast<jbyte*>(dstAddr));
-        res.srcIpAddress.v4(srcAddr);
-        res.dstIpAddress.v4(dstAddr);
+        vector<uint8_t> srcAddr;
+        vector<uint8_t> dstAddr;
+        srcAddr.resize(IP_V4_LENGTH);
+        dstAddr.resize(IP_V4_LENGTH);
+        env->GetByteArrayRegion(jsrcIpAddress, 0, srcSize, reinterpret_cast<jbyte *>(&srcAddr[0]));
+        env->GetByteArrayRegion(jdstIpAddress, 0, dstSize, reinterpret_cast<jbyte *>(&dstAddr[0]));
+        res.srcIpAddress.set<DemuxIpAddressIpAddress::Tag::v4>(srcAddr);
+        res.dstIpAddress.set<DemuxIpAddressIpAddress::Tag::v4>(dstAddr);
     } else if (srcSize == IP_V6_LENGTH) {
-        uint8_t srcAddr[IP_V6_LENGTH];
-        uint8_t dstAddr[IP_V6_LENGTH];
-        env->GetByteArrayRegion(
-                jsrcIpAddress, 0, srcSize, reinterpret_cast<jbyte*>(srcAddr));
-        env->GetByteArrayRegion(
-                jdstIpAddress, 0, dstSize, reinterpret_cast<jbyte*>(dstAddr));
-        res.srcIpAddress.v6(srcAddr);
-        res.dstIpAddress.v6(dstAddr);
+        vector<uint8_t> srcAddr;
+        vector<uint8_t> dstAddr;
+        srcAddr.resize(IP_V6_LENGTH);
+        dstAddr.resize(IP_V6_LENGTH);
+        env->GetByteArrayRegion(jsrcIpAddress, 0, srcSize, reinterpret_cast<jbyte *>(&srcAddr[0]));
+        env->GetByteArrayRegion(jdstIpAddress, 0, dstSize, reinterpret_cast<jbyte *>(&dstAddr[0]));
+        res.srcIpAddress.set<DemuxIpAddressIpAddress::Tag::v6>(srcAddr);
+        res.dstIpAddress.set<DemuxIpAddressIpAddress::Tag::v6>(dstAddr);
     } else {
         // should never happen. Validated on Java size.
         jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException",
@@ -3580,10 +3519,10 @@
         return res;
     }
 
-    uint16_t srcPort = static_cast<uint16_t>(
-            env->GetIntField(config, env->GetFieldID(clazz, "mSrcPort", "I")));
-    uint16_t dstPort = static_cast<uint16_t>(
-            env->GetIntField(config, env->GetFieldID(clazz, "mDstPort", "I")));
+    int16_t srcPort =
+            static_cast<int16_t>(env->GetIntField(config, env->GetFieldID(clazz, "mSrcPort", "I")));
+    int16_t dstPort =
+            static_cast<int16_t>(env->GetIntField(config, env->GetFieldID(clazz, "mDstPort", "I")));
 
     res.srcPort = srcPort;
     res.dstPort = dstPort;
@@ -3611,30 +3550,35 @@
                 .tpid = tpid,
             };
 
-            if (settingsObj != NULL) {
+            if (settingsObj != nullptr) {
                 DemuxTsFilterType tsType = static_cast<DemuxTsFilterType>(subtype);
                 switch (tsType) {
                     case DemuxTsFilterType::SECTION:
-                        tsFilterSettings.filterSettings.section(
-                                getFilterSectionSettings(env, settingsObj));
+                        tsFilterSettings.filterSettings
+                                .set<DemuxTsFilterSettingsFilterSettings::Tag::section>(
+                                        getFilterSectionSettings(env, settingsObj));
                         break;
                     case DemuxTsFilterType::AUDIO:
                     case DemuxTsFilterType::VIDEO:
-                        tsFilterSettings.filterSettings.av(getFilterAvSettings(env, settingsObj));
+                        tsFilterSettings.filterSettings
+                                .set<DemuxTsFilterSettingsFilterSettings::Tag::av>(
+                                        getFilterAvSettings(env, settingsObj));
                         break;
                     case DemuxTsFilterType::PES:
-                        tsFilterSettings.filterSettings.pesData(
-                                getFilterPesDataSettings(env, settingsObj));
+                        tsFilterSettings.filterSettings
+                                .set<DemuxTsFilterSettingsFilterSettings::Tag::pesData>(
+                                        getFilterPesDataSettings(env, settingsObj));
                         break;
                     case DemuxTsFilterType::RECORD:
-                        tsFilterSettings.filterSettings.record(
-                                getFilterRecordSettings(env, settingsObj));
+                        tsFilterSettings.filterSettings
+                                .set<DemuxTsFilterSettingsFilterSettings::Tag::record>(
+                                        getFilterRecordSettings(env, settingsObj));
                         break;
                     default:
                         break;
                 }
             }
-            filterSettings.ts(tsFilterSettings);
+            filterSettings.set<DemuxFilterSettings::Tag::ts>(tsFilterSettings);
             break;
         }
         case DemuxFilterMainType::MMTP: {
@@ -3645,34 +3589,40 @@
                 .mmtpPid = mmtpPid,
             };
 
-            if (settingsObj != NULL) {
+            if (settingsObj != nullptr) {
                 DemuxMmtpFilterType mmtpType = static_cast<DemuxMmtpFilterType>(subtype);
                 switch (mmtpType) {
                     case DemuxMmtpFilterType::SECTION:
-                        mmtpFilterSettings.filterSettings.section(
-                                getFilterSectionSettings(env, settingsObj));
+                        mmtpFilterSettings.filterSettings
+                                .set<DemuxMmtpFilterSettingsFilterSettings::Tag::section>(
+                                        getFilterSectionSettings(env, settingsObj));
                         break;
                     case DemuxMmtpFilterType::AUDIO:
                     case DemuxMmtpFilterType::VIDEO:
-                        mmtpFilterSettings.filterSettings.av(getFilterAvSettings(env, settingsObj));
+                        mmtpFilterSettings.filterSettings
+                                .set<DemuxMmtpFilterSettingsFilterSettings::Tag::av>(
+                                        getFilterAvSettings(env, settingsObj));
                         break;
                     case DemuxMmtpFilterType::PES:
-                        mmtpFilterSettings.filterSettings.pesData(
-                                getFilterPesDataSettings(env, settingsObj));
+                        mmtpFilterSettings.filterSettings
+                                .set<DemuxMmtpFilterSettingsFilterSettings::Tag::pesData>(
+                                        getFilterPesDataSettings(env, settingsObj));
                         break;
                     case DemuxMmtpFilterType::RECORD:
-                        mmtpFilterSettings.filterSettings.record(
-                                getFilterRecordSettings(env, settingsObj));
+                        mmtpFilterSettings.filterSettings
+                                .set<DemuxMmtpFilterSettingsFilterSettings::Tag::record>(
+                                        getFilterRecordSettings(env, settingsObj));
                         break;
                     case DemuxMmtpFilterType::DOWNLOAD:
-                        mmtpFilterSettings.filterSettings.download(
-                                getFilterDownloadSettings(env, settingsObj));
+                        mmtpFilterSettings.filterSettings
+                                .set<DemuxMmtpFilterSettingsFilterSettings::Tag::download>(
+                                        getFilterDownloadSettings(env, settingsObj));
                         break;
                     default:
                         break;
                 }
             }
-            filterSettings.mmtp(mmtpFilterSettings);
+            filterSettings.set<DemuxFilterSettings::Tag::mmtp>(mmtpFilterSettings);
             break;
         }
         case DemuxFilterMainType::IP: {
@@ -3682,8 +3632,9 @@
             };
 
             DemuxIpFilterType ipType = static_cast<DemuxIpFilterType>(subtype);
-            if (ipType == DemuxIpFilterType::SECTION && settingsObj != NULL) {
-                ipFilterSettings.filterSettings.section(
+            if (ipType == DemuxIpFilterType::SECTION && settingsObj != nullptr) {
+                ipFilterSettings.filterSettings
+                        .set<DemuxIpFilterSettingsFilterSettings::Tag::section>(
                                 getFilterSectionSettings(env, settingsObj));
             } else if (ipType == DemuxIpFilterType::IP) {
                 jclass clazz = env->FindClass(
@@ -3692,14 +3643,15 @@
                         env->GetBooleanField(
                                 filterConfigObj, env->GetFieldID(
                                         clazz, "mPassthrough", "Z")));
-                ipFilterSettings.filterSettings.bPassthrough(bPassthrough);
+                ipFilterSettings.filterSettings
+                        .set<DemuxIpFilterSettingsFilterSettings::Tag::bPassthrough>(bPassthrough);
             }
-            filterSettings.ip(ipFilterSettings);
+            filterSettings.set<DemuxFilterSettings::Tag::ip>(ipFilterSettings);
             break;
         }
         case DemuxFilterMainType::TLV: {
             jclass clazz = env->FindClass("android/media/tv/tuner/filter/TlvFilterConfiguration");
-            uint8_t packetType = static_cast<uint8_t>(
+            int8_t packetType = static_cast<int8_t>(
                     env->GetIntField(filterConfigObj, env->GetFieldID(clazz, "mPacketType", "I")));
             bool isCompressedIpPacket = static_cast<bool>(
                     env->GetBooleanField(
@@ -3711,22 +3663,24 @@
             };
 
             DemuxTlvFilterType tlvType = static_cast<DemuxTlvFilterType>(subtype);
-            if (tlvType == DemuxTlvFilterType::SECTION && settingsObj != NULL) {
-                tlvFilterSettings.filterSettings.section(
-                        getFilterSectionSettings(env, settingsObj));
+            if (tlvType == DemuxTlvFilterType::SECTION && settingsObj != nullptr) {
+                tlvFilterSettings.filterSettings
+                        .set<DemuxTlvFilterSettingsFilterSettings::Tag::section>(
+                                getFilterSectionSettings(env, settingsObj));
             } else if (tlvType == DemuxTlvFilterType::TLV) {
                 bool bPassthrough = static_cast<bool>(
                 env->GetBooleanField(
                         filterConfigObj, env->GetFieldID(
                                 clazz, "mPassthrough", "Z")));
-                tlvFilterSettings.filterSettings.bPassthrough(bPassthrough);
+                tlvFilterSettings.filterSettings
+                        .set<DemuxTlvFilterSettingsFilterSettings::Tag::bPassthrough>(bPassthrough);
             }
-            filterSettings.tlv(tlvFilterSettings);
+            filterSettings.set<DemuxFilterSettings::Tag::tlv>(tlvFilterSettings);
             break;
         }
         case DemuxFilterMainType::ALP: {
             jclass clazz = env->FindClass("android/media/tv/tuner/filter/AlpFilterConfiguration");
-            uint8_t packetType = static_cast<uint8_t>(
+            int8_t packetType = static_cast<int8_t>(
                     env->GetIntField(filterConfigObj, env->GetFieldID(clazz, "mPacketType", "I")));
             DemuxAlpLengthType lengthType = static_cast<DemuxAlpLengthType>(
                     env->GetIntField(filterConfigObj, env->GetFieldID(clazz, "mLengthType", "I")));
@@ -3735,18 +3689,19 @@
                 .lengthType = lengthType,
             };
 
-            if (settingsObj != NULL) {
+            if (settingsObj != nullptr) {
                 DemuxAlpFilterType alpType = static_cast<DemuxAlpFilterType>(subtype);
                 switch (alpType) {
                     case DemuxAlpFilterType::SECTION:
-                        alpFilterSettings.filterSettings.section(
-                                getFilterSectionSettings(env, settingsObj));
+                        alpFilterSettings.filterSettings
+                                .set<DemuxAlpFilterSettingsFilterSettings::Tag::section>(
+                                        getFilterSectionSettings(env, settingsObj));
                         break;
                     default:
                         break;
                 }
             }
-            filterSettings.alp(alpFilterSettings);
+            filterSettings.set<DemuxFilterSettings::Tag::alp>(alpFilterSettings);
             break;
         }
         default: {
@@ -3767,34 +3722,33 @@
 }
 
 static bool isAvFilterSettings(DemuxFilterSettings filterSettings) {
-    return (filterSettings.getDiscriminator() == DemuxFilterSettings::hidl_discriminator::ts
-            && filterSettings.ts().filterSettings.getDiscriminator()
-                    == DemuxTsFilterSettings::FilterSettings::hidl_discriminator::av)
-            ||
-            (filterSettings.getDiscriminator() == DemuxFilterSettings::hidl_discriminator::mmtp
-            && filterSettings.mmtp().filterSettings.getDiscriminator()
-                    == DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::av);
+    return (filterSettings.getTag() == DemuxFilterSettings::Tag::ts &&
+            filterSettings.get<DemuxFilterSettings::Tag::ts>().filterSettings.getTag() ==
+                    DemuxTsFilterSettingsFilterSettings::Tag::av) ||
+            (filterSettings.getTag() == DemuxFilterSettings::Tag::mmtp &&
+             filterSettings.get<DemuxFilterSettings::Tag::mmtp>().filterSettings.getTag() ==
+                     DemuxMmtpFilterSettingsFilterSettings::Tag::av);
 }
 
 static jint android_media_tv_Tuner_configure_filter(
         JNIEnv *env, jobject filter, int type, int subtype, jobject settings) {
-    ALOGD("configure filter type=%d, subtype=%d", type, subtype);
+    ALOGV("configure filter type=%d, subtype=%d", type, subtype);
     sp<FilterClient> filterClient = getFilterClient(env, filter);
-    if (filterClient == NULL) {
+    if (filterClient == nullptr) {
         ALOGD("Failed to configure filter: filter not found");
-        return (jint) Result::NOT_INITIALIZED;
+        return (jint)Result::NOT_INITIALIZED;
     }
     DemuxFilterSettings filterSettings = getFilterConfiguration(env, type, subtype, settings);
     Result res = filterClient->configure(filterSettings);
 
     if (res != Result::SUCCESS) {
-        return (jint) res;
+        return (jint)res;
     }
 
     if (static_cast<DemuxFilterMainType>(type) == DemuxFilterMainType::IP) {
         res = configureIpFilterContextId(env, filterClient, settings);
         if (res != Result::SUCCESS) {
-            return (jint) res;
+            return (jint)res;
         }
     }
 
@@ -3802,99 +3756,98 @@
     if (isAvFilterSettings(filterSettings) && getAvStreamType(env, settings, streamType)) {
         res = filterClient->configureAvStreamType(streamType);
     }
-    return (jint) res;
+    return (jint)res;
 }
 
 static jint android_media_tv_Tuner_get_filter_id(JNIEnv* env, jobject filter) {
     sp<FilterClient> filterClient = getFilterClient(env, filter);
-    if (filterClient == NULL) {
+    if (filterClient == nullptr) {
         ALOGD("Failed to get filter ID: filter client not found");
         return (int) Result::NOT_INITIALIZED;
     }
-    uint32_t id;
+    int32_t id;
     Result res = filterClient->getId(id);
     if (res != Result::SUCCESS) {
-        return (jint) Constant::INVALID_FILTER_ID;
+        return (jint)Constant::INVALID_FILTER_ID;
     }
-    return (jint) id;
+    return (jint)id;
 }
 
 static jlong android_media_tv_Tuner_get_filter_64bit_id(JNIEnv* env, jobject filter) {
     sp<FilterClient> filterClient = getFilterClient(env, filter);
-    if (filterClient == NULL) {
+    if (filterClient == nullptr) {
         ALOGD("Failed to get filter ID 64 bit: filter client not found");
-        return (int) Result::NOT_INITIALIZED;
+        return (int)Result::NOT_INITIALIZED;
     }
-    uint64_t id;
+    int64_t id;
     Result res = filterClient->getId64Bit(id);
-    return (res == Result::SUCCESS) ?
-            static_cast<jlong>(id) : static_cast<jlong>(
-                    ::android::hardware::tv::tuner::V1_1::Constant64Bit::INVALID_FILTER_ID_64BIT);
+    return (res == Result::SUCCESS) ? static_cast<jlong>(id)
+                                    : static_cast<jlong>(Constant64Bit::INVALID_FILTER_ID_64BIT);
 }
 
 static jint android_media_tv_Tuner_configure_monitor_event(
         JNIEnv* env, jobject filter, int monitorEventType) {
     sp<FilterClient> filterClient = getFilterClient(env, filter);
-    if (filterClient == NULL) {
+    if (filterClient == nullptr) {
         ALOGD("Failed to configure scrambling event: filter client not found");
-        return (int) Result::NOT_INITIALIZED;
+        return (int)Result::NOT_INITIALIZED;
     }
     Result res = filterClient->configureMonitorEvent(monitorEventType);
-    return (jint) res;
+    return (jint)res;
 }
 
 static jint android_media_tv_Tuner_set_filter_data_source(
         JNIEnv* env, jobject filter, jobject srcFilter) {
     sp<FilterClient> filterClient = getFilterClient(env, filter);
-    if (filterClient == NULL) {
+    if (filterClient == nullptr) {
         ALOGD("Failed to set filter data source: filter client not found");
-        return (int) Result::NOT_INITIALIZED;
+        return (int)Result::NOT_INITIALIZED;
     }
     Result res;
-    if (srcFilter == NULL) {
-        res = filterClient->setDataSource(NULL);
+    if (srcFilter == nullptr) {
+        res = filterClient->setDataSource(nullptr);
     } else {
         sp<FilterClient> srcClient = getFilterClient(env, srcFilter);
-        if (srcClient == NULL) {
+        if (srcClient == nullptr) {
             ALOGD("Failed to set filter data source: src filter not found");
-            return (jint) Result::INVALID_ARGUMENT;
+            return (jint)Result::INVALID_ARGUMENT;
         }
         res = filterClient->setDataSource(srcClient);
     }
-    return (jint) res;
+    return (jint)res;
 }
 
 static jint android_media_tv_Tuner_start_filter(JNIEnv *env, jobject filter) {
     sp<FilterClient> filterClient = getFilterClient(env, filter);
-    if (filterClient == NULL) {
+    if (filterClient == nullptr) {
         ALOGD("Failed to start filter: filter client not found");
-        return (int) Result::NOT_INITIALIZED;
+        return (int)Result::NOT_INITIALIZED;
     }
-    return (jint) filterClient->start();
+    return (jint)filterClient->start();
 }
 
 static jint android_media_tv_Tuner_stop_filter(JNIEnv *env, jobject filter) {
     sp<FilterClient> filterClient = getFilterClient(env, filter);
-    if (filterClient == NULL) {
+    if (filterClient == nullptr) {
         ALOGD("Failed to stop filter: filter client not found");
-        return (int) Result::NOT_INITIALIZED;
+        return (int)Result::NOT_INITIALIZED;
     }
-    return (jint) filterClient->stop();
+    return (jint)filterClient->stop();
 }
 
 static jint android_media_tv_Tuner_flush_filter(JNIEnv *env, jobject filter) {
     sp<FilterClient> filterClient = getFilterClient(env, filter);
-    if (filterClient == NULL) {
+    if (filterClient == nullptr) {
         ALOGD("Failed to flush filter: filter client not found");
-        return (int) Result::NOT_INITIALIZED;
+        return (int)Result::NOT_INITIALIZED;
     }
-    return (jint) filterClient->flush();
+    return (jint)filterClient->flush();
 }
 
 static jint android_media_tv_Tuner_read_filter_fmq(
         JNIEnv *env, jobject filter, jbyteArray buffer, jlong offset, jlong size) {
     sp<FilterClient> filterClient = getFilterClient(env, filter);
-    if (filterClient == NULL) {
+    if (filterClient == nullptr) {
         jniThrowException(env, "java/lang/IllegalStateException",
                 "Failed to read filter FMQ: filter client not found");
         return -1;
@@ -3902,25 +3855,25 @@
 
     jboolean isCopy;
     jbyte *dst = env->GetByteArrayElements(buffer, &isCopy);
-    ALOGD("copyData, isCopy=%d", isCopy);
+    ALOGV("copyData, isCopy=%d", isCopy);
     if (dst == nullptr) {
         jniThrowRuntimeException(env, "Failed to GetByteArrayElements");
         return -1;
     }
     int realReadSize = filterClient->read(reinterpret_cast<int8_t*>(dst) + offset, size);
     env->ReleaseByteArrayElements(buffer, dst, 0);
-    return (jint) realReadSize;
+    return (jint)realReadSize;
 }
 
 static jint android_media_tv_Tuner_close_filter(JNIEnv *env, jobject filter) {
     sp<FilterClient> filterClient = getFilterClient(env, filter);
-    if (filterClient == NULL) {
+    if (filterClient == nullptr) {
         jniThrowException(env, "java/lang/IllegalStateException",
                 "Failed to close filter: filter client not found");
         return 0;
     }
 
-    return (jint) filterClient->close();
+    return (jint)filterClient->close();
 }
 
 static sp<TimeFilterClient> getTimeFilterClient(JNIEnv *env, jobject filter) {
@@ -3930,33 +3883,31 @@
 static int android_media_tv_Tuner_time_filter_set_timestamp(
         JNIEnv *env, jobject filter, jlong timestamp) {
     sp<TimeFilterClient> timeFilterClient = getTimeFilterClient(env, filter);
-    if (timeFilterClient == NULL) {
+    if (timeFilterClient == nullptr) {
         ALOGD("Failed set timestamp: time filter client not found");
         return (int) Result::INVALID_STATE;
     }
-    Result r = timeFilterClient->setTimeStamp(static_cast<uint64_t>(timestamp));
-    return (int) r;
+    return (int)timeFilterClient->setTimeStamp(static_cast<int64_t>(timestamp));
 }
 
 static int android_media_tv_Tuner_time_filter_clear_timestamp(JNIEnv *env, jobject filter) {
     sp<TimeFilterClient> timeFilterClient = getTimeFilterClient(env, filter);
-    if (timeFilterClient == NULL) {
+    if (timeFilterClient == nullptr) {
         ALOGD("Failed clear timestamp: time filter client not found");
         return (int) Result::INVALID_STATE;
     }
-    Result r = timeFilterClient->clearTimeStamp();
-    return (int) r;
+    return (int)timeFilterClient->clearTimeStamp();
 }
 
 static jobject android_media_tv_Tuner_time_filter_get_timestamp(JNIEnv *env, jobject filter) {
     sp<TimeFilterClient> timeFilterClient = getTimeFilterClient(env, filter);
-    if (timeFilterClient == NULL) {
+    if (timeFilterClient == nullptr) {
         ALOGD("Failed get timestamp: time filter client not found");
-        return NULL;
+        return nullptr;
     }
-    uint64_t timestamp = timeFilterClient->getTimeStamp();
+    int64_t timestamp = timeFilterClient->getTimeStamp();
     if (timestamp == (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP) {
-        return NULL;
+        return nullptr;
     }
 
     jclass longClazz = env->FindClass("java/lang/Long");
@@ -3968,13 +3919,13 @@
 
 static jobject android_media_tv_Tuner_time_filter_get_source_time(JNIEnv *env, jobject filter) {
     sp<TimeFilterClient> timeFilterClient = getTimeFilterClient(env, filter);
-    if (timeFilterClient == NULL) {
+    if (timeFilterClient == nullptr) {
         ALOGD("Failed get source time: time filter client not found");
-        return NULL;
+        return nullptr;
     }
-    uint64_t timestamp = timeFilterClient->getSourceTime();
+    int64_t timestamp = timeFilterClient->getSourceTime();
     if (timestamp == (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP) {
-        return NULL;
+        return nullptr;
     }
 
     jclass longClazz = env->FindClass("java/lang/Long");
@@ -3986,7 +3937,7 @@
 
 static int android_media_tv_Tuner_time_filter_close(JNIEnv *env, jobject filter) {
     sp<TimeFilterClient> timeFilterClient = getTimeFilterClient(env, filter);
-    if (timeFilterClient == NULL) {
+    if (timeFilterClient == nullptr) {
         ALOGD("Failed close time filter: time filter client not found");
         return (int) Result::INVALID_STATE;
     }
@@ -3996,7 +3947,7 @@
         timeFilterClient->decStrong(filter);
         env->SetLongField(filter, gFields.timeFilterContext, 0);
     }
-    return (int) r;
+    return (int)r;
 }
 
 static jobject android_media_tv_Tuner_open_descrambler(JNIEnv *env, jobject thiz, jint) {
@@ -4007,48 +3958,48 @@
 static jint android_media_tv_Tuner_descrambler_add_pid(
         JNIEnv *env, jobject descrambler, jint pidType, jint pid, jobject filter) {
     sp<DescramblerClient> descramblerClient = getDescramblerClient(env, descrambler);
-    if (descramblerClient == NULL) {
-        return (jint) Result::NOT_INITIALIZED;
+    if (descramblerClient == nullptr) {
+        return (jint)Result::NOT_INITIALIZED;
     }
-    sp<FilterClient> filterClient = (filter == NULL) ? NULL : getFilterClient(env, filter);
+    sp<FilterClient> filterClient = (filter == nullptr) ? nullptr : getFilterClient(env, filter);
     Result result = descramblerClient->addPid(getDemuxPid((int)pidType, (int)pid), filterClient);
-    return (jint) result;
+    return (jint)result;
 }
 
 static jint android_media_tv_Tuner_descrambler_remove_pid(
         JNIEnv *env, jobject descrambler, jint pidType, jint pid, jobject filter) {
     sp<DescramblerClient> descramblerClient = getDescramblerClient(env, descrambler);
-    if (descramblerClient == NULL) {
-        return (jint) Result::NOT_INITIALIZED;
+    if (descramblerClient == nullptr) {
+        return (jint)Result::NOT_INITIALIZED;
     }
-    sp<FilterClient> filterClient = (filter == NULL) ? NULL : getFilterClient(env, filter);
+    sp<FilterClient> filterClient = (filter == nullptr) ? nullptr : getFilterClient(env, filter);
     Result result = descramblerClient->removePid(getDemuxPid((int)pidType, (int)pid), filterClient);
-    return (jint) result;
+    return (jint)result;
 }
 
 static jint android_media_tv_Tuner_descrambler_set_key_token(
         JNIEnv* env, jobject descrambler, jbyteArray keyToken) {
     sp<DescramblerClient> descramblerClient = getDescramblerClient(env, descrambler);
-    if (descramblerClient == NULL) {
-        return (jint) Result::NOT_INITIALIZED;
+    if (descramblerClient == nullptr) {
+        return (jint)Result::NOT_INITIALIZED;
     }
     int size = env->GetArrayLength(keyToken);
     std::vector<uint8_t> v(size);
     env->GetByteArrayRegion(keyToken, 0, size, reinterpret_cast<jbyte*>(&v[0]));
     Result result = descramblerClient->setKeyToken(v);
-    return (jint) result;
+    return (jint)result;
 }
 
 static jint android_media_tv_Tuner_close_descrambler(JNIEnv* env, jobject descrambler) {
     sp<DescramblerClient> descramblerClient = getDescramblerClient(env, descrambler);
-    if (descramblerClient == NULL) {
-        return (jint) Result::NOT_INITIALIZED;
+    if (descramblerClient == nullptr) {
+        return (jint)Result::NOT_INITIALIZED;
     }
     Result r = descramblerClient->close();
     if (r == Result::SUCCESS) {
         descramblerClient->decStrong(descrambler);
     }
-    return (jint) r;
+    return (jint)r;
 }
 
 static jobject android_media_tv_Tuner_open_dvr_recorder(
@@ -4070,13 +4021,13 @@
 
 static jint android_media_tv_Tuner_open_demux(JNIEnv* env, jobject thiz, jint handle) {
     sp<JTuner> tuner = getTuner(env, thiz);
-    return (jint) tuner->openDemux(handle);
+    return (jint)tuner->openDemux(handle);
 }
 
 static jint android_media_tv_Tuner_close_tuner(JNIEnv* env, jobject thiz) {
     sp<JTuner> tuner = getTuner(env, thiz);
-    setTuner(env, thiz, NULL);
-    return (jint) tuner->close();
+    setTuner(env, thiz, nullptr);
+    return (jint)tuner->close();
 }
 
 static jint android_media_tv_Tuner_close_demux(JNIEnv* env, jobject thiz, jint /* handle */) {
@@ -4091,97 +4042,94 @@
 
 static jint android_media_tv_Tuner_attach_filter(JNIEnv *env, jobject dvr, jobject filter) {
     sp<FilterClient> filterClient = getFilterClient(env, filter);
-    if (filterClient == NULL) {
-        return (jint) Result::INVALID_ARGUMENT;
+    if (filterClient == nullptr) {
+        return (jint)Result::INVALID_ARGUMENT;
     }
     sp<DvrClient> dvrClient = getDvrClient(env, dvr);
-    if (dvrClient == NULL) {
-        return (jint) Result::NOT_INITIALIZED;
+    if (dvrClient == nullptr) {
+        return (jint)Result::NOT_INITIALIZED;
     }
     Result result = dvrClient->attachFilter(filterClient);
-    return (jint) result;
+    return (jint)result;
 }
 
 static jint android_media_tv_Tuner_detach_filter(JNIEnv *env, jobject dvr, jobject filter) {
     sp<FilterClient> filterClient = getFilterClient(env, filter);
-    if (filterClient == NULL) {
-        return (jint) Result::INVALID_ARGUMENT;
+    if (filterClient == nullptr) {
+        return (jint)Result::INVALID_ARGUMENT;
     }
     sp<DvrClient> dvrClient = getDvrClient(env, dvr);
-    if (dvrClient == NULL) {
-        return (jint) Result::NOT_INITIALIZED;
+    if (dvrClient == nullptr) {
+        return (jint)Result::NOT_INITIALIZED;
     }
     Result result = dvrClient->detachFilter(filterClient);
-    return (jint) result;
+    return (jint)result;
 }
 
 static jint android_media_tv_Tuner_configure_dvr(JNIEnv *env, jobject dvr, jobject settings) {
     sp<DvrClient> dvrClient = getDvrClient(env, dvr);
-    if (dvrClient == NULL) {
+    if (dvrClient == nullptr) {
         ALOGD("Failed to configure dvr: dvr client not found");
         return (int)Result::NOT_INITIALIZED;
     }
     bool isRecorder =
             env->IsInstanceOf(dvr, env->FindClass("android/media/tv/tuner/dvr/DvrRecorder"));
     Result result = dvrClient->configure(getDvrSettings(env, settings, isRecorder));
-    return (jint) result;
+    return (jint)result;
 }
 
 static jint android_media_tv_Tuner_start_dvr(JNIEnv *env, jobject dvr) {
     sp<DvrClient> dvrClient = getDvrClient(env, dvr);
-    if (dvrClient == NULL) {
+    if (dvrClient == nullptr) {
         ALOGD("Failed to start dvr: dvr client not found");
-        return (jint) Result::NOT_INITIALIZED;
+        return (jint)Result::NOT_INITIALIZED;
     }
     Result result = dvrClient->start();
-    return (jint) result;
+    return (jint)result;
 }
 
 static jint android_media_tv_Tuner_stop_dvr(JNIEnv *env, jobject dvr) {
     sp<DvrClient> dvrClient = getDvrClient(env, dvr);
-    if (dvrClient == NULL) {
+    if (dvrClient == nullptr) {
         ALOGD("Failed to stop dvr: dvr client not found");
-        return (jint) Result::NOT_INITIALIZED;
+        return (jint)Result::NOT_INITIALIZED;
     }
     Result result = dvrClient->stop();
-    return (jint) result;
+    return (jint)result;
 }
 
 static jint android_media_tv_Tuner_flush_dvr(JNIEnv *env, jobject dvr) {
     sp<DvrClient> dvrClient = getDvrClient(env, dvr);
-    if (dvrClient == NULL) {
+    if (dvrClient == nullptr) {
         ALOGD("Failed to flush dvr: dvr client not found");
-        return (jint) Result::NOT_INITIALIZED;
+        return (jint)Result::NOT_INITIALIZED;
     }
     Result result = dvrClient->flush();
-    return (jint) result;
+    return (jint)result;
 }
 
 static jint android_media_tv_Tuner_close_dvr(JNIEnv* env, jobject dvr) {
     sp<DvrClient> dvrClient = getDvrClient(env, dvr);
-    if (dvrClient == NULL) {
+    if (dvrClient == nullptr) {
         ALOGD("Failed to close dvr: dvr client not found");
-        return (jint) Result::NOT_INITIALIZED;
+        return (jint)Result::NOT_INITIALIZED;
     }
-    return (jint) dvrClient->close();
+    return (jint)dvrClient->close();
 }
 
 static jint android_media_tv_Tuner_lnb_set_voltage(JNIEnv* env, jobject lnb, jint voltage) {
     sp<LnbClient> lnbClient = getLnbClient(env, lnb);
-    Result r = lnbClient->setVoltage(static_cast<LnbVoltage>(voltage));
-    return (jint) r;
+    return (jint)lnbClient->setVoltage(static_cast<LnbVoltage>(voltage));
 }
 
 static int android_media_tv_Tuner_lnb_set_tone(JNIEnv* env, jobject lnb, jint tone) {
     sp<LnbClient> lnbClient = getLnbClient(env, lnb);
-    Result r = lnbClient->setTone(static_cast<LnbTone>(tone));
-    return (jint) r;
+    return (jint)lnbClient->setTone(static_cast<LnbTone>(tone));
 }
 
 static int android_media_tv_Tuner_lnb_set_position(JNIEnv* env, jobject lnb, jint position) {
     sp<LnbClient> lnbClient = getLnbClient(env, lnb);
-    Result r = lnbClient->setSatellitePosition(static_cast<LnbPosition>(position));
-    return (jint) r;
+    return (jint)lnbClient->setSatellitePosition(static_cast<LnbPosition>(position));
 }
 
 static int android_media_tv_Tuner_lnb_send_diseqc_msg(JNIEnv* env, jobject lnb, jbyteArray msg) {
@@ -4189,8 +4137,7 @@
     int size = env->GetArrayLength(msg);
     std::vector<uint8_t> v(size);
     env->GetByteArrayRegion(msg, 0, size, reinterpret_cast<jbyte*>(&v[0]));
-    Result r = lnbClient->sendDiseqcMessage(v);
-    return (jint) r;
+    return (jint)lnbClient->sendDiseqcMessage(v);
 }
 
 static int android_media_tv_Tuner_close_lnb(JNIEnv* env, jobject lnb) {
@@ -4200,34 +4147,34 @@
         lnbClient->decStrong(lnb);
         env->SetLongField(lnb, gFields.lnbContext, 0);
     }
-    return (jint) r;
+    return (jint)r;
 }
 
 static void android_media_tv_Tuner_dvr_set_fd(JNIEnv *env, jobject dvr, jint fd) {
     sp<DvrClient> dvrClient = getDvrClient(env, dvr);
-    if (dvrClient == NULL) {
+    if (dvrClient == nullptr) {
         ALOGD("Failed to set FD for dvr: dvr client not found");
         return;
     }
     dvrClient->setFd((int)fd);
-    ALOGD("set fd = %d", fd);
+    ALOGV("set fd = %d", fd);
 }
 
 static jlong android_media_tv_Tuner_read_dvr(JNIEnv *env, jobject dvr, jlong size) {
     sp<DvrClient> dvrClient = getDvrClient(env, dvr);
-    if (dvrClient == NULL) {
+    if (dvrClient == nullptr) {
         jniThrowException(env, "java/lang/IllegalStateException",
                 "Failed to read dvr: dvr client not found");
         return -1;
     }
 
-    return (jlong) dvrClient->readFromFile(size);
+    return (jlong)dvrClient->readFromFile(size);
 }
 
 static jlong android_media_tv_Tuner_read_dvr_from_array(
         JNIEnv* env, jobject dvr, jbyteArray buffer, jlong offset, jlong size) {
     sp<DvrClient> dvrClient = getDvrClient(env, dvr);
-    if (dvrClient == NULL) {
+    if (dvrClient == nullptr) {
         ALOGW("Failed to read dvr: dvr client not found");
         return -1;
     }
@@ -4240,32 +4187,31 @@
     }
     long realSize = dvrClient->readFromBuffer(reinterpret_cast<signed char*>(src) + offset, size);
     env->ReleaseByteArrayElements(buffer, src, 0);
-    return (jlong) realSize;
-
+    return (jlong)realSize;
 }
 
 static jlong android_media_tv_Tuner_write_dvr(JNIEnv *env, jobject dvr, jlong size) {
     sp<DvrClient> dvrClient = getDvrClient(env, dvr);
-    if (dvrClient == NULL) {
+    if (dvrClient == nullptr) {
         jniThrowException(env, "java/lang/IllegalStateException",
                 "Failed to write dvr: dvr client not found");
         return -1;
     }
 
-    return (jlong) dvrClient->writeToFile(size);
+    return (jlong)dvrClient->writeToFile(size);
 }
 
 static jlong android_media_tv_Tuner_write_dvr_to_array(
         JNIEnv *env, jobject dvr, jbyteArray buffer, jlong offset, jlong size) {
     sp<DvrClient> dvrClient = getDvrClient(env, dvr);
-    if (dvrClient == NULL) {
+    if (dvrClient == nullptr) {
         ALOGW("Failed to read dvr: dvr client not found");
         return -1;
     }
 
     jboolean isCopy;
     jbyte *dst = env->GetByteArrayElements(buffer, &isCopy);
-    ALOGD("copyData, isCopy=%d", isCopy);
+    ALOGV("copyData, isCopy=%d", isCopy);
     if (dst == nullptr) {
         jniThrowRuntimeException(env, "Failed to GetByteArrayElements");
         return -1;
@@ -4273,7 +4219,7 @@
 
     long realSize = dvrClient->writeToBuffer(reinterpret_cast<signed char*>(dst) + offset, size);
     env->ReleaseByteArrayElements(buffer, dst, 0);
-    return (jlong) realSize;
+    return (jlong)realSize;
 }
 
 static sp<MediaEvent> getMediaEventSp(JNIEnv *env, jobject mediaEventObj) {
@@ -4283,9 +4229,9 @@
 static jobject android_media_tv_Tuner_media_event_get_linear_block(
         JNIEnv* env, jobject mediaEventObj) {
     sp<MediaEvent> mediaEventSp = getMediaEventSp(env, mediaEventObj);
-    if (mediaEventSp == NULL) {
+    if (mediaEventSp == nullptr) {
         ALOGD("Failed get MediaEvent");
-        return NULL;
+        return nullptr;
     }
     android::Mutex::Autolock autoLock(mediaEventSp->mLock);
 
@@ -4295,9 +4241,9 @@
 static jobject android_media_tv_Tuner_media_event_get_audio_handle(
         JNIEnv* env, jobject mediaEventObj) {
     sp<MediaEvent> mediaEventSp = getMediaEventSp(env, mediaEventObj);
-    if (mediaEventSp == NULL) {
+    if (mediaEventSp == nullptr) {
         ALOGD("Failed get MediaEvent");
-        return NULL;
+        return nullptr;
     }
 
     android::Mutex::Autolock autoLock(mediaEventSp->mLock);
@@ -4311,7 +4257,7 @@
 
 static void android_media_tv_Tuner_media_event_finalize(JNIEnv* env, jobject mediaEventObj) {
     sp<MediaEvent> mediaEventSp = getMediaEventSp(env, mediaEventObj);
-    if (mediaEventSp == NULL) {
+    if (mediaEventSp == nullptr) {
         ALOGD("Failed get MediaEvent");
         return;
     }
@@ -4520,19 +4466,18 @@
     return true;
 }
 
-jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
-{
-    JNIEnv* env = NULL;
+jint JNI_OnLoad(JavaVM *vm, void * /* reserved */) {
+    JNIEnv *env = nullptr;
     jint result = -1;
 
     if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
-        ALOGE("ERROR: GetEnv failed\n");
+        ALOGE("ERROR: GetEnv failed");
         return result;
     }
-    assert(env != NULL);
+    assert(env != nullptr);
 
     if (!register_android_media_tv_Tuner(env)) {
-        ALOGE("ERROR: Tuner native registration failed\n");
+        ALOGE("ERROR: Tuner native registration failed");
         return result;
     }
     return JNI_VERSION_1_4;
diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h
index 5d3b0a3..02c347f 100644
--- a/media/jni/android_media_tv_Tuner.h
+++ b/media/jni/android_media_tv_Tuner.h
@@ -17,18 +17,35 @@
 #ifndef _ANDROID_MEDIA_TV_TUNER_H_
 #define _ANDROID_MEDIA_TV_TUNER_H_
 
-#include <android/hardware/tv/tuner/1.1/types.h>
-
 #include <C2BlockInternal.h>
 #include <C2HandleIonInternal.h>
 #include <C2ParamDef.h>
-#include <fmq/MessageQueue.h>
-#include <fstream>
-#include <string>
-#include <unordered_map>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterEvent.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterMonitorEvent.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterStatus.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterType.h>
+#include <aidl/android/hardware/tv/tuner/DemuxPid.h>
+#include <aidl/android/hardware/tv/tuner/DvrType.h>
+#include <aidl/android/hardware/tv/tuner/FrontendCapabilities.h>
+#include <aidl/android/hardware/tv/tuner/FrontendEventType.h>
+#include <aidl/android/hardware/tv/tuner/FrontendInfo.h>
+#include <aidl/android/hardware/tv/tuner/FrontendScanMessage.h>
+#include <aidl/android/hardware/tv/tuner/FrontendScanMessageType.h>
+#include <aidl/android/hardware/tv/tuner/FrontendScanType.h>
+#include <aidl/android/hardware/tv/tuner/FrontendSettings.h>
+#include <aidl/android/hardware/tv/tuner/LnbEventType.h>
+#include <aidl/android/hardware/tv/tuner/PlaybackStatus.h>
+#include <aidl/android/hardware/tv/tuner/RecordStatus.h>
+#include <aidl/android/hardware/tv/tuner/Result.h>
+#include <fmq/AidlMessageQueue.h>
 #include <utils/Mutex.h>
 #include <utils/RefBase.h>
 
+#include <fstream>
+#include <string>
+#include <unordered_map>
+
+#include "jni.h"
 #include "tuner/DemuxClient.h"
 #include "tuner/DescramblerClient.h"
 #include "tuner/FilterClient.h"
@@ -39,48 +56,36 @@
 #include "tuner/LnbClientCallback.h"
 #include "tuner/TimeFilterClient.h"
 #include "tuner/TunerClient.h"
-#include "jni.h"
 
+using ::aidl::android::hardware::common::fmq::MQDescriptor;
+using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterEvent;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterMonitorEvent;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterStatus;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterType;
+using ::aidl::android::hardware::tv::tuner::DemuxPid;
+using ::aidl::android::hardware::tv::tuner::DvrType;
+using ::aidl::android::hardware::tv::tuner::FrontendCapabilities;
+using ::aidl::android::hardware::tv::tuner::FrontendEventType;
+using ::aidl::android::hardware::tv::tuner::FrontendInfo;
+using ::aidl::android::hardware::tv::tuner::FrontendScanMessage;
+using ::aidl::android::hardware::tv::tuner::FrontendScanMessageType;
+using ::aidl::android::hardware::tv::tuner::FrontendScanType;
+using ::aidl::android::hardware::tv::tuner::FrontendSettings;
+using ::aidl::android::hardware::tv::tuner::LnbEventType;
+using ::aidl::android::hardware::tv::tuner::PlaybackStatus;
+using ::aidl::android::hardware::tv::tuner::RecordStatus;
+using ::aidl::android::hardware::tv::tuner::Result;
 using ::android::hardware::EventFlag;
-using ::android::hardware::MQDescriptorSync;
-using ::android::hardware::MessageQueue;
-using ::android::hardware::Return;
-using ::android::hardware::hidl_handle;
-using ::android::hardware::hidl_vec;
-using ::android::hardware::kSynchronizedReadWrite;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterStatus;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterType;
-using ::android::hardware::tv::tuner::V1_0::DemuxPid;
-using ::android::hardware::tv::tuner::V1_0::DvrType;
-using ::android::hardware::tv::tuner::V1_0::FrontendEventType;
-using ::android::hardware::tv::tuner::V1_0::FrontendId;
-using ::android::hardware::tv::tuner::V1_0::FrontendInfo;
-using ::android::hardware::tv::tuner::V1_0::FrontendScanMessage;
-using ::android::hardware::tv::tuner::V1_0::FrontendScanMessageType;
-using ::android::hardware::tv::tuner::V1_0::FrontendScanType;
-using ::android::hardware::tv::tuner::V1_0::FrontendSettings;
-using ::android::hardware::tv::tuner::V1_1::FrontendSettingsExt1_1;
-using ::android::hardware::tv::tuner::V1_0::LnbEventType;
-using ::android::hardware::tv::tuner::V1_0::LnbId;
-using ::android::hardware::tv::tuner::V1_0::PlaybackStatus;
-using ::android::hardware::tv::tuner::V1_0::RecordStatus;
-using ::android::hardware::tv::tuner::V1_0::Result;
-using ::android::hardware::tv::tuner::V1_1::DemuxFilterEventExt;
-using ::android::hardware::tv::tuner::V1_1::DemuxFilterMonitorEvent;
-using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageExt1_1;
-using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageTypeExt1_1;
 
-using MQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
-
-const static int TUNER_VERSION_1_1 = ((1 << 16) | 1);
+using MQ = MQDescriptor<int8_t, SynchronizedReadWrite>;
 
 namespace android {
 
 struct LnbClientCallbackImpl : public LnbClientCallback {
     ~LnbClientCallbackImpl();
     virtual void onEvent(LnbEventType lnbEventType);
-    virtual void onDiseqcMessage(const hidl_vec<uint8_t>& diseqcMessage);
+    virtual void onDiseqcMessage(const vector<uint8_t>& diseqcMessage);
 
     void setLnb(jweak lnbObj);
 private:
@@ -98,8 +103,8 @@
 };
 
 struct MediaEvent : public RefBase {
-    MediaEvent(sp<FilterClient> filterClient, hidl_handle avHandle, uint64_t dataId,
-        uint64_t dataSize, jobject obj);
+    MediaEvent(sp<FilterClient> filterClient, native_handle_t* avHandle, uint64_t dataId,
+               uint64_t dataSize, jobject obj);
     ~MediaEvent();
     jobject getLinearBlock();
     uint64_t getAudioHandle();
@@ -121,39 +126,24 @@
 
 struct FilterClientCallbackImpl : public FilterClientCallback {
     ~FilterClientCallbackImpl();
-    virtual void onFilterEvent_1_1(const DemuxFilterEvent& filterEvent,
-            const DemuxFilterEventExt& filterEventExt);
-    virtual void onFilterEvent(const DemuxFilterEvent& filterEvent);
+    virtual void onFilterEvent(const vector<DemuxFilterEvent>& events);
     virtual void onFilterStatus(const DemuxFilterStatus status);
 
     void setFilter(jweak filterObj, sp<FilterClient> filterClient);
 private:
     jweak mFilterObj;
     sp<FilterClient> mFilterClient;
-    jobjectArray getSectionEvent(
-            jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
-    jobjectArray getMediaEvent(
-            jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
-    jobjectArray getPesEvent(
-            jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
-    jobjectArray getTsRecordEvent(
-            jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>&events,
-                    const std::vector<DemuxFilterEventExt::Event>& eventsExt);
-    jobjectArray getMmtpRecordEvent(
-            jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>&events,
-                    const std::vector<DemuxFilterEventExt::Event>& eventsExt);
-    jobjectArray getDownloadEvent(
-            jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
-    jobjectArray getIpPayloadEvent(
-            jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
-    jobjectArray getTemiEvent(
-            jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
-    jobjectArray getScramblingStatusEvent(
-            jobjectArray& arr, const std::vector<DemuxFilterEventExt::Event>& eventsExt);
-    jobjectArray getIpCidChangeEvent(
-            jobjectArray& arr, const std::vector<DemuxFilterEventExt::Event>& eventsExt);
-    jobjectArray getRestartEvent(
-            jobjectArray& arr, const std::vector<DemuxFilterEventExt::Event>& eventsExt);
+    void getSectionEvent(jobjectArray& arr, const int size, const DemuxFilterEvent& event);
+    void getMediaEvent(jobjectArray& arr, const int size, const DemuxFilterEvent& event);
+    void getPesEvent(jobjectArray& arr, const int size, const DemuxFilterEvent& event);
+    void getTsRecordEvent(jobjectArray& arr, const int size, const DemuxFilterEvent& event);
+    void getMmtpRecordEvent(jobjectArray& arr, const int size, const DemuxFilterEvent& event);
+    void getDownloadEvent(jobjectArray& arr, const int size, const DemuxFilterEvent& event);
+    void getIpPayloadEvent(jobjectArray& arr, const int size, const DemuxFilterEvent& event);
+    void getTemiEvent(jobjectArray& arr, const int size, const DemuxFilterEvent& event);
+    void getScramblingStatusEvent(jobjectArray& arr, const int size, const DemuxFilterEvent& event);
+    void getIpCidChangeEvent(jobjectArray& arr, const int size, const DemuxFilterEvent& event);
+    void getRestartEvent(jobjectArray& arr, const int size, const DemuxFilterEvent& event);
 };
 
 struct FrontendClientCallbackImpl : public FrontendClientCallback {
@@ -162,8 +152,6 @@
     virtual void onEvent(FrontendEventType frontendEventType);
     virtual void onScanMessage(
             FrontendScanMessageType type, const FrontendScanMessage& message);
-    virtual void onScanMessageExt1_1(
-            FrontendScanMessageTypeExt1_1 type, const FrontendScanMessageExt1_1& messageExt);
 
     jweak mObject;
 };
@@ -182,10 +170,9 @@
     int shareFrontend(int feId);
     jint closeFrontendById(int id);
     jobject getFrontendInfo(int id);
-    int tune(const FrontendSettings& settings, const FrontendSettingsExt1_1& settingsExt1_1);
+    int tune(const FrontendSettings& settings);
     int stopTune();
-    int scan(const FrontendSettings& settings, FrontendScanType scanType,
-            const FrontendSettingsExt1_1& settingsExt1_1);
+    int scan(const FrontendSettings& settings, FrontendScanType scanType);
     int stopScan();
     int setLnb(sp<LnbClient> lnbClient);
     int setLna(bool enable);
@@ -214,18 +201,16 @@
     int mSharedFeId;
     sp<LnbClient> mLnbClient;
     sp<DemuxClient> mDemuxClient;
-    static jobject getAnalogFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
-    static jobject getAtsc3FrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
-    static jobject getAtscFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
-    static jobject getDvbcFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
-    static jobject getDvbsFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
-    static jobject getDvbtFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
-    static jobject getIsdbs3FrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
-    static jobject getIsdbsFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
-    static jobject getIsdbtFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
-    static jobject getDtmbFrontendCaps(JNIEnv *env, int id);
-
-    bool isV1_1ExtendedStatusType(jint type);
+    static jobject getAnalogFrontendCaps(JNIEnv* env, FrontendCapabilities& caps);
+    static jobject getAtsc3FrontendCaps(JNIEnv* env, FrontendCapabilities& caps);
+    static jobject getAtscFrontendCaps(JNIEnv* env, FrontendCapabilities& caps);
+    static jobject getDvbcFrontendCaps(JNIEnv* env, FrontendCapabilities& caps);
+    static jobject getDvbsFrontendCaps(JNIEnv* env, FrontendCapabilities& caps);
+    static jobject getDvbtFrontendCaps(JNIEnv* env, FrontendCapabilities& caps);
+    static jobject getIsdbs3FrontendCaps(JNIEnv* env, FrontendCapabilities& caps);
+    static jobject getIsdbsFrontendCaps(JNIEnv* env, FrontendCapabilities& caps);
+    static jobject getIsdbtFrontendCaps(JNIEnv* env, FrontendCapabilities& caps);
+    static jobject getDtmbFrontendCaps(JNIEnv* env, FrontendCapabilities& caps);
 };
 
 class C2DataIdInfo : public C2Param {
diff --git a/media/jni/tuner/ClientHelper.h b/media/jni/tuner/ClientHelper.h
index 508dccf..d7a847a 100644
--- a/media/jni/tuner/ClientHelper.h
+++ b/media/jni/tuner/ClientHelper.h
@@ -17,22 +17,18 @@
 #ifndef _ANDROID_MEDIA_TV_CLIENT_HELPER_H_
 #define _ANDROID_MEDIA_TV_CLIENT_HELPER_H_
 
+#include <aidl/android/hardware/tv/tuner/Result.h>
 #include <android/binder_parcel_utils.h>
-#include <android/hardware/tv/tuner/1.1/types.h>
 #include <utils/Log.h>
 
+using ::aidl::android::hardware::tv::tuner::Result;
 using Status = ::ndk::ScopedAStatus;
 
-using ::android::hardware::tv::tuner::V1_0::Result;
-
-using namespace std;
-
 namespace android {
 
-struct ClientHelper {
-
+class ClientHelper {
 public:
-	static Result getServiceSpecificErrorCode(Status& s) {
+    static Result getServiceSpecificErrorCode(Status& s) {
         if (s.getExceptionCode() == EX_SERVICE_SPECIFIC) {
             return static_cast<Result>(s.getServiceSpecificError());
         } else if (s.isOk()) {
@@ -42,6 +38,7 @@
         return Result::UNKNOWN_ERROR;
     }
 };
+
 }  // namespace android
 
-#endif  // _ANDROID_MEDIA_TV_CLIENT_HELPER_H_
\ No newline at end of file
+#endif // _ANDROID_MEDIA_TV_CLIENT_HELPER_H_
diff --git a/media/jni/tuner/DemuxClient.cpp b/media/jni/tuner/DemuxClient.cpp
index 6c4295b..4ee3f48 100644
--- a/media/jni/tuner/DemuxClient.cpp
+++ b/media/jni/tuner/DemuxClient.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,52 +16,41 @@
 
 #define LOG_TAG "DemuxClient"
 
+#include "DemuxClient.h"
+
+#include <aidl/android/hardware/tv/tuner/Constant.h>
+#include <aidl/android/hardware/tv/tuner/Constant64Bit.h>
 #include <android-base/logging.h>
 #include <utils/Log.h>
 
-#include "DemuxClient.h"
-
-using ::aidl::android::media::tv::tuner::TunerFrontendSettings;
-
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
-using ::android::hardware::tv::tuner::V1_0::Result;
+using ::aidl::android::hardware::tv::tuner::Constant;
+using ::aidl::android::hardware::tv::tuner::Constant64Bit;
 
 namespace android {
-
 /////////////// DemuxClient ///////////////////////
-
 DemuxClient::DemuxClient(shared_ptr<ITunerDemux> tunerDemux) {
     mTunerDemux = tunerDemux;
-    mId = -1;
 }
 
 DemuxClient::~DemuxClient() {
-    mTunerDemux = NULL;
-    mDemux = NULL;
-    mId = -1;
-}
-
-// TODO: remove after migration to Tuner Service is done.
-void DemuxClient::setHidlDemux(sp<IDemux> demux) {
-    mDemux = demux;
+    mTunerDemux = nullptr;
 }
 
 Result DemuxClient::setFrontendDataSource(sp<FrontendClient> frontendClient) {
-    if (mTunerDemux != NULL) {
-        Status s = mTunerDemux->setFrontendDataSource(frontendClient->getAidlFrontend());
-        return ClientHelper::getServiceSpecificErrorCode(s);
+    if (frontendClient == nullptr) {
+        return Result::INVALID_ARGUMENT;
     }
 
-    if (mDemux != NULL) {
-        Result res = mDemux->setFrontendDataSource(frontendClient->getId());
-        return res;
+    if (mTunerDemux != nullptr) {
+        Status s = mTunerDemux->setFrontendDataSource(frontendClient->getAidlFrontend());
+        return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
     return Result::INVALID_STATE;
 }
 
 Result DemuxClient::setFrontendDataSourceById(int frontendId) {
-    if (mTunerDemux != NULL) {
+    if (mTunerDemux != nullptr) {
         Status s = mTunerDemux->setFrontendDataSourceById(frontendId);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
@@ -69,251 +58,114 @@
     return Result::INVALID_STATE;
 }
 
-sp<FilterClient> DemuxClient::openFilter(DemuxFilterType type, int bufferSize,
-        sp<FilterClientCallback> cb) {
-    if (mTunerDemux != NULL) {
+sp<FilterClient> DemuxClient::openFilter(const DemuxFilterType& type, int32_t bufferSize,
+                                         sp<FilterClientCallback> cb) {
+    if (cb == nullptr) {
+        return nullptr;
+    }
+
+    if (mTunerDemux != nullptr) {
         shared_ptr<ITunerFilter> tunerFilter;
         shared_ptr<TunerFilterCallback> callback =
                 ::ndk::SharedRefBase::make<TunerFilterCallback>(cb);
-        Status s = mTunerDemux->openFilter((int)type.mainType, getSubType(type),
-                    bufferSize, callback, &tunerFilter);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return NULL;
+        Status s = mTunerDemux->openFilter(type, bufferSize, callback, &tunerFilter);
+        if (!s.isOk()) {
+            return nullptr;
         }
         return new FilterClient(type, tunerFilter);
     }
 
-    if (mDemux != NULL) {
-        sp<HidlFilterCallback> callback = new HidlFilterCallback(cb);
-        sp<IFilter> hidlFilter = openHidlFilter(type, bufferSize, callback);
-        if (hidlFilter != NULL) {
-            sp<FilterClient> filterClient = new FilterClient(type, NULL);
-            filterClient->setHidlFilter(hidlFilter);
-            return filterClient;
-        }
-    }
-
-    return NULL;
+    return nullptr;
 }
 
 sp<TimeFilterClient> DemuxClient::openTimeFilter() {
-    if (mTunerDemux != NULL) {
+    if (mTunerDemux != nullptr) {
         shared_ptr<ITunerTimeFilter> tunerTimeFilter;
         Status s = mTunerDemux->openTimeFilter(&tunerTimeFilter);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return NULL;
+        if (!s.isOk()) {
+            return nullptr;
         }
         return new TimeFilterClient(tunerTimeFilter);
     }
 
-    if (mDemux != NULL) {
-        sp<ITimeFilter> hidlTimeFilter = openHidlTimeFilter();
-        if (hidlTimeFilter != NULL) {
-            sp<TimeFilterClient> timeFilterClient = new TimeFilterClient(NULL);
-            timeFilterClient->setHidlTimeFilter(hidlTimeFilter);
-            return timeFilterClient;
-        }
-    }
-
-    return NULL;
+    return nullptr;
 }
 
-int DemuxClient::getAvSyncHwId(sp<FilterClient> filterClient) {
-    if (mTunerDemux != NULL) {
-        int hwId;
+int32_t DemuxClient::getAvSyncHwId(sp<FilterClient> filterClient) {
+    if (filterClient == nullptr) {
+        return static_cast<int32_t>(Constant::INVALID_AV_SYNC_ID);
+    }
+
+    if (mTunerDemux != nullptr) {
+        int32_t hwId;
         Status s = mTunerDemux->getAvSyncHwId(filterClient->getAidlFilter(), &hwId);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return INVALID_AV_SYNC_HW_ID;
+        if (!s.isOk()) {
+            return static_cast<int32_t>(Constant::INVALID_AV_SYNC_ID);
         }
         return hwId;
     }
 
-    if (mDemux != NULL) {
-        uint32_t avSyncHwId;
-        Result res;
-        sp<IFilter> halFilter = filterClient->getHalFilter();
-        mDemux->getAvSyncHwId(halFilter,
-                [&](Result r, uint32_t id) {
-                    res = r;
-                    avSyncHwId = id;
-                });
-        if (res == Result::SUCCESS) {
-            return (int) avSyncHwId;
-        }
-    }
-
-    return INVALID_AV_SYNC_HW_ID;
+    return static_cast<int32_t>(Constant::INVALID_AV_SYNC_ID);
 }
 
-long DemuxClient::getAvSyncTime(int avSyncHwId) {
-    if (mTunerDemux != NULL) {
+int64_t DemuxClient::getAvSyncTime(int32_t avSyncHwId) {
+    if (mTunerDemux != nullptr) {
         int64_t time;
         Status s = mTunerDemux->getAvSyncTime(avSyncHwId, &time);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return INVALID_AV_SYNC_TIME;
+        if (!s.isOk()) {
+            return static_cast<int64_t>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
         }
         return time;
     }
 
-    if (mDemux != NULL) {
-        uint64_t time;
-        Result res;
-        mDemux->getAvSyncTime(static_cast<uint32_t>(avSyncHwId),
-                [&](Result r, uint64_t ts) {
-                    res = r;
-                    time = ts;
-                });
-        if (res == Result::SUCCESS) {
-            return (long) time;
-        }
-    }
-
-    return INVALID_AV_SYNC_TIME;
+    return static_cast<int64_t>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
 }
 
-sp<DvrClient> DemuxClient::openDvr(DvrType dvbType, int bufferSize, sp<DvrClientCallback> cb) {
-    if (mTunerDemux != NULL) {
+sp<DvrClient> DemuxClient::openDvr(DvrType dvbType, int32_t bufferSize, sp<DvrClientCallback> cb) {
+    if (cb == nullptr) {
+        return nullptr;
+    }
+
+    if (mTunerDemux != nullptr) {
         shared_ptr<ITunerDvr> tunerDvr;
         shared_ptr<TunerDvrCallback> callback =
                 ::ndk::SharedRefBase::make<TunerDvrCallback>(cb);
-        Status s = mTunerDemux->openDvr((int)dvbType, bufferSize, callback, &tunerDvr);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return NULL;
+        Status s = mTunerDemux->openDvr(dvbType, bufferSize, callback, &tunerDvr);
+        if (!s.isOk()) {
+            return nullptr;
         }
         return new DvrClient(tunerDvr);
     }
 
-    if (mDemux != NULL) {
-        sp<HidlDvrCallback> callback = new HidlDvrCallback(cb);
-        sp<IDvr> hidlDvr = openHidlDvr(dvbType, bufferSize, callback);
-        if (hidlDvr != NULL) {
-            sp<DvrClient> dvrClient = new DvrClient(NULL);
-            dvrClient->setHidlDvr(hidlDvr);
-            return dvrClient;
-        }
-    }
-
-    return NULL;
+    return nullptr;
 }
 
-Result DemuxClient::connectCiCam(int ciCamId) {
-    if (mTunerDemux != NULL) {
+Result DemuxClient::connectCiCam(int32_t ciCamId) {
+    if (mTunerDemux != nullptr) {
         Status s = mTunerDemux->connectCiCam(ciCamId);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mDemux != NULL) {
-        return mDemux->connectCiCam(static_cast<uint32_t>(ciCamId));
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result DemuxClient::disconnectCiCam() {
-    if (mTunerDemux != NULL) {
+    if (mTunerDemux != nullptr) {
         Status s = mTunerDemux->disconnectCiCam();
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mDemux != NULL) {
-        return mDemux->disconnectCiCam();
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result DemuxClient::close() {
-    if (mTunerDemux != NULL) {
+    if (mTunerDemux != nullptr) {
         Status s = mTunerDemux->close();
-        mTunerDemux = NULL;
+        mTunerDemux = nullptr;
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mDemux != NULL) {
-        Result res = mDemux->close();
-        mDemux = NULL;
-        return res;
-    }
-
     return Result::INVALID_STATE;
 }
 
-/////////////// DemuxClient Helper Methods ///////////////////////
-
-sp<IFilter> DemuxClient::openHidlFilter(DemuxFilterType type, int bufferSize,
-        sp<HidlFilterCallback> callback) {
-    if (mDemux == NULL) {
-        return NULL;
-    }
-
-    sp<IFilter> hidlFilter;
-    Result res;
-    mDemux->openFilter(type, bufferSize, callback,
-            [&](Result r, const sp<IFilter>& filter) {
-                hidlFilter = filter;
-                res = r;
-            });
-    if (res != Result::SUCCESS || hidlFilter == NULL) {
-        return NULL;
-    }
-
-    return hidlFilter;
-}
-
-sp<ITimeFilter> DemuxClient::openHidlTimeFilter() {
-    if (mDemux == NULL) {
-        return NULL;
-    }
-
-    sp<ITimeFilter> timeFilter;
-    Result res;
-    mDemux->openTimeFilter(
-            [&](Result r, const sp<ITimeFilter>& timeFilterSp) {
-                timeFilter = timeFilterSp;
-                res = r;
-            });
-
-    if (res != Result::SUCCESS || timeFilter == NULL) {
-        return NULL;
-    }
-
-    return timeFilter;
-}
-
-sp<IDvr> DemuxClient::openHidlDvr(DvrType dvrType, int bufferSize,
-        sp<HidlDvrCallback> callback) {
-    if (mDemux == NULL) {
-        return NULL;
-    }
-
-    sp<IDvr> hidlDvr;
-    Result res;
-    mDemux->openDvr(dvrType, bufferSize, callback,
-            [&](Result r, const sp<IDvr>& dvr) {
-                hidlDvr = dvr;
-                res = r;
-            });
-    if (res != Result::SUCCESS || hidlDvr == NULL) {
-        return NULL;
-    }
-
-    return hidlDvr;
-}
-
-int DemuxClient::getSubType(DemuxFilterType filterType) {
-    switch (filterType.mainType) {
-        case DemuxFilterMainType::TS:
-            return (int)filterType.subType.tsFilterType();
-        case DemuxFilterMainType::MMTP:
-            return (int)filterType.subType.mmtpFilterType();
-        case DemuxFilterMainType::IP:
-            return (int)filterType.subType.ipFilterType();
-        case DemuxFilterMainType::TLV:
-            return (int)filterType.subType.tlvFilterType();
-        case DemuxFilterMainType::ALP:
-            return (int)filterType.subType.alpFilterType();
-        default:
-            return -1;
-    }
-}
 }  // namespace android
diff --git a/media/jni/tuner/DemuxClient.h b/media/jni/tuner/DemuxClient.h
index 46b0a3d..d5f5f2f 100644
--- a/media/jni/tuner/DemuxClient.h
+++ b/media/jni/tuner/DemuxClient.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,12 +17,11 @@
 #ifndef _ANDROID_MEDIA_TV_DEMUX_CLIENT_H_
 #define _ANDROID_MEDIA_TV_DEMUX_CLIENT_H_
 
+#include <aidl/android/hardware/tv/tuner/Result.h>
 #include <aidl/android/media/tv/tuner/ITunerDemux.h>
-#include <android/hardware/tv/tuner/1.0/IDemux.h>
-#include <android/hardware/tv/tuner/1.1/types.h>
 
-#include "DvrClient.h"
 #include "ClientHelper.h"
+#include "DvrClient.h"
 #include "DvrClientCallback.h"
 #include "FilterClient.h"
 #include "FilterClientCallback.h"
@@ -30,20 +29,14 @@
 #include "TimeFilterClient.h"
 
 using Status = ::ndk::ScopedAStatus;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterType;
+using ::aidl::android::hardware::tv::tuner::DvrType;
+using ::aidl::android::hardware::tv::tuner::Result;
 using ::aidl::android::media::tv::tuner::ITunerDemux;
 using ::aidl::android::media::tv::tuner::ITunerTimeFilter;
 
-using ::android::hardware::tv::tuner::V1_0::IDemux;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterType;
-using ::android::hardware::tv::tuner::V1_0::DvrType;
-using ::android::hardware::tv::tuner::V1_0::IDemux;
-using ::android::hardware::tv::tuner::V1_0::ITimeFilter;
-
 using namespace std;
 
-const int64_t INVALID_AV_SYNC_TIME = -1;
-const int INVALID_AV_SYNC_HW_ID = -1;
-
 namespace android {
 
 struct DemuxClient : public RefBase {
@@ -52,9 +45,6 @@
     DemuxClient(shared_ptr<ITunerDemux> tunerDemux);
     ~DemuxClient();
 
-    // TODO: remove after migration to Tuner Service is done.
-    void setHidlDemux(sp<IDemux> demux);
-
     /**
      * Set a frontend resource as data input of the demux.
      */
@@ -68,7 +58,8 @@
     /**
      * Open a new filter client.
      */
-    sp<FilterClient> openFilter(DemuxFilterType type, int bufferSize, sp<FilterClientCallback> cb);
+    sp<FilterClient> openFilter(const DemuxFilterType& type, int32_t bufferSize,
+                                sp<FilterClientCallback> cb);
 
     /**
      * Open time filter of the demux.
@@ -78,22 +69,22 @@
     /**
      * Get hardware sync ID for audio and video.
      */
-    int getAvSyncHwId(sp<FilterClient> filterClient);
+    int32_t getAvSyncHwId(sp<FilterClient> filterClient);
 
     /**
      * Get current time stamp to use for A/V sync.
      */
-    long getAvSyncTime(int avSyncHwId);
+    int64_t getAvSyncTime(int32_t avSyncHwId);
 
     /**
      * Open a DVR (Digital Video Record) client.
      */
-    sp<DvrClient> openDvr(DvrType dvbType, int bufferSize, sp<DvrClientCallback> cb);
+    sp<DvrClient> openDvr(DvrType dvbType, int32_t bufferSize, sp<DvrClientCallback> cb);
 
     /**
      * Connect Conditional Access Modules (CAM) through Common Interface (CI).
      */
-    Result connectCiCam(int ciCamId);
+    Result connectCiCam(int32_t ciCamId);
 
     /**
      * Disconnect Conditional Access Modules (CAM).
@@ -110,29 +101,12 @@
      */
     shared_ptr<ITunerDemux> getAidlDemux() { return mTunerDemux; }
 
-    void setId(int id) { mId = id; }
-    int getId() { return mId; }
-
 private:
-    sp<IFilter> openHidlFilter(DemuxFilterType type, int bufferSize, sp<HidlFilterCallback> cb);
-    sp<ITimeFilter> openHidlTimeFilter();
-    sp<IDvr> openHidlDvr(DvrType type, int bufferSize, sp<HidlDvrCallback> cb);
-    int getSubType(DemuxFilterType filterType);
-
     /**
      * An AIDL Tuner Demux Singleton assigned at the first time the Tuner Client
      * opens a demux. Default null when demux is not opened.
      */
     shared_ptr<ITunerDemux> mTunerDemux;
-
-    /**
-     * A Demux HAL interface that is ready before migrating to the TunerDemux.
-     * This is a temprary interface before Tuner Framework migrates to use TunerService.
-     * Default null when the HAL service does not exist.
-     */
-    sp<IDemux> mDemux;
-
-    int mId;
 };
 }  // namespace android
 
diff --git a/media/jni/tuner/DescramblerClient.cpp b/media/jni/tuner/DescramblerClient.cpp
index 3e4ed82..052fa7a 100644
--- a/media/jni/tuner/DescramblerClient.cpp
+++ b/media/jni/tuner/DescramblerClient.cpp
@@ -21,118 +21,69 @@
 
 #include "DescramblerClient.h"
 
-using ::android::hardware::tv::tuner::V1_0::Result;
-
 namespace android {
 
 /////////////// DescramblerClient ///////////////////////
-
 DescramblerClient::DescramblerClient(shared_ptr<ITunerDescrambler> tunerDescrambler) {
     mTunerDescrambler = tunerDescrambler;
 }
 
 DescramblerClient::~DescramblerClient() {
-    mTunerDescrambler = NULL;
-    mDescrambler = NULL;
-}
-
-// TODO: remove after migration to Tuner Service is done.
-void DescramblerClient::setHidlDescrambler(sp<IDescrambler> descrambler) {
-    mDescrambler = descrambler;
+    mTunerDescrambler = nullptr;
 }
 
 Result DescramblerClient::setDemuxSource(sp<DemuxClient> demuxClient) {
-    if (demuxClient == NULL) {
+    if (demuxClient == nullptr) {
         return Result::INVALID_ARGUMENT;
     }
 
-    if (mTunerDescrambler != NULL) {
+    if (mTunerDescrambler != nullptr) {
         Status s = mTunerDescrambler->setDemuxSource(demuxClient->getAidlDemux());
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mDescrambler != NULL) {
-        return mDescrambler->setDemuxSource(demuxClient->getId());
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result DescramblerClient::setKeyToken(vector<uint8_t> keyToken) {
-    if (mTunerDescrambler != NULL) {
+    if (mTunerDescrambler != nullptr) {
         Status s = mTunerDescrambler->setKeyToken(keyToken);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mDescrambler != NULL) {
-        return mDescrambler->setKeyToken(keyToken);
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result DescramblerClient::addPid(DemuxPid pid, sp<FilterClient> optionalSourceFilter) {
-    if (mTunerDescrambler != NULL) {
-        shared_ptr<ITunerFilter> aidlFilter = (optionalSourceFilter == NULL)
-                ? NULL : optionalSourceFilter->getAidlFilter();
-        Status s = mTunerDescrambler->addPid(getAidlDemuxPid(pid), aidlFilter);
+    if (mTunerDescrambler != nullptr) {
+        shared_ptr<ITunerFilter> aidlFilter =
+                (optionalSourceFilter == nullptr) ? nullptr : optionalSourceFilter->getAidlFilter();
+        Status s = mTunerDescrambler->addPid(pid, aidlFilter);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mDescrambler != NULL) {
-        sp<IFilter> halFilter = (optionalSourceFilter == NULL)
-                ? NULL : optionalSourceFilter->getHalFilter();
-        return mDescrambler->addPid(pid, halFilter);
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result DescramblerClient::removePid(DemuxPid pid, sp<FilterClient> optionalSourceFilter) {
-    if (mTunerDescrambler != NULL) {
-        shared_ptr<ITunerFilter> aidlFilter = (optionalSourceFilter == NULL)
-                ? NULL : optionalSourceFilter->getAidlFilter();
-        Status s = mTunerDescrambler->removePid(getAidlDemuxPid(pid), aidlFilter);
+    if (mTunerDescrambler != nullptr) {
+        shared_ptr<ITunerFilter> aidlFilter =
+                (optionalSourceFilter == nullptr) ? nullptr : optionalSourceFilter->getAidlFilter();
+        Status s = mTunerDescrambler->removePid(pid, aidlFilter);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mDescrambler != NULL) {
-        sp<IFilter> halFilter = (optionalSourceFilter == NULL)
-                ? NULL : optionalSourceFilter->getHalFilter();
-        return mDescrambler->removePid(pid, halFilter);
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result DescramblerClient::close() {
-    if (mTunerDescrambler != NULL) {
+    if (mTunerDescrambler != nullptr) {
         Status s = mTunerDescrambler->close();
-        mTunerDescrambler = NULL;
+        mTunerDescrambler = nullptr;
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mDescrambler != NULL) {
-        Result res = mDescrambler->close();
-        mDescrambler = NULL;
-        return res;
-    }
-
     return Result::INVALID_STATE;
 }
 
-/////////////// DescramblerClient Helper Methods ///////////////////////
-
-TunerDemuxPid DescramblerClient::getAidlDemuxPid(DemuxPid& pid) {
-    TunerDemuxPid aidlPid;
-    switch (pid.getDiscriminator()) {
-        case DemuxPid::hidl_discriminator::tPid:
-            aidlPid.set<TunerDemuxPid::tPid>((int)pid.tPid());
-            break;
-        case DemuxPid::hidl_discriminator::mmtpPid:
-            aidlPid.set<TunerDemuxPid::mmtpPid>((int)pid.mmtpPid());
-            break;
-    }
-    return aidlPid;
-}
 }  // namespace android
diff --git a/media/jni/tuner/DescramblerClient.h b/media/jni/tuner/DescramblerClient.h
index a8fa1e2..c851e84 100644
--- a/media/jni/tuner/DescramblerClient.h
+++ b/media/jni/tuner/DescramblerClient.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,19 +17,15 @@
 #ifndef _ANDROID_MEDIA_TV_DESCRAMBLER_CLIENT_H_
 #define _ANDROID_MEDIA_TV_DESCRAMBLER_CLIENT_H_
 
+#include <aidl/android/hardware/tv/tuner/Result.h>
 #include <aidl/android/media/tv/tuner/ITunerDescrambler.h>
-#include <android/hardware/tv/tuner/1.0/IDescrambler.h>
-#include <android/hardware/tv/tuner/1.1/types.h>
 
 #include "DemuxClient.h"
 #include "FilterClient.h"
 
+using ::aidl::android::hardware::tv::tuner::DemuxPid;
+using ::aidl::android::hardware::tv::tuner::Result;
 using ::aidl::android::media::tv::tuner::ITunerDescrambler;
-using ::aidl::android::media::tv::tuner::TunerDemuxPid;
-
-using ::android::hardware::tv::tuner::V1_0::IDescrambler;
-using ::android::hardware::tv::tuner::V1_0::Result;
-using ::android::hardware::tv::tuner::V1_0::DemuxPid;
 
 using namespace std;
 
@@ -41,9 +37,6 @@
     DescramblerClient(shared_ptr<ITunerDescrambler> tunerDescrambler);
     ~DescramblerClient();
 
-    // TODO: remove after migration to Tuner Service is done.
-    void setHidlDescrambler(sp<IDescrambler> descrambler);
-
      /**
      * Set a demux as source of the descrambler.
      */
@@ -70,20 +63,11 @@
     Result close();
 
 private:
-    TunerDemuxPid getAidlDemuxPid(DemuxPid& pid);
-
     /**
      * An AIDL Tuner Descrambler Singleton assigned at the first time the Tuner Client
      * opens a descrambler. Default null when descrambler is not opened.
      */
     shared_ptr<ITunerDescrambler> mTunerDescrambler;
-
-    /**
-     * A Descrambler HAL interface that is ready before migrating to the TunerDescrambler.
-     * This is a temprary interface before Tuner Framework migrates to use TunerService.
-     * Default null when the HAL service does not exist.
-     */
-    sp<IDescrambler> mDescrambler;
 };
 }  // namespace android
 
diff --git a/media/jni/tuner/DvrClient.cpp b/media/jni/tuner/DvrClient.cpp
index 0476216..052b465 100644
--- a/media/jni/tuner/DvrClient.cpp
+++ b/media/jni/tuner/DvrClient.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,48 +14,42 @@
  * limitations under the License.
  */
 
+//#define LOG_NDEBUG 0
 #define LOG_TAG "DvrClient"
 
+#include "DvrClient.h"
+
+#include <aidl/android/hardware/tv/tuner/DemuxQueueNotifyBits.h>
 #include <android-base/logging.h>
-#include <fmq/ConvertMQDescriptors.h>
+#include <inttypes.h>
 #include <utils/Log.h>
 
 #include "ClientHelper.h"
-#include "DvrClient.h"
 
-using ::android::hardware::tv::tuner::V1_0::DemuxQueueNotifyBits;
-using ::android::hardware::tv::tuner::V1_0::Result;
+using ::aidl::android::hardware::tv::tuner::DemuxQueueNotifyBits;
 
 namespace android {
-
 /////////////// DvrClient ///////////////////////
-
 DvrClient::DvrClient(shared_ptr<ITunerDvr> tunerDvr) {
     mTunerDvr = tunerDvr;
     mFd = -1;
-    mDvrMQ = NULL;
-    mDvrMQEventFlag = NULL;
+    mDvrMQ = nullptr;
+    mDvrMQEventFlag = nullptr;
 }
 
 DvrClient::~DvrClient() {
-    mTunerDvr = NULL;
-    mDvr = NULL;
+    mTunerDvr = nullptr;
     mFd = -1;
-    mDvrMQ = NULL;
-    mDvrMQEventFlag = NULL;
+    mDvrMQ = nullptr;
+    mDvrMQEventFlag = nullptr;
 }
 
-// TODO: remove after migration to Tuner Service is done.
-void DvrClient::setHidlDvr(sp<IDvr> dvr) {
-    mDvr = dvr;
-}
-
-void DvrClient::setFd(int fd) {
+void DvrClient::setFd(int32_t fd) {
     mFd = fd;
 }
 
-long DvrClient::readFromFile(long size) {
-    if (mDvrMQ == NULL || mDvrMQEventFlag == NULL) {
+int64_t DvrClient::readFromFile(int64_t size) {
+    if (mDvrMQ == nullptr || mDvrMQEventFlag == nullptr) {
         ALOGE("Failed to readFromFile. DVR mq is not configured");
         return -1;
     }
@@ -64,16 +58,16 @@
         return -1;
     }
 
-    long available = mDvrMQ->availableToWrite();
-    long write = min(size, available);
+    int64_t available = mDvrMQ->availableToWrite();
+    int64_t write = min(size, available);
 
     AidlMQ::MemTransaction tx;
-    long ret = 0;
+    int64_t ret = 0;
     if (mDvrMQ->beginWrite(write, &tx)) {
         auto first = tx.getFirstRegion();
         auto data = first.getAddress();
-        long length = first.getLength();
-        long firstToWrite = min(length, write);
+        int64_t length = first.getLength();
+        int64_t firstToWrite = min(length, write);
         ret = read(mFd, data, firstToWrite);
 
         if (ret < 0) {
@@ -81,17 +75,20 @@
             return -1;
         }
         if (ret < firstToWrite) {
-            ALOGW("file to MQ, first region: %ld bytes to write, but %ld bytes written",
-                    firstToWrite, ret);
+            ALOGW("file to MQ, first region: %" PRIu64 " bytes to write, but %" PRIu64
+                  " bytes written",
+                  firstToWrite, ret);
         } else if (firstToWrite < write) {
-            ALOGD("write second region: %ld bytes written, %ld bytes in total", ret, write);
+            ALOGV("write second region: %" PRIu64 " bytes written, %" PRIu64 " bytes in total", ret,
+                  write);
             auto second = tx.getSecondRegion();
             data = second.getAddress();
             length = second.getLength();
-            int secondToWrite = std::min(length, write - firstToWrite);
+            int64_t secondToWrite = std::min(length, write - firstToWrite);
             ret += read(mFd, data, secondToWrite);
         }
-        ALOGD("file to MQ: %ld bytes need to be written, %ld bytes written", write, ret);
+        ALOGV("file to MQ: %" PRIu64 " bytes need to be written, %" PRIu64 " bytes written", write,
+              ret);
         if (!mDvrMQ->commitWrite(ret)) {
             ALOGE("Error: failed to commit write!");
             return -1;
@@ -106,8 +103,8 @@
     return ret;
 }
 
-long DvrClient::readFromBuffer(int8_t* buffer, long size) {
-    if (mDvrMQ == NULL || mDvrMQEventFlag == NULL) {
+int64_t DvrClient::readFromBuffer(int8_t* buffer, int64_t size) {
+    if (mDvrMQ == nullptr || mDvrMQEventFlag == nullptr) {
         ALOGE("Failed to readFromBuffer. DVR mq is not configured");
         return -1;
     }
@@ -116,7 +113,7 @@
         return -1;
     }
 
-    long available = mDvrMQ->availableToWrite();
+    int64_t available = mDvrMQ->availableToWrite();
     size = min(size, available);
 
     if (mDvrMQ->write(buffer, size)) {
@@ -128,8 +125,8 @@
     return size;
 }
 
-long DvrClient::writeToFile(long size) {
-    if (mDvrMQ == NULL || mDvrMQEventFlag == NULL) {
+int64_t DvrClient::writeToFile(int64_t size) {
+    if (mDvrMQ == nullptr || mDvrMQEventFlag == nullptr) {
         ALOGE("Failed to writeToFile. DVR mq is not configured");
         return -1;
     }
@@ -138,16 +135,16 @@
         return -1;
     }
 
-    long available = mDvrMQ->availableToRead();
-    long toRead = min(size, available);
+    int64_t available = mDvrMQ->availableToRead();
+    int64_t toRead = min(size, available);
 
-    long ret = 0;
+    int64_t ret = 0;
     AidlMQ::MemTransaction tx;
     if (mDvrMQ->beginRead(toRead, &tx)) {
         auto first = tx.getFirstRegion();
         auto data = first.getAddress();
-        long length = first.getLength();
-        long firstToRead = std::min(length, toRead);
+        int64_t length = first.getLength();
+        int64_t firstToRead = std::min(length, toRead);
         ret = write(mFd, data, firstToRead);
 
         if (ret < 0) {
@@ -155,16 +152,18 @@
             return -1;
         }
         if (ret < firstToRead) {
-            ALOGW("MQ to file: %ld bytes read, but %ld bytes written", firstToRead, ret);
+            ALOGW("MQ to file: %" PRIu64 " bytes read, but %" PRIu64 " bytes written", firstToRead,
+                  ret);
         } else if (firstToRead < toRead) {
-            ALOGD("read second region: %ld bytes read, %ld bytes in total", ret, toRead);
+            ALOGV("read second region: %" PRIu64 " bytes read, %" PRIu64 " bytes in total", ret,
+                  toRead);
             auto second = tx.getSecondRegion();
             data = second.getAddress();
             length = second.getLength();
-            int secondToRead = toRead - firstToRead;
+            int32_t secondToRead = toRead - firstToRead;
             ret += write(mFd, data, secondToRead);
         }
-        ALOGD("MQ to file: %ld bytes to be read, %ld bytes written", toRead, ret);
+        ALOGV("MQ to file: %" PRIu64 " bytes to be read, %" PRIu64 " bytes written", toRead, ret);
         if (!mDvrMQ->commitRead(ret)) {
             ALOGE("Error: failed to commit read!");
             return 0;
@@ -179,8 +178,8 @@
     return ret;
 }
 
-long DvrClient::writeToBuffer(int8_t* buffer, long size) {
-    if (mDvrMQ == NULL || mDvrMQEventFlag == NULL) {
+int64_t DvrClient::writeToBuffer(int8_t* buffer, int64_t size) {
+    if (mDvrMQ == nullptr || mDvrMQEventFlag == nullptr) {
         ALOGE("Failed to writetoBuffer. DVR mq is not configured");
         return -1;
     }
@@ -189,7 +188,7 @@
         return -1;
     }
 
-    long available = mDvrMQ->availableToRead();
+    int64_t available = mDvrMQ->availableToRead();
     size = min(size, available);
 
     if (mDvrMQ->read(buffer, size)) {
@@ -202,9 +201,8 @@
 }
 
 Result DvrClient::configure(DvrSettings settings) {
-    if (mTunerDvr != NULL) {
-        TunerDvrSettings dvrSettings = getAidlDvrSettingsFromHidl(settings);
-        Status s = mTunerDvr->configure(dvrSettings);
+    if (mTunerDvr != nullptr) {
+        Status s = mTunerDvr->configure(settings);
         Result res = ClientHelper::getServiceSpecificErrorCode(s);
         if (res != Result::SUCCESS) {
             return res;
@@ -221,196 +219,95 @@
         return res;
     }
 
-    if (mDvr != NULL) {
-        Result res = mDvr->configure(settings);
-        if (res == Result::SUCCESS) {
-            MQDescriptorSync<uint8_t> dvrMQDesc;
-            res = getQueueDesc(dvrMQDesc);
-            if (res == Result::SUCCESS) {
-                AidlMQDesc aidlMQDesc;
-                unsafeHidlToAidlMQDescriptor<uint8_t, int8_t, SynchronizedReadWrite>(
-                        dvrMQDesc,  &aidlMQDesc);
-                mDvrMQ = new (nothrow) AidlMessageQueue(aidlMQDesc);
-                EventFlag::createEventFlag(mDvrMQ->getEventFlagWord(), &mDvrMQEventFlag);
-            }
-        }
-        return res;
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result DvrClient::attachFilter(sp<FilterClient> filterClient) {
-    if (mTunerDvr != NULL) {
-        Status s = mTunerDvr->attachFilter(filterClient->getAidlFilter());
-        return ClientHelper::getServiceSpecificErrorCode(s);
+    if (filterClient == nullptr) {
+        return Result::INVALID_ARGUMENT;
     }
 
-    if (mDvr != NULL) {
-        sp<IFilter> hidlFilter = filterClient->getHalFilter();
-        if (hidlFilter == NULL) {
-            return Result::INVALID_ARGUMENT;
-        }
-        return mDvr->attachFilter(hidlFilter);
+    if (mTunerDvr != nullptr) {
+        Status s = mTunerDvr->attachFilter(filterClient->getAidlFilter());
+        return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
     return Result::INVALID_STATE;
 }
 
 Result DvrClient::detachFilter(sp<FilterClient> filterClient) {
-    if (mTunerDvr != NULL) {
-        Status s = mTunerDvr->detachFilter(filterClient->getAidlFilter());
-        return ClientHelper::getServiceSpecificErrorCode(s);
+    if (filterClient == nullptr) {
+        return Result::INVALID_ARGUMENT;
     }
 
-    if (mDvr != NULL) {
-        sp<IFilter> hidlFilter = filterClient->getHalFilter();
-        if (hidlFilter == NULL) {
-            return Result::INVALID_ARGUMENT;
-        }
-        return mDvr->detachFilter(hidlFilter);
+    if (mTunerDvr != nullptr) {
+        Status s = mTunerDvr->detachFilter(filterClient->getAidlFilter());
+        return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
     return Result::INVALID_STATE;
 }
 
 Result DvrClient::start() {
-    if (mTunerDvr != NULL) {
+    if (mTunerDvr != nullptr) {
         Status s = mTunerDvr->start();
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mDvr != NULL) {
-        return mDvr->start();
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result DvrClient::stop() {
-    if (mTunerDvr != NULL) {
+    if (mTunerDvr != nullptr) {
         Status s = mTunerDvr->stop();
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mDvr != NULL) {
-        return mDvr->stop();
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result DvrClient::flush() {
-    if (mTunerDvr != NULL) {
+    if (mTunerDvr != nullptr) {
         Status s = mTunerDvr->flush();
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mDvr != NULL) {
-        return mDvr->flush();
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result DvrClient::close() {
-    if (mDvrMQEventFlag != NULL) {
+    if (mDvrMQEventFlag != nullptr) {
         EventFlag::deleteEventFlag(&mDvrMQEventFlag);
     }
-    mDvrMQ = NULL;
+    mDvrMQ = nullptr;
 
-    if (mTunerDvr != NULL) {
+    if (mTunerDvr != nullptr) {
         Status s = mTunerDvr->close();
-        mTunerDvr = NULL;
+        mTunerDvr = nullptr;
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mDvr != NULL) {
-        Result res = mDvr->close();
-        mDvr = NULL;
-        return res;
-    }
-
     return Result::INVALID_STATE;
 }
 
-/////////////// IDvrCallback ///////////////////////
-
-HidlDvrCallback::HidlDvrCallback(sp<DvrClientCallback> dvrClientCallback)
-        : mDvrClientCallback(dvrClientCallback) {}
-
-Return<void> HidlDvrCallback::onRecordStatus(const RecordStatus status) {
-    if (mDvrClientCallback != NULL) {
-        mDvrClientCallback->onRecordStatus(status);
-    }
-    return Void();
-}
-
-Return<void> HidlDvrCallback::onPlaybackStatus(const PlaybackStatus status) {
-    if (mDvrClientCallback != NULL) {
-        mDvrClientCallback->onPlaybackStatus(status);
-    }
-    return Void();
-}
-
 /////////////// TunerDvrCallback ///////////////////////
-
 TunerDvrCallback::TunerDvrCallback(sp<DvrClientCallback> dvrClientCallback)
         : mDvrClientCallback(dvrClientCallback) {}
 
-Status TunerDvrCallback::onRecordStatus(int status) {
-    if (mDvrClientCallback != NULL) {
-        mDvrClientCallback->onRecordStatus(static_cast<RecordStatus>(status));
+Status TunerDvrCallback::onRecordStatus(RecordStatus status) {
+    if (mDvrClientCallback != nullptr) {
+        mDvrClientCallback->onRecordStatus(status);
         return Status::ok();
     }
     return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
 }
 
-Status TunerDvrCallback::onPlaybackStatus(int status) {
-    if (mDvrClientCallback != NULL) {
-        mDvrClientCallback->onPlaybackStatus(static_cast<PlaybackStatus>(status));
+Status TunerDvrCallback::onPlaybackStatus(PlaybackStatus status) {
+    if (mDvrClientCallback != nullptr) {
+        mDvrClientCallback->onPlaybackStatus(status);
         return Status::ok();
     }
     return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
 }
 
-/////////////// DvrClient Helper Methods ///////////////////////
-
-Result DvrClient::getQueueDesc(MQDesc& dvrMQDesc) {
-    if (mDvr != NULL) {
-        Result res = Result::UNKNOWN_ERROR;
-        mDvr->getQueueDesc([&](Result r, const MQDesc& desc) {
-            dvrMQDesc = desc;
-            res = r;
-        });
-        return res;
-    }
-
-    return Result::INVALID_STATE;
-}
-
-TunerDvrSettings DvrClient::getAidlDvrSettingsFromHidl(DvrSettings settings) {
-    TunerDvrSettings s;
-    switch (settings.getDiscriminator()) {
-        case DvrSettings::hidl_discriminator::record: {
-            s.statusMask = static_cast<int>(settings.record().statusMask);
-            s.lowThreshold = static_cast<int>(settings.record().lowThreshold);
-            s.highThreshold = static_cast<int>(settings.record().highThreshold);
-            s.dataFormat = static_cast<int>(settings.record().dataFormat);
-            s.packetSize = static_cast<int>(settings.record().packetSize);
-            return s;
-        }
-        case DvrSettings::hidl_discriminator::playback: {
-            s.statusMask = static_cast<int>(settings.playback().statusMask);
-            s.lowThreshold = static_cast<int>(settings.playback().lowThreshold);
-            s.highThreshold = static_cast<int>(settings.playback().highThreshold);
-            s.dataFormat = static_cast<int>(settings.playback().dataFormat);
-            s.packetSize = static_cast<int>(settings.playback().packetSize);
-            return s;
-        }
-        default:
-            break;
-    }
-    return s;
-}
 }  // namespace android
diff --git a/media/jni/tuner/DvrClient.h b/media/jni/tuner/DvrClient.h
index 252554e..9080c72 100644
--- a/media/jni/tuner/DvrClient.h
+++ b/media/jni/tuner/DvrClient.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,36 +17,29 @@
 #ifndef _ANDROID_MEDIA_TV_DVR_CLIENT_H_
 #define _ANDROID_MEDIA_TV_DVR_CLIENT_H_
 
+#include <aidl/android/hardware/tv/tuner/DvrSettings.h>
+#include <aidl/android/hardware/tv/tuner/Result.h>
 #include <aidl/android/media/tv/tuner/BnTunerDvrCallback.h>
 #include <aidl/android/media/tv/tuner/ITunerDvr.h>
-#include <android/hardware/tv/tuner/1.0/IDvr.h>
-#include <android/hardware/tv/tuner/1.0/IDvrCallback.h>
-#include <android/hardware/tv/tuner/1.1/types.h>
 #include <fmq/AidlMessageQueue.h>
-#include <fmq/MessageQueue.h>
 
 #include "DvrClientCallback.h"
 #include "FilterClient.h"
 
 using Status = ::ndk::ScopedAStatus;
+using ::aidl::android::hardware::common::fmq::MQDescriptor;
 using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
+using ::aidl::android::hardware::tv::tuner::DvrSettings;
+using ::aidl::android::hardware::tv::tuner::PlaybackStatus;
+using ::aidl::android::hardware::tv::tuner::RecordStatus;
+using ::aidl::android::hardware::tv::tuner::Result;
 using ::aidl::android::media::tv::tuner::BnTunerDvrCallback;
 using ::aidl::android::media::tv::tuner::ITunerDvr;
-using ::aidl::android::media::tv::tuner::TunerDvrSettings;
-
-using ::android::hardware::EventFlag;
-using ::android::hardware::MQDescriptorSync;
-using ::android::hardware::MessageQueue;
-using ::android::hardware::tv::tuner::V1_0::DvrSettings;
-using ::android::hardware::tv::tuner::V1_0::IDvr;
-using ::android::hardware::tv::tuner::V1_0::IDvrCallback;
 
 using namespace std;
 
 namespace android {
 
-using MQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
-using MQDesc = MQDescriptorSync<uint8_t>;
 using AidlMQ = AidlMessageQueue<int8_t, SynchronizedReadWrite>;
 using AidlMQDesc = MQDescriptor<int8_t, SynchronizedReadWrite>;
 
@@ -55,19 +48,8 @@
 public:
     TunerDvrCallback(sp<DvrClientCallback> dvrClientCallback);
 
-    Status onRecordStatus(int status);
-    Status onPlaybackStatus(int status);
-
-private:
-    sp<DvrClientCallback> mDvrClientCallback;
-};
-
-struct HidlDvrCallback : public IDvrCallback {
-
-public:
-    HidlDvrCallback(sp<DvrClientCallback> dvrClientCallback);
-    virtual Return<void> onRecordStatus(const RecordStatus status);
-    virtual Return<void> onPlaybackStatus(const PlaybackStatus status);
+    Status onRecordStatus(RecordStatus status);
+    Status onPlaybackStatus(PlaybackStatus status);
 
 private:
     sp<DvrClientCallback> mDvrClientCallback;
@@ -79,33 +61,30 @@
     DvrClient(shared_ptr<ITunerDvr> tunerDvr);
     ~DvrClient();
 
-    // TODO: remove after migration to Tuner Service is done.
-    void setHidlDvr(sp<IDvr> dvr);
-
     /**
      * Set the DVR file descriptor.
      */
-    void setFd(int fd);
+    void setFd(int32_t fd);
 
     /**
      * Read data from file with given size. Return the actual read size.
      */
-    long readFromFile(long size);
+    int64_t readFromFile(int64_t size);
 
     /**
      * Read data from the given buffer with given size. Return the actual read size.
      */
-    long readFromBuffer(int8_t* buffer, long size);
+    int64_t readFromBuffer(int8_t* buffer, int64_t size);
 
     /**
      * Write data to file with given size. Return the actual write size.
      */
-    long writeToFile(long size);
+    int64_t writeToFile(int64_t size);
 
     /**
      * Write data to the given buffer with given size. Return the actual write size.
      */
-    long writeToBuffer(int8_t* buffer, long size);
+    int64_t writeToBuffer(int8_t* buffer, int64_t size);
 
     /**
      * Configure the DVR.
@@ -143,26 +122,16 @@
     Result close();
 
 private:
-    Result getQueueDesc(MQDesc& dvrMQDesc);
-    TunerDvrSettings getAidlDvrSettingsFromHidl(DvrSettings settings);
-
     /**
      * An AIDL Tuner Dvr Singleton assigned at the first time the Tuner Client
      * opens a dvr. Default null when dvr is not opened.
      */
     shared_ptr<ITunerDvr> mTunerDvr;
 
-    /**
-     * A Dvr HAL interface that is ready before migrating to the TunerDvr.
-     * This is a temprary interface before Tuner Framework migrates to use TunerService.
-     * Default null when the HAL service does not exist.
-     */
-    sp<IDvr> mDvr;
-
     AidlMQ* mDvrMQ;
     EventFlag* mDvrMQEventFlag;
     string mFilePath;
-    int mFd;
+    int32_t mFd;
 };
 }  // namespace android
 
diff --git a/media/jni/tuner/DvrClientCallback.h b/media/jni/tuner/DvrClientCallback.h
index 6684424..a75f199 100644
--- a/media/jni/tuner/DvrClientCallback.h
+++ b/media/jni/tuner/DvrClientCallback.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,8 +17,12 @@
 #ifndef _ANDROID_MEDIA_TV_DVR_CLIENT_CALLBACK_H_
 #define _ANDROID_MEDIA_TV_DVR_CLIENT_CALLBACK_H_
 
-using ::android::hardware::tv::tuner::V1_0::PlaybackStatus;
-using ::android::hardware::tv::tuner::V1_0::RecordStatus;
+#include <aidl/android/hardware/tv/tuner/PlaybackStatus.h>
+#include <aidl/android/hardware/tv/tuner/RecordStatus.h>
+#include <utils/RefBase.h>
+
+using ::aidl::android::hardware::tv::tuner::PlaybackStatus;
+using ::aidl::android::hardware::tv::tuner::RecordStatus;
 
 using namespace std;
 
@@ -30,4 +34,4 @@
 };
 }  // namespace android
 
-#endif  // _ANDROID_MEDIA_TV_DVR_CLIENT_CALLBACK_H_
\ No newline at end of file
+#endif // _ANDROID_MEDIA_TV_DVR_CLIENT_CALLBACK_H_
diff --git a/media/jni/tuner/FilterClient.cpp b/media/jni/tuner/FilterClient.cpp
index 324c09a..eea27ea 100644
--- a/media/jni/tuner/FilterClient.cpp
+++ b/media/jni/tuner/FilterClient.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,65 +16,43 @@
 
 #define LOG_TAG "FilterClient"
 
-#include <aidlcommonsupport/NativeHandle.h>
-#include <android-base/logging.h>
-#include <fmq/ConvertMQDescriptors.h>
-#include <utils/Log.h>
-
 #include "FilterClient.h"
 
-using ::aidl::android::media::tv::tuner::TunerDemuxIpAddressSettings;
-using ::aidl::android::media::tv::tuner::TunerFilterAlpConfiguration;
-using ::aidl::android::media::tv::tuner::TunerFilterIpConfiguration;
-using ::aidl::android::media::tv::tuner::TunerFilterMmtpConfiguration;
-using ::aidl::android::media::tv::tuner::TunerFilterMonitorEvent;
-using ::aidl::android::media::tv::tuner::TunerFilterScIndexMask;
-using ::aidl::android::media::tv::tuner::TunerFilterSectionBits;
-using ::aidl::android::media::tv::tuner::TunerFilterSectionCondition;
-using ::aidl::android::media::tv::tuner::TunerFilterSectionTableInfo;
-using ::aidl::android::media::tv::tuner::TunerFilterSharedHandleInfo;
-using ::aidl::android::media::tv::tuner::TunerFilterTlvConfiguration;
-using ::aidl::android::media::tv::tuner::TunerFilterTsConfiguration;
-using ::android::hardware::hidl_vec;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
-using ::android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType;
-using ::android::hardware::tv::tuner::V1_0::DemuxQueueNotifyBits;
-using ::android::hardware::tv::tuner::V1_0::DemuxStreamId;
-using ::android::hardware::tv::tuner::V1_0::DemuxTpid;
-using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
-using ::android::hardware::tv::tuner::V1_1::DemuxFilterMonitorEvent;
-using ::android::hardware::tv::tuner::V1_1::ScramblingStatus;
+#include <aidl/android/hardware/tv/tuner/DemuxFilterMainType.h>
+#include <aidl/android/hardware/tv/tuner/DemuxQueueNotifyBits.h>
+#include <aidlcommonsupport/NativeHandle.h>
+#include <android-base/logging.h>
+#include <utils/Log.h>
+
+using ::aidl::android::hardware::common::NativeHandle;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterMainType;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterSubType;
+using ::aidl::android::hardware::tv::tuner::DemuxMmtpFilterSettingsFilterSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxMmtpFilterType;
+using ::aidl::android::hardware::tv::tuner::DemuxQueueNotifyBits;
+using ::aidl::android::hardware::tv::tuner::DemuxTsFilterSettingsFilterSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxTsFilterType;
+using ::aidl::android::hardware::tv::tuner::ScramblingStatus;
 
 namespace android {
-
 /////////////// FilterClient ///////////////////////
-
 FilterClient::FilterClient(DemuxFilterType type, shared_ptr<ITunerFilter> tunerFilter) {
     mTunerFilter = tunerFilter;
-    mAvSharedHandle = NULL;
+    mAvSharedHandle = nullptr;
     checkIsMediaFilter(type);
 }
 
 FilterClient::~FilterClient() {
-    mTunerFilter = NULL;
-    mFilter = NULL;
-    mFilter_1_1 = NULL;
-    mAvSharedHandle = NULL;
+    mTunerFilter = nullptr;
+    mAvSharedHandle = nullptr;
     mAvSharedMemSize = 0;
     mIsMediaFilter = false;
     mIsPassthroughFilter = false;
-    mFilterMQ = NULL;
-    mFilterMQEventFlag = NULL;
+    mFilterMQ = nullptr;
+    mFilterMQEventFlag = nullptr;
 }
 
-// TODO: remove after migration to Tuner Service is done.
-void FilterClient::setHidlFilter(sp<IFilter> filter) {
-    mFilter = filter;
-    mFilter_1_1 = ::android::hardware::tv::tuner::V1_1::IFilter::castFrom(mFilter);
-}
-
-int FilterClient::read(int8_t* buffer, int size) {
+int64_t FilterClient::read(int8_t* buffer, int64_t size) {
     Result res = getFilterMq();
     if (res != Result::SUCCESS) {
         return -1;
@@ -85,8 +63,8 @@
 SharedHandleInfo FilterClient::getAvSharedHandleInfo() {
     handleAvShareMemory();
     SharedHandleInfo info{
-        .sharedHandle = (mIsMediaFilter && !mIsPassthroughFilter) ? mAvSharedHandle : NULL,
-        .size = mAvSharedMemSize,
+            .sharedHandle = (mIsMediaFilter && !mIsPassthroughFilter) ? mAvSharedHandle : nullptr,
+            .size = mAvSharedMemSize,
     };
 
     return info;
@@ -96,8 +74,8 @@
     Result res;
     checkIsPassthroughFilter(configure);
 
-    if (mTunerFilter != NULL) {
-        Status s = mTunerFilter->configure(getAidlFilterSettings(configure));
+    if (mTunerFilter != nullptr) {
+        Status s = mTunerFilter->configure(configure);
         res = ClientHelper::getServiceSpecificErrorCode(s);
         if (res == Result::SUCCESS) {
             getAvSharedHandleInfo();
@@ -105,171 +83,96 @@
         return res;
     }
 
-    if (mFilter != NULL) {
-        res = mFilter->configure(configure);
-        if (res == Result::SUCCESS) {
-            getAvSharedHandleInfo();
-        }
-        return res;
-    }
-
     return Result::INVALID_STATE;
 }
 
-Result FilterClient::configureMonitorEvent(int monitorEventType) {
-    if (mTunerFilter != NULL) {
+Result FilterClient::configureMonitorEvent(int32_t monitorEventType) {
+    if (mTunerFilter != nullptr) {
         Status s = mTunerFilter->configureMonitorEvent(monitorEventType);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFilter_1_1 != NULL) {
-        return mFilter_1_1->configureMonitorEvent(monitorEventType);
-    }
-
     return Result::INVALID_STATE;
 }
 
-Result FilterClient::configureIpFilterContextId(int cid) {
-    if (mTunerFilter != NULL) {
+Result FilterClient::configureIpFilterContextId(int32_t cid) {
+    if (mTunerFilter != nullptr) {
         Status s = mTunerFilter->configureIpFilterContextId(cid);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFilter_1_1 != NULL) {
-        return mFilter_1_1->configureIpCid(cid);
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result FilterClient::configureAvStreamType(AvStreamType avStreamType) {
-    if (mTunerFilter != NULL) {
-        int type;
-        switch (avStreamType.getDiscriminator()) {
-            case AvStreamType::hidl_discriminator::audio:
-                type = (int)avStreamType.audio();
-                break;
-            case AvStreamType::hidl_discriminator::video:
-                type = (int)avStreamType.video();
-                break;
-        }
-        Status s = mTunerFilter->configureAvStreamType(type);
+    if (mTunerFilter != nullptr) {
+        Status s = mTunerFilter->configureAvStreamType(avStreamType);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFilter_1_1 != NULL) {
-        return mFilter_1_1->configureAvStreamType(avStreamType);
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result FilterClient::start() {
-    if (mTunerFilter != NULL) {
+    if (mTunerFilter != nullptr) {
         Status s = mTunerFilter->start();
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFilter != NULL) {
-        return mFilter->start();
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result FilterClient::stop() {
-    if (mTunerFilter != NULL) {
+    if (mTunerFilter != nullptr) {
         Status s = mTunerFilter->stop();
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFilter != NULL) {
-        return mFilter->stop();
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result FilterClient::flush() {
-    if (mTunerFilter != NULL) {
+    if (mTunerFilter != nullptr) {
         Status s = mTunerFilter->flush();
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFilter != NULL) {
-        return mFilter->flush();
+    return Result::INVALID_STATE;
+}
+
+Result FilterClient::getId(int32_t& id) {
+    if (mTunerFilter != nullptr) {
+        Status s = mTunerFilter->getId(&id);
+        return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
     return Result::INVALID_STATE;
 }
 
-Result FilterClient::getId(uint32_t& id) {
-    if (mTunerFilter != NULL) {
-        int32_t id32Bit;
-        Status s = mTunerFilter->getId(&id32Bit);
-        id = static_cast<uint32_t>(id32Bit);
+Result FilterClient::getId64Bit(int64_t& id) {
+    if (mTunerFilter != nullptr) {
+        Status s = mTunerFilter->getId64Bit(&id);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFilter != NULL) {
-        Result res;
-        mFilter->getId([&](Result r, uint32_t filterId) {
-            res = r;
-            id = filterId;
-        });
-        return res;
-    }
-
-    return Result::INVALID_STATE;
-}
-
-Result FilterClient::getId64Bit(uint64_t& id) {
-    if (mTunerFilter != NULL) {
-        int64_t id64Bit;
-        Status s = mTunerFilter->getId64Bit(&id64Bit);
-        id = static_cast<uint64_t>(id64Bit);
-        return ClientHelper::getServiceSpecificErrorCode(s);
-    }
-
-    if (mFilter_1_1 != NULL) {
-        Result res;
-        mFilter_1_1->getId64Bit([&](Result r, uint64_t filterId) {
-            res = r;
-            id = filterId;
-        });
-        return res;
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result FilterClient::releaseAvHandle(native_handle_t* handle, uint64_t avDataId) {
-    if (mTunerFilter != NULL) {
+    if (mTunerFilter != nullptr) {
         Status s = mTunerFilter->releaseAvHandle(makeToAidl(handle), avDataId);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFilter != NULL) {
-        return mFilter->releaseAvHandle(hidl_handle(handle), avDataId);
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result FilterClient::setDataSource(sp<FilterClient> filterClient){
-    if (mTunerFilter != NULL) {
+    if (mTunerFilter != nullptr) {
         Status s = mTunerFilter->setDataSource(filterClient->getAidlFilter());
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFilter != NULL) {
-        sp<IFilter> sourceFilter = filterClient->getHalFilter();
-        if (sourceFilter == NULL) {
-            return Result::INVALID_ARGUMENT;
-        }
-        return mFilter->setDataSource(sourceFilter);
-    }
-
     return Result::INVALID_STATE;
 }
 
@@ -277,648 +180,38 @@
     if (mFilterMQEventFlag) {
         EventFlag::deleteEventFlag(&mFilterMQEventFlag);
     }
-    mFilterMQEventFlag = NULL;
-    mFilterMQ = NULL;
+    mFilterMQEventFlag = nullptr;
+    mFilterMQ = nullptr;
 
-    if (mTunerFilter != NULL) {
+    if (mTunerFilter != nullptr) {
         Status s = mTunerFilter->close();
         closeAvSharedMemory();
-        mTunerFilter = NULL;
+        mTunerFilter = nullptr;
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFilter != NULL) {
-        Result res = mFilter->close();
-        mFilter = NULL;
-        mFilter_1_1 = NULL;
-        closeAvSharedMemory();
-        return res;
-    }
-
     return Result::INVALID_STATE;
 }
 
-/////////////// IFilterCallback ///////////////////////
-
-HidlFilterCallback::HidlFilterCallback(sp<FilterClientCallback> filterClientCallback)
-        : mFilterClientCallback(filterClientCallback) {}
-
-Return<void> HidlFilterCallback::onFilterStatus(const DemuxFilterStatus status) {
-    if (mFilterClientCallback != NULL) {
-        mFilterClientCallback->onFilterStatus(status);
-    }
-    return Void();
-}
-
-Return<void> HidlFilterCallback::onFilterEvent(const DemuxFilterEvent& filterEvent) {
-    if (mFilterClientCallback != NULL) {
-        mFilterClientCallback->onFilterEvent(filterEvent);
-    }
-    return Void();
-}
-
-Return<void> HidlFilterCallback::onFilterEvent_1_1(const DemuxFilterEvent& filterEvent,
-        const DemuxFilterEventExt& filterEventExt) {
-    if (mFilterClientCallback != NULL) {
-        mFilterClientCallback->onFilterEvent_1_1(filterEvent, filterEventExt);
-    }
-    return Void();
-}
-
 /////////////// TunerFilterCallback ///////////////////////
 
 TunerFilterCallback::TunerFilterCallback(sp<FilterClientCallback> filterClientCallback)
         : mFilterClientCallback(filterClientCallback) {}
 
-Status TunerFilterCallback::onFilterStatus(int status) {
-    if (mFilterClientCallback != NULL) {
-        mFilterClientCallback->onFilterStatus(static_cast<DemuxFilterStatus>(status));
+Status TunerFilterCallback::onFilterStatus(DemuxFilterStatus status) {
+    if (mFilterClientCallback != nullptr) {
+        mFilterClientCallback->onFilterStatus(status);
         return Status::ok();
     }
     return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
 }
 
-Status TunerFilterCallback::onFilterEvent(const vector<TunerFilterEvent>& filterEvents) {
-    if (mFilterClientCallback == NULL) {
-        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
+Status TunerFilterCallback::onFilterEvent(const vector<DemuxFilterEvent>& filterEvents) {
+    if (mFilterClientCallback != nullptr) {
+        mFilterClientCallback->onFilterEvent(filterEvents);
+        return Status::ok();
     }
-
-    if (filterEvents.size() == 0) {
-        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_ARGUMENT));
-    }
-
-    DemuxFilterEvent event;
-    DemuxFilterEventExt eventExt;
-    getHidlFilterEvent(filterEvents, event, eventExt);
-    if (eventExt.events.size() > 0) {
-        mFilterClientCallback->onFilterEvent_1_1(event, eventExt);
-    } else {
-        mFilterClientCallback->onFilterEvent(event);
-    }
-
-    return Status::ok();
-}
-
-/////////////// FilterClient Helper Methods ///////////////////////
-
-TunerFilterConfiguration FilterClient::getAidlFilterSettings(DemuxFilterSettings configure) {
-    TunerFilterConfiguration config;
-    switch (configure.getDiscriminator()) {
-        case DemuxFilterSettings::hidl_discriminator::ts:
-            return getAidlTsSettings(configure.ts());
-        case DemuxFilterSettings::hidl_discriminator::mmtp:
-            return getAidlMmtpSettings(configure.mmtp());
-        case DemuxFilterSettings::hidl_discriminator::ip:
-            return getAidlIpSettings(configure.ip());
-        case DemuxFilterSettings::hidl_discriminator::tlv:
-            return getAidlTlvSettings(configure.tlv());
-        case DemuxFilterSettings::hidl_discriminator::alp:
-            return getAidlAlpSettings(configure.alp());
-        default:
-            break;
-    }
-    ALOGE("Wrong DemuxFilterSettings union.");
-    return config;
-}
-
-TunerFilterConfiguration FilterClient::getAidlTsSettings(DemuxTsFilterSettings ts) {
-    TunerFilterConfiguration config;
-    TunerFilterSettings filterSettings;
-    switch (ts.filterSettings.getDiscriminator()) {
-        case DemuxTsFilterSettings::FilterSettings::hidl_discriminator::av: {
-            filterSettings.set<TunerFilterSettings::av>(
-                    getAidlAvSettings(ts.filterSettings.av()));
-            break;
-        }
-        case DemuxTsFilterSettings::FilterSettings::hidl_discriminator::section: {
-            filterSettings.set<TunerFilterSettings::section>(
-                    getAidlSectionSettings(ts.filterSettings.section()));
-            break;
-        }
-        case DemuxTsFilterSettings::FilterSettings::hidl_discriminator::pesData: {
-            filterSettings.set<TunerFilterSettings::pesData>(
-                    getAidlPesDataSettings(ts.filterSettings.pesData()));
-            break;
-        }
-        case DemuxTsFilterSettings::FilterSettings::hidl_discriminator::record: {
-            filterSettings.set<TunerFilterSettings::record>(
-                    getAidlRecordSettings(ts.filterSettings.record()));
-            break;
-        }
-        default:
-            filterSettings.set<TunerFilterSettings::nothing>(true);
-            break;
-    }
-
-    TunerFilterTsConfiguration aidlTs{
-        .tpid = static_cast<char16_t>(ts.tpid),
-        .filterSettings = filterSettings,
-    };
-    config.set<TunerFilterConfiguration::ts>(aidlTs);
-
-    return config;
-}
-
-TunerFilterConfiguration FilterClient::getAidlMmtpSettings(DemuxMmtpFilterSettings mmtp) {
-    TunerFilterConfiguration config;
-    TunerFilterSettings filterSettings;
-    switch (mmtp.filterSettings.getDiscriminator()) {
-        case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::av: {
-            filterSettings.set<TunerFilterSettings::av>(
-                    getAidlAvSettings(mmtp.filterSettings.av()));
-            break;
-        }
-        case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::section: {
-            filterSettings.set<TunerFilterSettings::section>(
-                    getAidlSectionSettings(mmtp.filterSettings.section()));
-            break;
-        }
-        case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::pesData: {
-            filterSettings.set<TunerFilterSettings::pesData>(
-                    getAidlPesDataSettings(mmtp.filterSettings.pesData()));
-            break;
-        }
-        case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::record: {
-            filterSettings.set<TunerFilterSettings::record>(
-                    getAidlRecordSettings(mmtp.filterSettings.record()));
-            break;
-        }
-        case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::download: {
-            filterSettings.set<TunerFilterSettings::download>(
-                    getAidlDownloadSettings(mmtp.filterSettings.download()));
-            break;
-        }
-        default:
-            filterSettings.set<TunerFilterSettings::nothing>(true);
-            break;
-    }
-
-    TunerFilterMmtpConfiguration aidlMmtp{
-        .mmtpPid = static_cast<char16_t>(mmtp.mmtpPid),
-        .filterSettings = filterSettings,
-    };
-    config.set<TunerFilterConfiguration::mmtp>(aidlMmtp);
-
-    return config;
-}
-
-TunerFilterConfiguration FilterClient::getAidlIpSettings(DemuxIpFilterSettings ip) {
-    TunerFilterConfiguration config;
-    TunerFilterSettings filterSettings;
-    switch (ip.filterSettings.getDiscriminator()) {
-        case DemuxIpFilterSettings::FilterSettings::hidl_discriminator::section: {
-            filterSettings.set<TunerFilterSettings::section>(
-                    getAidlSectionSettings(ip.filterSettings.section()));
-            break;
-        }
-        case DemuxIpFilterSettings::FilterSettings::hidl_discriminator::bPassthrough: {
-            filterSettings.set<TunerFilterSettings::isPassthrough>(
-                    ip.filterSettings.bPassthrough());
-            break;
-        }
-        default:
-            filterSettings.set<TunerFilterSettings::nothing>(true);
-            break;
-    }
-
-    TunerDemuxIpAddressSettings ipAddr{
-        .srcPort = static_cast<char16_t>(ip.ipAddr.srcPort),
-        .dstPort = static_cast<char16_t>(ip.ipAddr.dstPort),
-    };
-    getAidlIpAddress(ip.ipAddr, ipAddr.srcIpAddress, ipAddr.dstIpAddress);
-
-    TunerFilterIpConfiguration aidlIp{
-        .ipAddr = ipAddr,
-        .filterSettings = filterSettings,
-    };
-    config.set<TunerFilterConfiguration::ip>(aidlIp);
-
-    return config;
-}
-
-void FilterClient::getAidlIpAddress(DemuxIpAddress ipAddr,
-        TunerDemuxIpAddress& srcIpAddress, TunerDemuxIpAddress& dstIpAddress) {
-    switch (ipAddr.srcIpAddress.getDiscriminator()) {
-        case DemuxIpAddress::SrcIpAddress::hidl_discriminator::v4: {
-            int size = ipAddr.srcIpAddress.v4().size();
-            srcIpAddress.isIpV6 = false;
-            srcIpAddress.addr.resize(size);
-            copy(&ipAddr.srcIpAddress.v4()[0], &ipAddr.srcIpAddress.v4()[size],
-                    srcIpAddress.addr.begin());
-            break;
-        }
-        case DemuxIpAddress::SrcIpAddress::hidl_discriminator::v6: {
-            int size = ipAddr.srcIpAddress.v6().size();
-            srcIpAddress.isIpV6 = true;
-            srcIpAddress.addr.resize(size);
-            copy(&ipAddr.srcIpAddress.v6()[0], &ipAddr.srcIpAddress.v6()[size],
-                    srcIpAddress.addr.begin());
-            break;
-        }
-    }
-    switch (ipAddr.dstIpAddress.getDiscriminator()) {
-        case DemuxIpAddress::DstIpAddress::hidl_discriminator::v4: {
-            int size = ipAddr.dstIpAddress.v4().size();
-            dstIpAddress.isIpV6 = false;
-            dstIpAddress.addr.resize(size);
-            copy(&ipAddr.dstIpAddress.v4()[0], &ipAddr.dstIpAddress.v4()[size],
-                    dstIpAddress.addr.begin());
-            break;
-        }
-        case DemuxIpAddress::DstIpAddress::hidl_discriminator::v6: {
-            int size = ipAddr.dstIpAddress.v6().size();
-            dstIpAddress.isIpV6 = true;
-            dstIpAddress.addr.resize(size);
-            copy(&ipAddr.dstIpAddress.v6()[0], &ipAddr.dstIpAddress.v6()[size],
-                    dstIpAddress.addr.begin());
-            break;
-        }
-    }
-}
-
-TunerFilterConfiguration FilterClient::getAidlTlvSettings(DemuxTlvFilterSettings tlv) {
-    TunerFilterConfiguration config;
-    TunerFilterSettings filterSettings;
-    switch (tlv.filterSettings.getDiscriminator()) {
-        case DemuxTlvFilterSettings::FilterSettings::hidl_discriminator::section: {
-            filterSettings.set<TunerFilterSettings::section>(
-                    getAidlSectionSettings(tlv.filterSettings.section()));
-            break;
-        }
-        case DemuxTlvFilterSettings::FilterSettings::hidl_discriminator::bPassthrough: {
-            filterSettings.set<TunerFilterSettings::isPassthrough>(
-                    tlv.filterSettings.bPassthrough());
-            break;
-        }
-        default:
-            filterSettings.set<TunerFilterSettings::nothing>(true);
-            break;
-    }
-
-    TunerFilterTlvConfiguration aidlTlv{
-        .packetType = static_cast<int8_t>(tlv.packetType),
-        .isCompressedIpPacket = tlv.isCompressedIpPacket,
-        .filterSettings = filterSettings,
-    };
-    config.set<TunerFilterConfiguration::tlv>(aidlTlv);
-
-    return config;
-}
-
-TunerFilterConfiguration FilterClient::getAidlAlpSettings(DemuxAlpFilterSettings alp) {
-    TunerFilterConfiguration config;
-    TunerFilterSettings filterSettings;
-    switch (alp.filterSettings.getDiscriminator()) {
-        case DemuxAlpFilterSettings::FilterSettings::hidl_discriminator::section: {
-            filterSettings.set<TunerFilterSettings::section>(
-                    getAidlSectionSettings(alp.filterSettings.section()));
-            break;
-        }
-        default:
-            filterSettings.set<TunerFilterSettings::nothing>(true);
-            break;
-    }
-
-    TunerFilterAlpConfiguration aidlAlp{
-        .packetType = static_cast<int8_t>(alp.packetType),
-        .lengthType = static_cast<int8_t>(alp.lengthType),
-        .filterSettings = filterSettings,
-    };
-    config.set<TunerFilterConfiguration::alp>(aidlAlp);
-
-    return config;
-}
-
-TunerFilterAvSettings FilterClient::getAidlAvSettings(DemuxFilterAvSettings hidlAv) {
-    TunerFilterAvSettings aidlAv{
-        .isPassthrough = hidlAv.isPassthrough,
-    };
-    return aidlAv;
-}
-
-TunerFilterSectionSettings FilterClient::getAidlSectionSettings(
-        DemuxFilterSectionSettings hidlSection) {
-    TunerFilterSectionSettings aidlSection;
-
-    switch (hidlSection.condition.getDiscriminator()) {
-        case DemuxFilterSectionSettings::Condition::hidl_discriminator::sectionBits: {
-            TunerFilterSectionBits sectionBits;
-            auto hidlSectionBits = hidlSection.condition.sectionBits();
-            sectionBits.filter.resize(hidlSectionBits.filter.size());
-            sectionBits.mask.resize(hidlSectionBits.mask.size());
-            sectionBits.mode.resize(hidlSectionBits.mode.size());
-            copy(hidlSectionBits.filter.begin(), hidlSectionBits.filter.end(),
-                    sectionBits.filter.begin());
-            copy(hidlSectionBits.mask.begin(), hidlSectionBits.mask.end(),
-                    sectionBits.mask.begin());
-            copy(hidlSectionBits.mode.begin(), hidlSectionBits.mode.end(),
-                    sectionBits.mode.begin());
-            aidlSection.condition.set<TunerFilterSectionCondition::sectionBits>(sectionBits);
-            break;
-        }
-        case DemuxFilterSectionSettings::Condition::hidl_discriminator::tableInfo: {
-            TunerFilterSectionTableInfo tableInfo{
-                .tableId = static_cast<char16_t>(hidlSection.condition.tableInfo().tableId),
-                .version = static_cast<char16_t>(hidlSection.condition.tableInfo().version),
-            };
-            aidlSection.condition.set<TunerFilterSectionCondition::tableInfo>(tableInfo);
-            break;
-        }
-    }
-    aidlSection.isCheckCrc = hidlSection.isCheckCrc;
-    aidlSection.isRepeat = hidlSection.isRepeat;
-    aidlSection.isRaw = hidlSection.isRaw;
-    return aidlSection;
-}
-
-TunerFilterPesDataSettings FilterClient::getAidlPesDataSettings(
-        DemuxFilterPesDataSettings hidlPesData) {
-    TunerFilterPesDataSettings aidlPesData{
-        .streamId = static_cast<char16_t>(hidlPesData.streamId),
-        .isRaw = hidlPesData.isRaw,
-    };
-    return aidlPesData;
-}
-
-TunerFilterRecordSettings FilterClient::getAidlRecordSettings(
-        DemuxFilterRecordSettings hidlRecord) {
-    TunerFilterScIndexMask mask;
-    switch (hidlRecord.scIndexMask.getDiscriminator()) {
-        case DemuxFilterRecordSettings::ScIndexMask::hidl_discriminator::sc: {
-            mask.set<TunerFilterScIndexMask::sc>(hidlRecord.scIndexMask.sc());
-            break;
-        }
-        case DemuxFilterRecordSettings::ScIndexMask::hidl_discriminator::scHevc: {
-            mask.set<TunerFilterScIndexMask::scHevc>(hidlRecord.scIndexMask.scHevc());
-            break;
-        }
-        default:
-            break;
-    }
-    TunerFilterRecordSettings aidlRecord{
-        .tsIndexMask = static_cast<int32_t>(hidlRecord.tsIndexMask),
-        .scIndexType = static_cast<int32_t>(hidlRecord.scIndexType),
-        .scIndexMask = mask,
-    };
-    return aidlRecord;
-}
-
-TunerFilterDownloadSettings FilterClient::getAidlDownloadSettings(
-        DemuxFilterDownloadSettings hidlDownload) {
-    TunerFilterDownloadSettings aidlDownload{
-        .downloadId = static_cast<int32_t>(hidlDownload.downloadId),
-    };
-    return aidlDownload;
-}
-
-void TunerFilterCallback::getHidlFilterEvent(const vector<TunerFilterEvent>& filterEvents,
-        DemuxFilterEvent& event, DemuxFilterEventExt& eventExt) {
-    switch (filterEvents[0].getTag()) {
-        case  TunerFilterEvent::media: {
-            getHidlMediaEvent(filterEvents, event);
-            break;
-        }
-        case  TunerFilterEvent::section: {
-            getHidlSectionEvent(filterEvents, event);
-            break;
-        }
-        case  TunerFilterEvent::pes: {
-            getHidlPesEvent(filterEvents, event);
-            break;
-        }
-        case  TunerFilterEvent::tsRecord: {
-            getHidlTsRecordEvent(filterEvents, event, eventExt);
-            break;
-        }
-        case  TunerFilterEvent::mmtpRecord: {
-            getHidlMmtpRecordEvent(filterEvents, event, eventExt);
-            break;
-        }
-        case  TunerFilterEvent::download: {
-            getHidlDownloadEvent(filterEvents, event);
-            break;
-        }
-        case  TunerFilterEvent::ipPayload: {
-            getHidlIpPayloadEvent(filterEvents, event);
-            break;
-        }
-        case  TunerFilterEvent::temi: {
-            getHidlTemiEvent(filterEvents, event);
-            break;
-        }
-        case  TunerFilterEvent::monitor: {
-            getHidlMonitorEvent(filterEvents, eventExt);
-            break;
-        }
-        case  TunerFilterEvent::startId: {
-            getHidlRestartEvent(filterEvents, eventExt);
-            break;
-        }
-    }
-}
-
-void TunerFilterCallback::getHidlMediaEvent(
-        const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event) {
-    event.events.resize(filterEvents.size());
-    for (int i = 0; i < filterEvents.size(); i++) {
-        hidl_handle handle = hidl_handle(makeFromAidl(filterEvents[i]
-                .get<TunerFilterEvent::media>().avMemory));
-        event.events[i].media({
-            .avMemory = handle,
-            .streamId = static_cast<DemuxStreamId>(filterEvents[i]
-                    .get<TunerFilterEvent::media>().streamId),
-            .isPtsPresent = filterEvents[i]
-                    .get<TunerFilterEvent::media>().isPtsPresent,
-            .pts = static_cast<uint64_t>(filterEvents[i]
-                    .get<TunerFilterEvent::media>().pts),
-            .dataLength = static_cast<uint32_t>(filterEvents[i]
-                    .get<TunerFilterEvent::media>().dataLength),
-            .offset = static_cast<uint32_t>(filterEvents[i]
-                    .get<TunerFilterEvent::media>().offset),
-            .isSecureMemory = filterEvents[i]
-                    .get<TunerFilterEvent::media>().isSecureMemory,
-            .avDataId = static_cast<uint64_t>(filterEvents[i]
-                    .get<TunerFilterEvent::media>().avDataId),
-            .mpuSequenceNumber = static_cast<uint32_t>(filterEvents[i]
-                    .get<TunerFilterEvent::media>().offset),
-            .isPesPrivateData = filterEvents[i]
-                    .get<TunerFilterEvent::media>().isPesPrivateData,
-        });
-
-        if (filterEvents[i].get<TunerFilterEvent::media>().isAudioExtraMetaData) {
-            event.events[i].media().extraMetaData.audio({
-                .adFade = static_cast<uint8_t>(filterEvents[i]
-                        .get<TunerFilterEvent::media>().audio.adFade),
-                .adPan = static_cast<uint8_t>(filterEvents[i]
-                        .get<TunerFilterEvent::media>().audio.adPan),
-                .versionTextTag = static_cast<uint8_t>(filterEvents[i]
-                        .get<TunerFilterEvent::media>().audio.versionTextTag),
-                .adGainCenter = static_cast<uint8_t>(filterEvents[i]
-                        .get<TunerFilterEvent::media>().audio.adGainCenter),
-                .adGainFront = static_cast<uint8_t>(filterEvents[i]
-                        .get<TunerFilterEvent::media>().audio.adGainFront),
-                .adGainSurround = static_cast<uint8_t>(filterEvents[i]
-                        .get<TunerFilterEvent::media>().audio.adGainSurround),
-            });
-        } else {
-            event.events[i].media().extraMetaData.noinit();
-        }
-    }
-}
-
-void TunerFilterCallback::getHidlSectionEvent(
-        const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event) {
-    event.events.resize(filterEvents.size());
-    for (int i = 0; i < filterEvents.size(); i++) {
-        auto section = filterEvents[i].get<TunerFilterEvent::section>();
-        event.events[i].section({
-            .tableId = static_cast<uint16_t>(section.tableId),
-            .version = static_cast<uint16_t>(section.version),
-            .sectionNum = static_cast<uint16_t>(section.sectionNum),
-            .dataLength = static_cast<uint16_t>(section.dataLength),
-        });
-    }
-}
-
-void TunerFilterCallback::getHidlPesEvent(
-        const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event) {
-    event.events.resize(filterEvents.size());
-    for (int i = 0; i < filterEvents.size(); i++) {
-        auto pes = filterEvents[i].get<TunerFilterEvent::pes>();
-        event.events[i].pes({
-            .streamId = static_cast<DemuxStreamId>(pes.streamId),
-            .dataLength = static_cast<uint16_t>(pes.dataLength),
-            .mpuSequenceNumber = static_cast<uint32_t>(pes.mpuSequenceNumber),
-        });
-    }
-}
-
-void TunerFilterCallback::getHidlTsRecordEvent(const vector<TunerFilterEvent>& filterEvents,
-        DemuxFilterEvent& event, DemuxFilterEventExt& eventExt) {
-    event.events.resize(filterEvents.size());
-    eventExt.events.resize(filterEvents.size());
-    for (int i = 0; i < filterEvents.size(); i++) {
-        auto ts = filterEvents[i].get<TunerFilterEvent::tsRecord>();
-        event.events[i].tsRecord({
-            .tsIndexMask = static_cast<uint32_t>(ts.tsIndexMask),
-            .byteNumber = static_cast<uint64_t>(ts.byteNumber),
-        });
-        event.events[i].tsRecord().pid.tPid(static_cast<DemuxTpid>(ts.pid));
-
-        switch (ts.scIndexMask.getTag()) {
-            case TunerFilterScIndexMask::sc: {
-                event.events[i].tsRecord().scIndexMask.sc(
-                        ts.scIndexMask.get<TunerFilterScIndexMask::sc>());
-                break;
-            }
-            case TunerFilterScIndexMask::scHevc: {
-                event.events[i].tsRecord().scIndexMask.scHevc(
-                        ts.scIndexMask.get<TunerFilterScIndexMask::scHevc>());
-                break;
-            }
-            default:
-                break;
-        }
-
-        if (ts.isExtended) {
-            eventExt.events[i].tsRecord({
-                .pts = static_cast<uint64_t>(ts.pts),
-                .firstMbInSlice = static_cast<uint32_t>(ts.firstMbInSlice),
-            });
-        } else {
-            eventExt.events[i].noinit();
-        }
-    }
-}
-
-void TunerFilterCallback::getHidlMmtpRecordEvent(const vector<TunerFilterEvent>& filterEvents,
-        DemuxFilterEvent& event, DemuxFilterEventExt& eventExt) {
-    event.events.resize(filterEvents.size());
-    eventExt.events.resize(filterEvents.size());
-    for (int i = 0; i < filterEvents.size(); i++) {
-        auto mmtp = filterEvents[i].get<TunerFilterEvent::mmtpRecord>();
-        event.events[i].mmtpRecord({
-            .scHevcIndexMask = static_cast<uint32_t>(mmtp.scHevcIndexMask),
-            .byteNumber = static_cast<uint64_t>(mmtp.byteNumber),
-        });
-
-        if (mmtp.isExtended) {
-            eventExt.events[i].mmtpRecord({
-                .pts = static_cast<uint64_t>(mmtp.pts),
-                .mpuSequenceNumber = static_cast<uint32_t>(mmtp.mpuSequenceNumber),
-                .firstMbInSlice = static_cast<uint32_t>(mmtp.firstMbInSlice),
-                .tsIndexMask = static_cast<uint32_t>(mmtp.tsIndexMask),
-            });
-        } else {
-            eventExt.events[i].noinit();
-        }
-    }
-}
-
-void TunerFilterCallback::getHidlDownloadEvent(const vector<TunerFilterEvent>& filterEvents,
-        DemuxFilterEvent& event) {
-    event.events.resize(filterEvents.size());
-    for (int i = 0; i < filterEvents.size(); i++) {
-        auto download = filterEvents[i].get<TunerFilterEvent::download>();
-        event.events[i].download({
-            .itemId = static_cast<uint32_t>(download.itemId),
-            .mpuSequenceNumber = static_cast<uint32_t>(download.mpuSequenceNumber),
-            .itemFragmentIndex = static_cast<uint32_t>(download.itemFragmentIndex),
-            .lastItemFragmentIndex = static_cast<uint32_t>(download.lastItemFragmentIndex),
-            .dataLength = static_cast<uint16_t>(download.dataLength),
-        });
-    }
-}
-
-void TunerFilterCallback::getHidlIpPayloadEvent(const vector<TunerFilterEvent>& filterEvents,
-        DemuxFilterEvent& event) {
-    event.events.resize(filterEvents.size());
-    for (int i = 0; i < filterEvents.size(); i++) {
-        auto ip = filterEvents[i].get<TunerFilterEvent::ipPayload>();
-        event.events[i].ipPayload({
-            .dataLength = static_cast<uint16_t>(ip.dataLength),
-        });
-    }
-}
-
-void TunerFilterCallback::getHidlTemiEvent(const vector<TunerFilterEvent>& filterEvents,
-        DemuxFilterEvent& event) {
-    event.events.resize(filterEvents.size());
-    for (int i = 0; i < filterEvents.size(); i++) {
-        auto temi = filterEvents[i].get<TunerFilterEvent::temi>();
-        event.events[i].temi({
-            .pts = static_cast<uint64_t>(temi.pts),
-            .descrTag = static_cast<uint8_t>(temi.descrTag),
-        });
-        hidl_vec<uint8_t> descrData(temi.descrData.begin(), temi.descrData.end());
-        event.events[i].temi().descrData = descrData;
-    }
-}
-
-void TunerFilterCallback::getHidlMonitorEvent(const vector<TunerFilterEvent>& filterEvents,
-        DemuxFilterEventExt& eventExt) {
-    auto monitor = filterEvents[0].get<TunerFilterEvent::monitor>();
-    eventExt.events.resize(1);
-    DemuxFilterMonitorEvent monitorEvent;
-    switch (monitor.getTag()) {
-        case TunerFilterMonitorEvent::scramblingStatus: {
-            monitorEvent.scramblingStatus(static_cast<ScramblingStatus>(monitor.scramblingStatus));
-            eventExt.events[0].monitorEvent(monitorEvent);
-            break;
-        }
-        case TunerFilterMonitorEvent::cid: {
-            monitorEvent.cid(static_cast<uint32_t>(monitor.cid));
-            eventExt.events[0].monitorEvent(monitorEvent);
-            break;
-        }
-    }
-}
-
-void TunerFilterCallback::getHidlRestartEvent(const vector<TunerFilterEvent>& filterEvents,
-        DemuxFilterEventExt& eventExt) {
-    uint32_t startId = filterEvents[0].get<TunerFilterEvent::startId>();
-    eventExt.events.resize(1);
-    eventExt.events[0].startId(static_cast<uint32_t>(startId));
+    return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
 }
 
 Result FilterClient::getFilterMq() {
@@ -931,39 +224,21 @@
 
     if (mTunerFilter != NULL) {
         Status s = mTunerFilter->getQueueDesc(&aidlMqDesc);
-        res = ClientHelper::getServiceSpecificErrorCode(s);
-        if (res == Result::SUCCESS) {
+        if (s.isOk()) {
             mFilterMQ = new (nothrow) AidlMQ(aidlMqDesc, false/*resetPointer*/);
             EventFlag::createEventFlag(mFilterMQ->getEventFlagWord(), &mFilterMQEventFlag);
         }
-        return res;
-    }
-
-    if (mFilter != NULL) {
-        MQDescriptorSync<uint8_t> filterMQDesc;
-        mFilter->getQueueDesc(
-                [&](Result r, const MQDescriptorSync<uint8_t>& desc) {
-                    filterMQDesc = desc;
-                    res = r;
-                });
-        if (res == Result::SUCCESS) {
-            AidlMQDesc aidlMQDesc;
-            unsafeHidlToAidlMQDescriptor<uint8_t, int8_t, SynchronizedReadWrite>(
-                    filterMQDesc,  &aidlMQDesc);
-            mFilterMQ = new (nothrow) AidlMessageQueue(aidlMQDesc, false/*resetPointer*/);
-            EventFlag::createEventFlag(mFilterMQ->getEventFlagWord(), &mFilterMQEventFlag);
-        }
     }
 
     return res;
 }
 
-int FilterClient::copyData(int8_t* buffer, int size) {
-    if (mFilterMQ == NULL || mFilterMQEventFlag == NULL) {
+int64_t FilterClient::copyData(int8_t* buffer, int64_t size) {
+    if (mFilterMQ == nullptr || mFilterMQEventFlag == nullptr) {
         return -1;
     }
 
-    int available = mFilterMQ->availableToRead();
+    int64_t available = mFilterMQ->availableToRead();
     size = min(size, available);
 
     if (mFilterMQ->read(buffer, size)) {
@@ -977,16 +252,18 @@
 
 void FilterClient::checkIsMediaFilter(DemuxFilterType type) {
     if (type.mainType == DemuxFilterMainType::MMTP) {
-        if (type.subType.mmtpFilterType() == DemuxMmtpFilterType::AUDIO ||
-                type.subType.mmtpFilterType() == DemuxMmtpFilterType::VIDEO) {
+        if (type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>() ==
+                    DemuxMmtpFilterType::AUDIO ||
+            type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>() ==
+                    DemuxMmtpFilterType::VIDEO) {
             mIsMediaFilter = true;
             return;
         }
     }
 
     if (type.mainType == DemuxFilterMainType::TS) {
-        if (type.subType.tsFilterType() == DemuxTsFilterType::AUDIO ||
-                type.subType.tsFilterType() == DemuxTsFilterType::VIDEO) {
+        if (type.subType.get<DemuxFilterSubType::Tag::tsFilterType>() == DemuxTsFilterType::AUDIO ||
+            type.subType.get<DemuxFilterSubType::Tag::tsFilterType>() == DemuxTsFilterType::VIDEO) {
             mIsMediaFilter = true;
             return;
         }
@@ -1001,15 +278,19 @@
         return;
     }
 
-    if (configure.getDiscriminator() == DemuxFilterSettings::hidl_discriminator::ts) {
-        if (configure.ts().filterSettings.av().isPassthrough) {
+    if (configure.getTag() == DemuxFilterSettings::Tag::ts) {
+        if (configure.get<DemuxFilterSettings::Tag::ts>()
+                    .filterSettings.get<DemuxTsFilterSettingsFilterSettings::Tag::av>()
+                    .isPassthrough) {
             mIsPassthroughFilter = true;
             return;
         }
     }
 
-    if (configure.getDiscriminator() == DemuxFilterSettings::hidl_discriminator::mmtp) {
-        if (configure.mmtp().filterSettings.av().isPassthrough) {
+    if (configure.getTag() == DemuxFilterSettings::Tag::mmtp) {
+        if (configure.get<DemuxFilterSettings::Tag::mmtp>()
+                    .filterSettings.get<DemuxMmtpFilterSettingsFilterSettings::Tag::av>()
+                    .isPassthrough) {
             mIsPassthroughFilter = true;
             return;
         }
@@ -1019,37 +300,28 @@
 }
 
 void FilterClient::handleAvShareMemory() {
-    if (mAvSharedHandle != NULL) {
+    if (mAvSharedHandle != nullptr) {
         return;
     }
-    if (mTunerFilter != NULL && mIsMediaFilter && !mIsPassthroughFilter) {
-        TunerFilterSharedHandleInfo aidlHandleInfo;
-        Status s = mTunerFilter->getAvSharedHandleInfo(&aidlHandleInfo);
-        if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) {
-            mAvSharedHandle = native_handle_clone(makeFromAidl(aidlHandleInfo.handle));
-            mAvSharedMemSize = aidlHandleInfo.size;
+    if (mTunerFilter != nullptr && mIsMediaFilter && !mIsPassthroughFilter) {
+        int64_t size;
+        NativeHandle avMemory;
+        Status s = mTunerFilter->getAvSharedHandle(&avMemory, &size);
+        if (s.isOk()) {
+            mAvSharedHandle = native_handle_clone(makeFromAidl(avMemory));
+            mAvSharedMemSize = size;
         }
-        return;
-    }
-
-    if (mFilter_1_1 != NULL && mIsMediaFilter && !mIsPassthroughFilter) {
-        mFilter_1_1->getAvSharedHandle([&](Result r, hidl_handle avMemory, uint64_t avMemSize) {
-            if (r == Result::SUCCESS) {
-                mAvSharedHandle = native_handle_clone(avMemory.getNativeHandle());
-                mAvSharedMemSize = avMemSize;
-            }
-        });
     }
 }
 
 void FilterClient::closeAvSharedMemory() {
-    if (mAvSharedHandle == NULL) {
+    if (mAvSharedHandle == nullptr) {
         mAvSharedMemSize = 0;
         return;
     }
     native_handle_close(mAvSharedHandle);
     native_handle_delete(mAvSharedHandle);
     mAvSharedMemSize = 0;
-    mAvSharedHandle = NULL;
+    mAvSharedHandle = nullptr;
 }
 }  // namespace android
diff --git a/media/jni/tuner/FilterClient.h b/media/jni/tuner/FilterClient.h
index 5d78bfd..136d1f5 100644
--- a/media/jni/tuner/FilterClient.h
+++ b/media/jni/tuner/FilterClient.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,64 +17,30 @@
 #ifndef _ANDROID_MEDIA_TV_FILTER_CLIENT_H_
 #define _ANDROID_MEDIA_TV_FILTER_CLIENT_H_
 
-#include <aidl/android/media/tv/tuner/ITunerFilter.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterType.h>
 #include <aidl/android/media/tv/tuner/BnTunerFilterCallback.h>
-#include <aidl/android/media/tv/tuner/TunerFilterEvent.h>
-#include <aidl/android/media/tv/tuner/TunerFilterSettings.h>
-#include <aidlcommonsupport/NativeHandle.h>
-#include <android/hardware/tv/tuner/1.1/IFilter.h>
-#include <android/hardware/tv/tuner/1.1/IFilterCallback.h>
-#include <android/hardware/tv/tuner/1.1/types.h>
+#include <aidl/android/media/tv/tuner/ITunerFilter.h>
 #include <fmq/AidlMessageQueue.h>
-#include <fmq/MessageQueue.h>
 
 #include "ClientHelper.h"
 #include "FilterClientCallback.h"
 
 using Status = ::ndk::ScopedAStatus;
+using ::aidl::android::hardware::common::fmq::MQDescriptor;
 using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
+using ::aidl::android::hardware::tv::tuner::AvStreamType;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterEvent;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterSettings;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterStatus;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterType;
 using ::aidl::android::media::tv::tuner::BnTunerFilterCallback;
 using ::aidl::android::media::tv::tuner::ITunerFilter;
-using ::aidl::android::media::tv::tuner::TunerDemuxIpAddress;
-using ::aidl::android::media::tv::tuner::TunerFilterAvSettings;
-using ::aidl::android::media::tv::tuner::TunerFilterConfiguration;
-using ::aidl::android::media::tv::tuner::TunerFilterDownloadSettings;
-using ::aidl::android::media::tv::tuner::TunerFilterEvent;
-using ::aidl::android::media::tv::tuner::TunerFilterPesDataSettings;
-using ::aidl::android::media::tv::tuner::TunerFilterRecordSettings;
-using ::aidl::android::media::tv::tuner::TunerFilterSectionSettings;
-using ::aidl::android::media::tv::tuner::TunerFilterSettings;
-
 using ::android::hardware::EventFlag;
-using ::android::hardware::MessageQueue;
-using ::android::hardware::MQDescriptorSync;
-using ::android::hardware::Return;
-using ::android::hardware::Void;
-using ::android::hardware::hidl_handle;
-using ::android::hardware::tv::tuner::V1_0::DemuxAlpFilterSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxMmtpFilterSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterDownloadSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterPesDataSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterRecordSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterSectionSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterType;
-using ::android::hardware::tv::tuner::V1_0::DemuxIpAddress;
-using ::android::hardware::tv::tuner::V1_0::DemuxIpFilterSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxTlvFilterSettings;
-using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings;
-using ::android::hardware::tv::tuner::V1_0::IFilter;
-using ::android::hardware::tv::tuner::V1_0::Result;
-using ::android::hardware::tv::tuner::V1_1::AvStreamType;
-using ::android::hardware::tv::tuner::V1_1::IFilterCallback;
 
 using namespace std;
 
 namespace android {
 
-using MQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
-using MQDesc = MQDescriptorSync<uint8_t>;
 using AidlMQ = AidlMessageQueue<int8_t, SynchronizedReadWrite>;
 using AidlMQDesc = MQDescriptor<int8_t, SynchronizedReadWrite>;
 
@@ -84,47 +50,10 @@
 };
 
 class TunerFilterCallback : public BnTunerFilterCallback {
-
 public:
     TunerFilterCallback(sp<FilterClientCallback> filterClientCallback);
-    Status onFilterStatus(int status);
-    Status onFilterEvent(const vector<TunerFilterEvent>& filterEvents);
-
-private:
-    void getHidlFilterEvent(const vector<TunerFilterEvent>& filterEvents,
-            DemuxFilterEvent& event, DemuxFilterEventExt& eventExt);
-    void getHidlMediaEvent(
-            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
-    void getHidlSectionEvent(
-            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
-    void getHidlPesEvent(
-            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
-    void getHidlTsRecordEvent(const vector<TunerFilterEvent>& filterEvents,
-            DemuxFilterEvent& event, DemuxFilterEventExt& eventExt);
-    void getHidlMmtpRecordEvent(const vector<TunerFilterEvent>& filterEvents,
-            DemuxFilterEvent& event, DemuxFilterEventExt& eventExt);
-    void getHidlDownloadEvent(
-            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
-    void getHidlIpPayloadEvent(
-            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
-    void getHidlTemiEvent(
-            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
-    void getHidlMonitorEvent(
-            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEventExt& eventExt);
-    void getHidlRestartEvent(
-            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEventExt& eventExt);
-
-    sp<FilterClientCallback> mFilterClientCallback;
-};
-
-struct HidlFilterCallback : public IFilterCallback {
-
-public:
-    HidlFilterCallback(sp<FilterClientCallback> filterClientCallback);
-    virtual Return<void> onFilterEvent_1_1(const DemuxFilterEvent& filterEvent,
-            const DemuxFilterEventExt& filterEventExt);
-    virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent);
-    virtual Return<void> onFilterStatus(const DemuxFilterStatus status);
+    Status onFilterStatus(DemuxFilterStatus status);
+    Status onFilterEvent(const vector<DemuxFilterEvent>& filterEvents);
 
 private:
     sp<FilterClientCallback> mFilterClientCallback;
@@ -136,15 +65,12 @@
     FilterClient(DemuxFilterType type, shared_ptr<ITunerFilter> tunerFilter);
     ~FilterClient();
 
-    // TODO: remove after migration to Tuner Service is done.
-    void setHidlFilter(sp<IFilter> filter);
-
     /**
      * Read size of data from filter FMQ into buffer.
      *
      * @return the actual reading size. -1 if failed to read.
      */
-    int read(int8_t* buffer, int size);
+    int64_t read(int8_t* buffer, int64_t size);
 
     /**
      * Get the a/v shared memory handle information
@@ -159,12 +85,12 @@
     /**
      * Configure the monitor event of the Filter.
      */
-    Result configureMonitorEvent(int monitorEventType);
+    Result configureMonitorEvent(int32_t monitorEventType);
 
     /**
      * Configure the context id of the IP Filter.
      */
-    Result configureIpFilterContextId(int cid);
+    Result configureIpFilterContextId(int32_t cid);
 
     /**
      * Configure the stream type of the media Filter.
@@ -189,12 +115,12 @@
     /**
      * Get the 32-bit filter Id.
      */
-    Result getId(uint32_t& id);
+    Result getId(int32_t& id);
 
     /**
      * Get the 64-bit filter Id.
      */
-    Result getId64Bit(uint64_t& id);
+    Result getId64Bit(int64_t& id);
 
     /**
      * Release the handle reported by the HAL for AV memory.
@@ -207,11 +133,6 @@
     Result setDataSource(sp<FilterClient> filterClient);
 
     /**
-     * Get the Hal filter to build up filter linkage.
-     */
-    sp<IFilter> getHalFilter() { return mFilter; }
-
-    /**
      * Get the Aidl filter to build up filter linkage.
      */
     shared_ptr<ITunerFilter> getAidlFilter() { return mTunerFilter; }
@@ -222,24 +143,8 @@
     Result close();
 
 private:
-    TunerFilterConfiguration getAidlFilterSettings(DemuxFilterSettings configure);
-
-    TunerFilterConfiguration getAidlTsSettings(DemuxTsFilterSettings configure);
-    TunerFilterConfiguration getAidlMmtpSettings(DemuxMmtpFilterSettings mmtp);
-    TunerFilterConfiguration getAidlIpSettings(DemuxIpFilterSettings ip);
-    TunerFilterConfiguration getAidlTlvSettings(DemuxTlvFilterSettings tlv);
-    TunerFilterConfiguration getAidlAlpSettings(DemuxAlpFilterSettings alp);
-
-    TunerFilterAvSettings getAidlAvSettings(DemuxFilterAvSettings hidlAv);
-    TunerFilterSectionSettings getAidlSectionSettings(DemuxFilterSectionSettings hidlSection);
-    TunerFilterPesDataSettings getAidlPesDataSettings(DemuxFilterPesDataSettings hidlPesData);
-    TunerFilterRecordSettings getAidlRecordSettings(DemuxFilterRecordSettings hidlRecord);
-    TunerFilterDownloadSettings getAidlDownloadSettings(DemuxFilterDownloadSettings hidlDownload);
-
-    void getAidlIpAddress(DemuxIpAddress ipAddr,
-            TunerDemuxIpAddress& srcIpAddress, TunerDemuxIpAddress& dstIpAddress);
     Result getFilterMq();
-    int copyData(int8_t* buffer, int size);
+    int64_t copyData(int8_t* buffer, int64_t size);
     void checkIsMediaFilter(DemuxFilterType type);
     void checkIsPassthroughFilter(DemuxFilterSettings configure);
     void handleAvShareMemory();
@@ -251,22 +156,8 @@
      */
     shared_ptr<ITunerFilter> mTunerFilter;
 
-    /**
-     * A 1.0 Filter HAL interface that is ready before migrating to the TunerFilter.
-     * This is a temprary interface before Tuner Framework migrates to use TunerService.
-     * Default null when the HAL service does not exist.
-     */
-    sp<IFilter> mFilter;
-
-    /**
-     * A 1.1 Filter HAL interface that is ready before migrating to the TunerFilter.
-     * This is a temprary interface before Tuner Framework migrates to use TunerService.
-     * Default null when the HAL service does not exist.
-     */
-    sp<::android::hardware::tv::tuner::V1_1::IFilter> mFilter_1_1;
-
-    AidlMQ* mFilterMQ = NULL;
-    EventFlag* mFilterMQEventFlag = NULL;
+    AidlMQ* mFilterMQ = nullptr;
+    EventFlag* mFilterMQEventFlag = nullptr;
 
     native_handle_t* mAvSharedHandle;
     uint64_t mAvSharedMemSize;
diff --git a/media/jni/tuner/FilterClientCallback.h b/media/jni/tuner/FilterClientCallback.h
index 94b7821..05e7ff0 100644
--- a/media/jni/tuner/FilterClientCallback.h
+++ b/media/jni/tuner/FilterClientCallback.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,20 +17,21 @@
 #ifndef _ANDROID_MEDIA_TV_FILTER_CLIENT_CALLBACK_H_
 #define _ANDROID_MEDIA_TV_FILTER_CLIENT_CALLBACK_H_
 
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
-using ::android::hardware::tv::tuner::V1_0::DemuxFilterStatus;
-using ::android::hardware::tv::tuner::V1_1::DemuxFilterEventExt;
+#include <aidl/android/hardware/tv/tuner/DemuxFilterEvent.h>
+#include <aidl/android/hardware/tv/tuner/DemuxFilterStatus.h>
+#include <utils/RefBase.h>
+
+using ::aidl::android::hardware::tv::tuner::DemuxFilterEvent;
+using ::aidl::android::hardware::tv::tuner::DemuxFilterStatus;
 
 using namespace std;
 
 namespace android {
 
 struct FilterClientCallback : public RefBase {
-    virtual void onFilterEvent_1_1(const DemuxFilterEvent& filterEvent,
-            const DemuxFilterEventExt& filterEventExt);
-    virtual void onFilterEvent(const DemuxFilterEvent& filterEvent);
+    virtual void onFilterEvent(const vector<DemuxFilterEvent>& filterEvents);
     virtual void onFilterStatus(const DemuxFilterStatus status);
 };
 }  // namespace android
 
-#endif  // _ANDROID_MEDIA_TV_FILTER_CLIENT_CALLBACK_H_
\ No newline at end of file
+#endif // _ANDROID_MEDIA_TV_FILTER_CLIENT_CALLBACK_H_
diff --git a/media/jni/tuner/FrontendClient.cpp b/media/jni/tuner/FrontendClient.cpp
index 5d9b12d..70309a0 100644
--- a/media/jni/tuner/FrontendClient.cpp
+++ b/media/jni/tuner/FrontendClient.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,1235 +16,168 @@
 
 #define LOG_TAG "FrontendClient"
 
+#include "FrontendClient.h"
+
+#include <aidl/android/hardware/tv/tuner/Constant.h>
 #include <android-base/logging.h>
 #include <utils/Log.h>
 
-#include "FrontendClient.h"
-
-using ::aidl::android::media::tv::tuner::TunerFrontendScanAtsc3PlpInfo;
-using ::aidl::android::media::tv::tuner::TunerFrontendUnionSettings;
-
-using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard;
-using ::android::hardware::tv::tuner::V1_0::FrontendAnalogType;
-using ::android::hardware::tv::tuner::V1_0::FrontendAtscModulation;
-using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Bandwidth;
-using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation;
-using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3TimeInterleaveMode;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSpectralInversion;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbsRolloff;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
-using ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
-using ::android::hardware::tv::tuner::V1_0::FrontendInnerFec;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsRolloff;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Rolloff;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode;
-using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation;
-using ::android::hardware::tv::tuner::V1_0::FrontendModulationStatus;
-using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo;
-using ::android::hardware::tv::tuner::V1_0::FrontendStatusAtsc3PlpInfo;
-using ::android::hardware::tv::tuner::V1_0::LnbVoltage;
-using ::android::hardware::tv::tuner::V1_1::Constant;
-using ::android::hardware::tv::tuner::V1_1::FrontendBandwidth;
-using ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode;
-using ::android::hardware::tv::tuner::V1_1::FrontendDtmbBandwidth;
-using ::android::hardware::tv::tuner::V1_1::FrontendDtmbGuardInterval;
-using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation;
-using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTimeInterleaveMode;
-using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode;
-using ::android::hardware::tv::tuner::V1_1::FrontendDvbcBandwidth;
-using ::android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation;
-using ::android::hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode;
-using ::android::hardware::tv::tuner::V1_1::FrontendGuardInterval;
-using ::android::hardware::tv::tuner::V1_1::FrontendInterleaveMode;
-using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
-using ::android::hardware::tv::tuner::V1_1::FrontendRollOff;
-using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;
-using ::android::hardware::tv::tuner::V1_1::FrontendTransmissionMode;
-using ::android::hardware::tv::tuner::V1_1::FrontendType;
+using ::aidl::android::hardware::tv::tuner::Constant;
 
 namespace android {
-
 /////////////// FrontendClient ///////////////////////
-
-FrontendClient::FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int type) {
+FrontendClient::FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, FrontendType type) {
     mTunerFrontend = tunerFrontend;
     mType = type;
 }
 
 FrontendClient::~FrontendClient() {
-    mTunerFrontend = NULL;
-    mFrontend = NULL;
-    mFrontend_1_1 = NULL;
-    mId = -1;
-    mType = -1;
+    mTunerFrontend = nullptr;
+    mType = FrontendType::UNDEFINED;
 }
 
 Result FrontendClient::setCallback(sp<FrontendClientCallback> frontendClientCallback) {
-    if (mTunerFrontend != NULL) {
+    if (mTunerFrontend != nullptr) {
         shared_ptr<TunerFrontendCallback> aidlCallback =
                 ::ndk::SharedRefBase::make<TunerFrontendCallback>(frontendClientCallback);
-        aidlCallback->setFrontendType(mType);
         Status s = mTunerFrontend->setCallback(aidlCallback);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    sp<HidlFrontendCallback> hidlCallback = new HidlFrontendCallback(frontendClientCallback);
-    return mFrontend->setCallback(hidlCallback);
+    return Result::INVALID_STATE;
 }
 
-void FrontendClient::setHidlFrontend(sp<IFrontend> frontend) {
-    mFrontend = frontend;
-    mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend);
-}
-
-// TODO: move after migration is done
-void FrontendClient::setId(int id) {
-    mId = id;
-}
-
-Result FrontendClient::tune(const FrontendSettings& settings,
-        const FrontendSettingsExt1_1& settingsExt1_1) {
-    if (mTunerFrontend != NULL) {
-        TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1);
-        Status s = mTunerFrontend->tune(tunerFeSettings);
+Result FrontendClient::tune(const FrontendSettings& settings) {
+    if (mTunerFrontend != nullptr) {
+        Status s = mTunerFrontend->tune(settings);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    Result result;
-    if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) {
-        result = mFrontend_1_1->tune_1_1(settings, settingsExt1_1);
-        return result;
-    }
-
-    if (mFrontend != NULL) {
-        result = mFrontend->tune(settings);
-        return result;
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result FrontendClient::stopTune() {
-    if (mTunerFrontend != NULL) {
+    if (mTunerFrontend != nullptr) {
         Status s = mTunerFrontend->stopTune();
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFrontend != NULL) {
-        Result result = mFrontend->stopTune();
-        return result;
-    }
-
     return Result::INVALID_STATE;
 }
 
-Result FrontendClient::scan(const FrontendSettings& settings, FrontendScanType type,
-        const FrontendSettingsExt1_1& settingsExt1_1) {
-    if (mTunerFrontend != NULL) {
-        TunerFrontendSettings tunerFeSettings = getAidlFrontendSettings(settings, settingsExt1_1);
-        Status s = mTunerFrontend->scan(tunerFeSettings, (int)type);
+Result FrontendClient::scan(const FrontendSettings& settings, FrontendScanType type) {
+    if (mTunerFrontend != nullptr) {
+        Status s = mTunerFrontend->scan(settings, type);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    Result result;
-    if (mFrontend_1_1 != NULL && validateExtendedSettings(settingsExt1_1)) {
-        result = mFrontend_1_1->scan_1_1(settings, type, settingsExt1_1);
-        return result;
-    }
-
-    if (mFrontend != NULL) {
-        result = mFrontend->scan(settings, type);
-        return result;
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result FrontendClient::stopScan() {
-    if (mTunerFrontend != NULL) {
+    if (mTunerFrontend != nullptr) {
         Status s = mTunerFrontend->stopScan();
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFrontend != NULL) {
-        Result result = mFrontend->stopScan();
-        return result;
-    }
-
     return Result::INVALID_STATE;
 }
 
 vector<FrontendStatus> FrontendClient::getStatus(vector<FrontendStatusType> statusTypes) {
     vector<FrontendStatus> status;
 
-    if (mTunerFrontend != NULL) {
-        vector<TunerFrontendStatus> aidlStatus;
-        vector<int> types;
-        for (auto t : statusTypes) {
-            types.push_back((int)t);
-        }
-        Status s = mTunerFrontend->getStatus(types, &aidlStatus);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return status;
-        }
-        return getHidlStatus(aidlStatus);
-    }
-
-    if (mFrontend != NULL && statusTypes.size() > 0) {
-        Result res;
-        mFrontend->getStatus(statusTypes,
-                [&](Result r, const hidl_vec<FrontendStatus>& s) {
-                    res = r;
-                    status = s;
-                });
-        if (res != Result::SUCCESS) {
-            status.clear();
-            return status;
-        }
-    }
-
-    return status;
-}
-
-vector<FrontendStatusExt1_1> FrontendClient::getStatusExtended_1_1(
-        vector<FrontendStatusTypeExt1_1> statusTypes) {
-    vector<FrontendStatusExt1_1> status;
-
-    if (mTunerFrontend != NULL) {
-        vector<TunerFrontendStatus> aidlStatus;
-        vector<int> types;
-        for (auto t : statusTypes) {
-            types.push_back((int)t);
-        }
-        Status s = mTunerFrontend->getStatusExtended_1_1(types, &aidlStatus);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return status;
-        }
-        return getHidlStatusExt(aidlStatus);
-    }
-
-    if (mFrontend_1_1 != NULL && statusTypes.size() > 0) {
-        Result res;
-        mFrontend_1_1->getStatusExt1_1(statusTypes,
-            [&](Result r, const hidl_vec<FrontendStatusExt1_1>& s) {
-                res = r;
-                status = s;
-            });
-        if (res != Result::SUCCESS) {
-            status.clear();
-            return status;
-        }
+    if (mTunerFrontend != nullptr) {
+        mTunerFrontend->getStatus(statusTypes, &status);
     }
 
     return status;
 }
 
 Result FrontendClient::setLnb(sp<LnbClient> lnbClient) {
-    if (mTunerFrontend != NULL) {
+    if (mTunerFrontend != nullptr) {
         Status s = mTunerFrontend->setLnb(lnbClient->getAidlLnb());
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFrontend != NULL) {
-        Result result = mFrontend->setLnb(lnbClient->getId());
-        return result;
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result FrontendClient::setLna(bool bEnable) {
-    if (mTunerFrontend != NULL) {
+    if (mTunerFrontend != nullptr) {
         Status s = mTunerFrontend->setLna(bEnable);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFrontend != NULL) {
-        Result result = mFrontend->setLna(bEnable);
-        return result;
-    }
-
     return Result::INVALID_STATE;
 }
 
-int FrontendClient::linkCiCamToFrontend(int ciCamId) {
-    int ltsId = (int)Constant::INVALID_LTS_ID;
+int32_t FrontendClient::linkCiCamToFrontend(int32_t ciCamId) {
+    int32_t ltsId = static_cast<int32_t>(Constant::INVALID_LTS_ID);
 
-    if (mTunerFrontend != NULL) {
+    if (mTunerFrontend != nullptr) {
         Status s = mTunerFrontend->linkCiCamToFrontend(ciCamId, &ltsId);
-        if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) {
-            return ltsId;
-        }
-        return (int)Constant::INVALID_LTS_ID;
-    }
-
-    if (mFrontend_1_1 != NULL) {
-        Result res;
-        mFrontend_1_1->linkCiCam(static_cast<uint32_t>(ciCamId),
-            [&](Result r, uint32_t id) {
-                res = r;
-                ltsId = id;
-            });
-        if (res != Result::SUCCESS) {
-            return (int)Constant::INVALID_LTS_ID;
+        if (!s.isOk()) {
+            return static_cast<int32_t>(Constant::INVALID_LTS_ID);
         }
     }
 
     return ltsId;
 }
 
-Result FrontendClient::unlinkCiCamToFrontend(int ciCamId) {
-    if (mTunerFrontend != NULL) {
+Result FrontendClient::unlinkCiCamToFrontend(int32_t ciCamId) {
+    if (mTunerFrontend != nullptr) {
         Status s = mTunerFrontend->unlinkCiCamToFrontend(ciCamId);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFrontend_1_1 != NULL) {
-        return mFrontend_1_1->unlinkCiCam(static_cast<uint32_t>(ciCamId));
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result FrontendClient::close() {
-    if (mTunerFrontend != NULL) {
+    if (mTunerFrontend != nullptr) {
         Status s = mTunerFrontend->close();
-        mTunerFrontend = NULL;
+        mTunerFrontend = nullptr;
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mFrontend != NULL) {
-        Result result = mFrontend->close();
-        mFrontend = NULL;
-        mFrontend_1_1 = NULL;
-        return result;
-    }
-
     return Result::INVALID_STATE;
 }
 
-/////////////// TunerFrontend Helper Methods ///////////////////////
-
 shared_ptr<ITunerFrontend> FrontendClient::getAidlFrontend() {
     return mTunerFrontend;
 }
 
-int FrontendClient::getId() {
-    if (mTunerFrontend != NULL) {
-        Status s = mTunerFrontend->getFrontendId(&mId);
-        if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) {
-            return mId;
-        }
-        ALOGE("Failed to getFrontendId from Tuner Frontend");
-        return -1;
-    }
-
-    if (mFrontend != NULL) {
-        return mId;
-    }
-
-    return -1;
-}
-
-vector<FrontendStatus> FrontendClient::getHidlStatus(vector<TunerFrontendStatus>& aidlStatus) {
-    vector<FrontendStatus> hidlStatus;
-    for (TunerFrontendStatus s : aidlStatus) {
-        FrontendStatus status = FrontendStatus();
-        switch (s.getTag()) {
-            case TunerFrontendStatus::isDemodLocked: {
-                status.isDemodLocked(s.get<TunerFrontendStatus::isDemodLocked>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::snr: {
-                status.snr(s.get<TunerFrontendStatus::snr>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::ber: {
-                status.ber((uint32_t)s.get<TunerFrontendStatus::ber>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::per: {
-                status.per((uint32_t)s.get<TunerFrontendStatus::per>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::preBer: {
-                status.preBer((uint32_t)s.get<TunerFrontendStatus::preBer>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::signalQuality: {
-                status.signalQuality((uint32_t)s.get<TunerFrontendStatus::signalQuality>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::signalStrength: {
-                status.signalStrength(s.get<TunerFrontendStatus::signalStrength>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::symbolRate: {
-                status.symbolRate((uint32_t)s.get<TunerFrontendStatus::symbolRate>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::innerFec: {
-                status.innerFec(static_cast<FrontendInnerFec>(
-                        s.get<TunerFrontendStatus::innerFec>()));
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::modulation: {
-                auto aidlMod = s.get<TunerFrontendStatus::modulation>();
-                FrontendModulationStatus modulation;
-                switch (mType) {
-                    case (int)FrontendType::DVBC:
-                        modulation.dvbc(static_cast<FrontendDvbcModulation>(aidlMod));
-                        status.modulation(modulation);
-                        hidlStatus.push_back(status);
-                        break;
-                    case (int)FrontendType::DVBS:
-                        modulation.dvbs(static_cast<FrontendDvbsModulation>(aidlMod));
-                        status.modulation(modulation);
-                        hidlStatus.push_back(status);
-                        break;
-                    case (int)FrontendType::ISDBS:
-                        modulation.isdbs(static_cast<FrontendIsdbsModulation>(aidlMod));
-                        status.modulation(modulation);
-                        hidlStatus.push_back(status);
-                        break;
-                    case (int)FrontendType::ISDBS3:
-                        modulation.isdbs3(static_cast<FrontendIsdbs3Modulation>(aidlMod));
-                        status.modulation(modulation);
-                        hidlStatus.push_back(status);
-                        break;
-                    case (int)FrontendType::ISDBT:
-                        modulation.isdbt(static_cast<FrontendIsdbtModulation>(aidlMod));
-                        status.modulation(modulation);
-                        hidlStatus.push_back(status);
-                        break;
-                    default:
-                        break;
-                }
-                break;
-            }
-            case TunerFrontendStatus::inversion: {
-                status.inversion(static_cast<FrontendDvbcSpectralInversion>(
-                        s.get<TunerFrontendStatus::inversion>()));
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::lnbVoltage: {
-                status.lnbVoltage(static_cast<LnbVoltage>(
-                        s.get<TunerFrontendStatus::lnbVoltage>()));
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::plpId: {
-                status.plpId((uint8_t)s.get<TunerFrontendStatus::plpId>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::isEWBS: {
-                status.isEWBS(s.get<TunerFrontendStatus::isEWBS>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::agc: {
-                status.agc((uint8_t)s.get<TunerFrontendStatus::agc>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::isLnaOn: {
-                status.isLnaOn(s.get<TunerFrontendStatus::isLnaOn>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::isLayerError: {
-                auto aidlE = s.get<TunerFrontendStatus::isLayerError>();
-                hidl_vec<bool> e(aidlE.begin(), aidlE.end());
-                status.isLayerError(e);
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::mer: {
-                status.mer(s.get<TunerFrontendStatus::mer>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::freqOffset: {
-                status.freqOffset(s.get<TunerFrontendStatus::freqOffset>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::hierarchy: {
-                status.hierarchy(static_cast<FrontendDvbtHierarchy>(
-                        s.get<TunerFrontendStatus::hierarchy>()));
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::isRfLocked: {
-                status.isRfLocked(s.get<TunerFrontendStatus::isRfLocked>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::plpInfo: {
-                int size = s.get<TunerFrontendStatus::plpInfo>().size();
-                hidl_vec<FrontendStatusAtsc3PlpInfo> info(size);
-                for (int i = 0; i < size; i++) {
-                    auto aidlInfo = s.get<TunerFrontendStatus::plpInfo>()[i];
-                    info[i] = {
-                        .plpId = (uint8_t)aidlInfo.plpId,
-                        .isLocked = aidlInfo.isLocked,
-                        .uec = (uint32_t)aidlInfo.uec,
-                    };
-                }
-                status.plpInfo(info);
-                hidlStatus.push_back(status);
-                break;
-            }
-            default:
-                break;
+int32_t FrontendClient::getId() {
+    if (mTunerFrontend != nullptr) {
+        int32_t id;
+        Status s = mTunerFrontend->getFrontendId(&id);
+        if (s.isOk()) {
+            return id;
         }
     }
-    return hidlStatus;
-}
 
-vector<FrontendStatusExt1_1> FrontendClient::getHidlStatusExt(
-        vector<TunerFrontendStatus>& aidlStatus) {
-    vector<FrontendStatusExt1_1> hidlStatus;
-    for (TunerFrontendStatus s : aidlStatus) {
-        FrontendStatusExt1_1 status;
-        switch (s.getTag()) {
-            case TunerFrontendStatus::modulations: {
-                vector<FrontendModulation> ms;
-                for (auto aidlMod : s.get<TunerFrontendStatus::modulations>()) {
-                    FrontendModulation m;
-                    switch (mType) {
-                        case (int)FrontendType::DVBC:
-                            m.dvbc(static_cast<FrontendDvbcModulation>(aidlMod));
-                            ms.push_back(m);
-                            break;
-                        case (int)FrontendType::DVBS:
-                            m.dvbs(static_cast<FrontendDvbsModulation>(aidlMod));
-                            ms.push_back(m);
-                            break;
-                        case (int)FrontendType::DVBT:
-                            m.dvbt(static_cast<FrontendDvbtConstellation>(aidlMod));
-                            ms.push_back(m);
-                            break;
-                        case (int)FrontendType::ISDBS:
-                            m.isdbs(static_cast<FrontendIsdbsModulation>(aidlMod));
-                            ms.push_back(m);
-                            break;
-                        case (int)FrontendType::ISDBS3:
-                            m.isdbs3(static_cast<FrontendIsdbs3Modulation>(aidlMod));
-                            ms.push_back(m);
-                            break;
-                        case (int)FrontendType::ISDBT:
-                            m.isdbt(static_cast<FrontendIsdbtModulation>(aidlMod));
-                            ms.push_back(m);
-                            break;
-                        case (int)FrontendType::ATSC:
-                            m.atsc(static_cast<FrontendAtscModulation>(aidlMod));
-                            ms.push_back(m);
-                            break;
-                        case (int)FrontendType::ATSC3:
-                            m.atsc3(static_cast<FrontendAtsc3Modulation>(aidlMod));
-                            ms.push_back(m);
-                            break;
-                        case (int)FrontendType::DTMB:
-                            m.dtmb(static_cast<FrontendDtmbModulation>(aidlMod));
-                            ms.push_back(m);
-                            break;
-                        default:
-                            break;
-                    }
-                }
-                if (ms.size() > 0) {
-                    status.modulations(ms);
-                    hidlStatus.push_back(status);
-                }
-                break;
-            }
-            case TunerFrontendStatus::bers: {
-                auto aidlB = s.get<TunerFrontendStatus::bers>();
-                hidl_vec<uint32_t> b(aidlB.begin(), aidlB.end());
-                status.bers(b);
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::codeRates: {
-                vector<hardware::tv::tuner::V1_1::FrontendInnerFec> codeRates;
-                for (auto aidlCodeRate : s.get<TunerFrontendStatus::codeRates>()) {
-                    codeRates.push_back(
-                            static_cast<hardware::tv::tuner::V1_1::FrontendInnerFec>(aidlCodeRate));
-                }
-                if (codeRates.size() > 0) {
-                    status.codeRates(codeRates);
-                    hidlStatus.push_back(status);
-                }
-                break;
-            }
-            case TunerFrontendStatus::bandwidth: {
-                auto aidlBand = s.get<TunerFrontendStatus::bandwidth>();
-                FrontendBandwidth band;
-                switch (mType) {
-                    case (int)FrontendType::ATSC3:
-                        band.atsc3(static_cast<FrontendAtsc3Bandwidth>(aidlBand));
-                        status.bandwidth(band);
-                        hidlStatus.push_back(status);
-                        break;
-                    case (int)FrontendType::DVBC:
-                        band.dvbc(static_cast<FrontendDvbcBandwidth>(aidlBand));
-                        status.bandwidth(band);
-                        hidlStatus.push_back(status);
-                        break;
-                    case (int)FrontendType::DVBT:
-                        band.dvbt(static_cast<FrontendDvbtBandwidth>(aidlBand));
-                        status.bandwidth(band);
-                        hidlStatus.push_back(status);
-                        break;
-                    case (int)FrontendType::ISDBT:
-                        band.isdbt(static_cast<FrontendIsdbtBandwidth>(aidlBand));
-                        status.bandwidth(band);
-                        hidlStatus.push_back(status);
-                        break;
-                    case (int)FrontendType::DTMB:
-                        band.dtmb(static_cast<FrontendDtmbBandwidth>(aidlBand));
-                        status.bandwidth(band);
-                        hidlStatus.push_back(status);
-                        break;
-                    default:
-                        break;
-                }
-                break;
-            }
-            case TunerFrontendStatus::interval: {
-                auto aidlInter = s.get<TunerFrontendStatus::interval>();
-                FrontendGuardInterval inter;
-                switch (mType) {
-                    case (int)FrontendType::DVBT:
-                        inter.dvbt(static_cast<FrontendDvbtGuardInterval>(aidlInter));
-                        status.interval(inter);
-                        hidlStatus.push_back(status);
-                        break;
-                    case (int)FrontendType::ISDBT:
-                        inter.isdbt(static_cast<FrontendIsdbtGuardInterval>(aidlInter));
-                        status.interval(inter);
-                        hidlStatus.push_back(status);
-                        break;
-                    case (int)FrontendType::DTMB:
-                        inter.dtmb(static_cast<FrontendDtmbGuardInterval>(aidlInter));
-                        status.interval(inter);
-                        hidlStatus.push_back(status);
-                        break;
-                    default:
-                        break;
-                }
-                break;
-            }
-            case TunerFrontendStatus::transmissionMode: {
-                auto aidlTran = s.get<TunerFrontendStatus::transmissionMode>();
-                FrontendTransmissionMode trans;
-                switch (mType) {
-                    case (int)FrontendType::DVBT:
-                        trans.dvbt(static_cast<FrontendDvbtTransmissionMode>(aidlTran));
-                        status.transmissionMode(trans);
-                        hidlStatus.push_back(status);
-                        break;
-                    case (int)FrontendType::ISDBT:
-                        trans.isdbt(static_cast<FrontendIsdbtMode>(aidlTran));
-                        status.transmissionMode(trans);
-                        hidlStatus.push_back(status);
-                        break;
-                    case (int)FrontendType::DTMB:
-                        trans.dtmb(static_cast<FrontendDtmbTransmissionMode>(aidlTran));
-                        status.transmissionMode(trans);
-                        hidlStatus.push_back(status);
-                        break;
-                    default:
-                        break;
-                }
-                break;
-            }
-            case TunerFrontendStatus::uec: {
-                status.uec((uint32_t)s.get<TunerFrontendStatus::uec>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::systemId: {
-                status.systemId((uint16_t)s.get<TunerFrontendStatus::systemId>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::interleaving: {
-                vector<FrontendInterleaveMode> modes;
-                for (auto aidlInter : s.get<TunerFrontendStatus::interleaving>()) {
-                    FrontendInterleaveMode mode;
-                    switch (mType) {
-                        case (int)FrontendType::DVBC:
-                            mode.dvbc(static_cast<FrontendCableTimeInterleaveMode>(aidlInter));
-                            modes.push_back(mode);
-                            break;
-                        case (int)FrontendType::ATSC3:
-                            mode.atsc3(static_cast<FrontendAtsc3TimeInterleaveMode>(aidlInter));
-                            modes.push_back(mode);
-                            break;
-                        case (int)FrontendType::DTMB:
-                            mode.dtmb(static_cast<FrontendDtmbTimeInterleaveMode>(aidlInter));
-                            modes.push_back(mode);
-                            break;
-                        default:
-                            break;
-                    }
-                }
-                if (modes.size() > 0) {
-                    status.interleaving(modes);
-                    hidlStatus.push_back(status);
-                }
-                break;
-            }
-            case TunerFrontendStatus::isdbtSegment: {
-                auto aidlSeg = s.get<TunerFrontendStatus::isdbtSegment>();
-                hidl_vec<uint8_t> s(aidlSeg.begin(), aidlSeg.end());
-                status.isdbtSegment(s);
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::tsDataRate: {
-                auto aidlTs = s.get<TunerFrontendStatus::tsDataRate>();
-                hidl_vec<uint32_t> ts(aidlTs.begin(), aidlTs.end());
-                status.tsDataRate(ts);
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::rollOff: {
-                auto aidlRoll = s.get<TunerFrontendStatus::rollOff>();
-                FrontendRollOff roll;
-                switch (mType) {
-                    case (int)FrontendType::DVBS:
-                        roll.dvbs(static_cast<FrontendDvbsRolloff>(aidlRoll));
-                        status.rollOff(roll);
-                        hidlStatus.push_back(status);
-                        break;
-                    case (int)FrontendType::ISDBS:
-                        roll.isdbs(static_cast<FrontendIsdbsRolloff>(aidlRoll));
-                        status.rollOff(roll);
-                        hidlStatus.push_back(status);
-                        break;
-                    case (int)FrontendType::ISDBS3:
-                        roll.isdbs3(static_cast<FrontendIsdbs3Rolloff>(aidlRoll));
-                        status.rollOff(roll);
-                        hidlStatus.push_back(status);
-                        break;
-                    default:
-                        break;
-                }
-                break;
-            }
-            case TunerFrontendStatus::isMiso: {
-                status.isMiso(s.get<TunerFrontendStatus::isMiso>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::isLinear: {
-                status.isLinear(s.get<TunerFrontendStatus::isLinear>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            case TunerFrontendStatus::isShortFrames: {
-                status.isShortFrames(s.get<TunerFrontendStatus::isShortFrames>());
-                hidlStatus.push_back(status);
-                break;
-            }
-            default:
-                break;
-        }
-    }
-    return hidlStatus;
-}
-
-TunerFrontendSettings FrontendClient::getAidlFrontendSettings(const FrontendSettings& settings,
-        const FrontendSettingsExt1_1& settingsExt1_1) {
-    bool isExtended = validateExtendedSettings(settingsExt1_1);
-    TunerFrontendSettings s{
-        .isExtended = isExtended,
-        .endFrequency = (int) settingsExt1_1.endFrequency,
-        .inversion = (int) settingsExt1_1.inversion,
-    };
-
-    if (settingsExt1_1.settingExt.getDiscriminator()
-            == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dtmb) {
-        s.settings.set<TunerFrontendUnionSettings::dtmb>(getAidlDtmbSettings(settingsExt1_1));
-        return s;
-    }
-
-    switch (settings.getDiscriminator()) {
-        case FrontendSettings::hidl_discriminator::analog: {
-            s.settings.set<TunerFrontendUnionSettings::analog>(
-                    getAidlAnalogSettings(settings, settingsExt1_1));
-            break;
-        }
-        case FrontendSettings::hidl_discriminator::atsc: {
-            s.settings.set<TunerFrontendUnionSettings::atsc>(getAidlAtscSettings(settings));
-            break;
-        }
-        case FrontendSettings::hidl_discriminator::atsc3: {
-            s.settings.set<TunerFrontendUnionSettings::atsc3>(getAidlAtsc3Settings(settings));
-            break;
-        }
-        case FrontendSettings::hidl_discriminator::dvbs: {
-            s.settings.set<TunerFrontendUnionSettings::dvbs>(
-                    getAidlDvbsSettings(settings, settingsExt1_1));
-            break;
-        }
-        case FrontendSettings::hidl_discriminator::dvbc: {
-            s.settings.set<TunerFrontendUnionSettings::cable>(
-                    getAidlCableSettings(settings, settingsExt1_1));
-            break;
-        }
-        case FrontendSettings::hidl_discriminator::dvbt: {
-            s.settings.set<TunerFrontendUnionSettings::dvbt>(
-                    getAidlDvbtSettings(settings, settingsExt1_1));
-            break;
-        }
-        case FrontendSettings::hidl_discriminator::isdbs: {
-            s.settings.set<TunerFrontendUnionSettings::isdbs>(getAidlIsdbsSettings(settings));
-            break;
-        }
-        case FrontendSettings::hidl_discriminator::isdbs3: {
-            s.settings.set<TunerFrontendUnionSettings::isdbs3>(getAidlIsdbs3Settings(settings));
-            break;
-        }
-        case FrontendSettings::hidl_discriminator::isdbt: {
-            s.settings.set<TunerFrontendUnionSettings::isdbt>(getAidlIsdbtSettings(settings));
-            break;
-        }
-        default:
-            break;
-    }
-    return s;
-}
-
-TunerFrontendAnalogSettings FrontendClient::getAidlAnalogSettings(const FrontendSettings& settings,
-        const FrontendSettingsExt1_1& settingsExt1_1) {
-    TunerFrontendAnalogSettings analogSettings{
-        .frequency = (int)settings.analog().frequency,
-        .signalType = (int)settings.analog().type,
-        .sifStandard = (int)settings.analog().sifStandard,
-    };
-    if (settingsExt1_1.settingExt.getDiscriminator()
-            == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::analog) {
-        analogSettings.isExtended = true;
-        analogSettings.aftFlag = (int)settingsExt1_1.settingExt.analog().aftFlag;
-    } else {
-        analogSettings.isExtended = false;
-    }
-    return analogSettings;
-}
-
-TunerFrontendDvbsSettings FrontendClient::getAidlDvbsSettings(const FrontendSettings& settings,
-        const FrontendSettingsExt1_1& settingsExt1_1) {
-    TunerFrontendDvbsSettings dvbsSettings{
-        .frequency = (int)settings.dvbs().frequency,
-        .modulation = (int)settings.dvbs().modulation,
-        .codeRate = {
-            .fec = (long)settings.dvbs().coderate.fec,
-            .isLinear = settings.dvbs().coderate.isLinear,
-            .isShortFrames = settings.dvbs().coderate.isShortFrames,
-            .bitsPer1000Symbol = (int)settings.dvbs().coderate.bitsPer1000Symbol,
-        },
-        .symbolRate = (int)settings.dvbs().symbolRate,
-        .rolloff = (int)settings.dvbs().rolloff,
-        .pilot = (int)settings.dvbs().pilot,
-        .inputStreamId = (int)settings.dvbs().inputStreamId,
-        .standard = (int)settings.dvbs().standard,
-        .vcm = (int)settings.dvbs().vcmMode,
-    };
-    if (settingsExt1_1.settingExt.getDiscriminator()
-            == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbs) {
-        dvbsSettings.isExtended = true;
-        dvbsSettings.scanType = (int)settingsExt1_1.settingExt.dvbs().scanType;
-        dvbsSettings.isDiseqcRxMessage = settingsExt1_1.settingExt.dvbs().isDiseqcRxMessage;
-    } else {
-        dvbsSettings.isExtended = false;
-    }
-    return dvbsSettings;
-}
-
-TunerFrontendCableSettings FrontendClient::getAidlCableSettings(const FrontendSettings& settings,
-        const FrontendSettingsExt1_1& settingsExt1_1) {
-    TunerFrontendCableSettings cableSettings{
-        .frequency = (int)settings.dvbc().frequency,
-        .modulation = (int)settings.dvbc().modulation,
-        .innerFec = (long)settings.dvbc().fec,
-        .symbolRate = (int)settings.dvbc().symbolRate,
-        .outerFec = (int)settings.dvbc().outerFec,
-        .annex = (int)settings.dvbc().annex,
-        .spectralInversion = (int)settings.dvbc().spectralInversion,
-    };
-    if (settingsExt1_1.settingExt.getDiscriminator()
-            == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbc) {
-        cableSettings.isExtended = true;
-        cableSettings.interleaveMode = (int)settingsExt1_1.settingExt.dvbc().interleaveMode;
-        cableSettings.bandwidth = (int)settingsExt1_1.settingExt.dvbc().bandwidth;
-    } else {
-        cableSettings.isExtended = false;
-    }
-    return cableSettings;
-}
-
-TunerFrontendDvbtSettings FrontendClient::getAidlDvbtSettings(const FrontendSettings& settings,
-        const FrontendSettingsExt1_1& settingsExt1_1) {
-    TunerFrontendDvbtSettings dvbtSettings{
-        .frequency = (int)settings.dvbt().frequency,
-        .transmissionMode = (int)settings.dvbt().transmissionMode,
-        .bandwidth = (int)settings.dvbt().bandwidth,
-        .constellation = (int)settings.dvbt().constellation,
-        .hierarchy = (int)settings.dvbt().hierarchy,
-        .hpCodeRate = (int)settings.dvbt().hpCoderate,
-        .lpCodeRate = (int)settings.dvbt().lpCoderate,
-        .guardInterval = (int)settings.dvbt().guardInterval,
-        .isHighPriority = settings.dvbt().isHighPriority,
-        .standard = (int)settings.dvbt().standard,
-        .isMiso = settings.dvbt().isMiso,
-        .plpMode = (int)settings.dvbt().plpMode,
-        .plpId = (int)settings.dvbt().plpId,
-        .plpGroupId = (int)settings.dvbt().plpGroupId,
-    };
-    if (settingsExt1_1.settingExt.getDiscriminator()
-            == FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::dvbt) {
-        dvbtSettings.isExtended = true;
-        dvbtSettings.constellation = (int)settingsExt1_1.settingExt.dvbt().constellation;
-        dvbtSettings.transmissionMode =
-                (int)settingsExt1_1.settingExt.dvbt().transmissionMode;
-    } else {
-        dvbtSettings.isExtended = false;
-    }
-    return dvbtSettings;
-}
-
-TunerFrontendDtmbSettings FrontendClient::getAidlDtmbSettings(
-        const FrontendSettingsExt1_1& settingsExt1_1) {
-    TunerFrontendDtmbSettings dtmbSettings{
-        .frequency = (int)settingsExt1_1.settingExt.dtmb().frequency,
-        .transmissionMode = (int)settingsExt1_1.settingExt.dtmb().transmissionMode,
-        .bandwidth = (int)settingsExt1_1.settingExt.dtmb().bandwidth,
-        .modulation = (int)settingsExt1_1.settingExt.dtmb().modulation,
-        .codeRate = (int)settingsExt1_1.settingExt.dtmb().codeRate,
-        .guardInterval = (int)settingsExt1_1.settingExt.dtmb().guardInterval,
-        .interleaveMode = (int)settingsExt1_1.settingExt.dtmb().interleaveMode,
-    };
-    return dtmbSettings;
-}
-
-TunerFrontendAtscSettings FrontendClient::getAidlAtscSettings(const FrontendSettings& settings) {
-    TunerFrontendAtscSettings atscSettings{
-        .frequency = (int)settings.atsc().frequency,
-        .modulation = (int)settings.atsc().modulation,
-    };
-    return atscSettings;
-}
-
-TunerFrontendAtsc3Settings FrontendClient::getAidlAtsc3Settings(const FrontendSettings& settings) {
-    TunerFrontendAtsc3Settings atsc3Settings{
-        .frequency = (int)settings.atsc3().frequency,
-        .bandwidth = (int)settings.atsc3().bandwidth,
-        .demodOutputFormat = (int)settings.atsc3().demodOutputFormat,
-    };
-    atsc3Settings.plpSettings.resize(settings.atsc3().plpSettings.size());
-    for (auto plpSetting : settings.atsc3().plpSettings) {
-        atsc3Settings.plpSettings.push_back({
-            .plpId = (int)plpSetting.plpId,
-            .modulation = (int)plpSetting.modulation,
-            .interleaveMode = (int)plpSetting.interleaveMode,
-            .codeRate = (int)plpSetting.codeRate,
-            .fec = (int)plpSetting.fec,
-        });
-    }
-    return atsc3Settings;
-}
-
-TunerFrontendIsdbsSettings FrontendClient::getAidlIsdbsSettings(const FrontendSettings& settings) {
-    TunerFrontendIsdbsSettings isdbsSettings{
-        .frequency = (int)settings.isdbs().frequency,
-        .streamId = (char16_t)settings.isdbs().streamId,
-        .streamIdType = (int)settings.isdbs().streamIdType,
-        .modulation = (int)settings.isdbs().modulation,
-        .codeRate = (int)settings.isdbs().coderate,
-        .symbolRate = (int)settings.isdbs().symbolRate,
-        .rolloff = (int)settings.isdbs().rolloff,
-    };
-    return isdbsSettings;
-}
-
-TunerFrontendIsdbs3Settings FrontendClient::getAidlIsdbs3Settings(
-        const FrontendSettings& settings) {
-    TunerFrontendIsdbs3Settings isdbs3Settings{
-        .frequency = (int)settings.isdbs3().frequency,
-        .streamId = (char16_t)settings.isdbs3().streamId,
-        .streamIdType = (int)settings.isdbs3().streamIdType,
-        .modulation = (int)settings.isdbs3().modulation,
-        .codeRate = (int)settings.isdbs3().coderate,
-        .symbolRate = (int)settings.isdbs3().symbolRate,
-        .rolloff = (int)settings.isdbs3().rolloff,
-    };
-    return isdbs3Settings;
-}
-
-TunerFrontendIsdbtSettings FrontendClient::getAidlIsdbtSettings(const FrontendSettings& settings) {
-    TunerFrontendIsdbtSettings isdbtSettings{
-        .frequency = (int)settings.isdbt().frequency,
-        .modulation = (int)settings.isdbt().modulation,
-        .bandwidth = (int)settings.isdbt().bandwidth,
-        .mode = (int)settings.isdbt().mode,
-        .codeRate = (int)settings.isdbt().coderate,
-        .guardInterval = (int)settings.isdbt().guardInterval,
-        .serviceAreaId = (int)settings.isdbt().serviceAreaId,
-    };
-    return isdbtSettings;
-}
-
-bool FrontendClient::validateExtendedSettings(const FrontendSettingsExt1_1& settingsExt1_1) {
-    return settingsExt1_1.endFrequency != (uint32_t)Constant::INVALID_FRONTEND_SETTING_FREQUENCY
-            || settingsExt1_1.inversion != FrontendSpectralInversion::UNDEFINED
-            || settingsExt1_1.settingExt.getDiscriminator()
-                    != FrontendSettingsExt1_1::SettingsExt::hidl_discriminator::noinit;
-}
-
-/////////////// TunerFrontendCallback ///////////////////////
-
-TunerFrontendCallback::TunerFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
-        : mFrontendClientCallback(frontendClientCallback) {}
-
-Status TunerFrontendCallback::onEvent(int frontendEventType) {
-    if (mFrontendClientCallback != NULL) {
-        mFrontendClientCallback->onEvent(static_cast<FrontendEventType>(frontendEventType));
-        return Status::ok();
-    }
-    return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
-}
-
-Status TunerFrontendCallback::onScanMessage(int messageType,
-        const TunerFrontendScanMessage& message) {
-    if (mFrontendClientCallback != NULL) {
-        if (!is1_1ExtendedScanMessage(messageType)) {
-            mFrontendClientCallback->onScanMessage(
-                    static_cast<FrontendScanMessageType>(messageType),
-                    getHalScanMessage(messageType, message));
-        } else {
-            mFrontendClientCallback->onScanMessageExt1_1(
-                    static_cast<FrontendScanMessageTypeExt1_1>(messageType),
-                    getHalScanMessageExt1_1(messageType, message));
-        }
-        return Status::ok();
-    }
-    return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
+    return static_cast<int32_t>(Constant::INVALID_FRONTEND_ID);
 }
 
 /////////////// IFrontendCallback ///////////////////////
-
-HidlFrontendCallback::HidlFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
+TunerFrontendCallback::TunerFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
         : mFrontendClientCallback(frontendClientCallback) {}
 
-Return<void> HidlFrontendCallback::onEvent(FrontendEventType frontendEventType) {
-    if (mFrontendClientCallback != NULL) {
+Status TunerFrontendCallback::onEvent(FrontendEventType frontendEventType) {
+    if (mFrontendClientCallback != nullptr) {
         mFrontendClientCallback->onEvent(frontendEventType);
+        return Status::ok();
     }
-    return Void();
+    return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
 }
 
-Return<void> HidlFrontendCallback::onScanMessage(FrontendScanMessageType type,
-        const FrontendScanMessage& message) {
-    if (mFrontendClientCallback != NULL) {
-        mFrontendClientCallback->onScanMessage(type, message);
+Status TunerFrontendCallback::onScanMessage(FrontendScanMessageType messageType,
+                                            const FrontendScanMessage& message) {
+    if (mFrontendClientCallback != nullptr) {
+        mFrontendClientCallback->onScanMessage(messageType, message);
+        return Status::ok();
     }
-    return Void();
+    return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
 }
 
-Return<void> HidlFrontendCallback::onScanMessageExt1_1(FrontendScanMessageTypeExt1_1 type,
-        const FrontendScanMessageExt1_1& message) {
-    if (mFrontendClientCallback != NULL) {
-        mFrontendClientCallback->onScanMessageExt1_1(type, message);
-    }
-    return Void();
-}
-
-/////////////// FrontendClientCallback Helper Methods ///////////////////////
-
-FrontendScanMessage TunerFrontendCallback::getHalScanMessage(
-        int messageType, const TunerFrontendScanMessage& message) {
-    FrontendScanMessage scanMessage;
-    switch (messageType) {
-        case (int) FrontendScanMessageType::LOCKED:
-            scanMessage.isLocked(message.get<TunerFrontendScanMessage::isLocked>());
-            break;
-        case (int) FrontendScanMessageType::END:
-            scanMessage.isEnd(message.get<TunerFrontendScanMessage::isEnd>());
-            break;
-        case (int) FrontendScanMessageType::PROGRESS_PERCENT:
-            scanMessage.progressPercent(message.get<TunerFrontendScanMessage::progressPercent>());
-            break;
-        case (int) FrontendScanMessageType::FREQUENCY: {
-            vector<int> f = message.get<TunerFrontendScanMessage::frequencies>();
-            hidl_vec<uint32_t> frequencies(begin(f), end(f));
-            scanMessage.frequencies(frequencies);
-            break;
-        }
-        case (int) FrontendScanMessageType::SYMBOL_RATE: {
-            vector<int> s = message.get<TunerFrontendScanMessage::symbolRates>();
-            hidl_vec<uint32_t> symbolRates(begin(s), end(s));
-            scanMessage.symbolRates(symbolRates);
-            break;
-        }
-        case (int) FrontendScanMessageType::HIERARCHY:
-            scanMessage.hierarchy(static_cast<FrontendDvbtHierarchy>(
-                    message.get<TunerFrontendScanMessage::hierarchy>()));
-            break;
-        case (int) FrontendScanMessageType::ANALOG_TYPE:
-            scanMessage.analogType(static_cast<FrontendAnalogType>(
-                    message.get<TunerFrontendScanMessage::analogType>()));
-            break;
-        case (int) FrontendScanMessageType::PLP_IDS: {
-            vector<uint8_t> p = message.get<TunerFrontendScanMessage::plpIds>();
-            hidl_vec<uint8_t> plpIds(begin(p), end(p));
-            scanMessage.plpIds(plpIds);
-            break;
-        }
-        case (int) FrontendScanMessageType::GROUP_IDS: {
-            vector<uint8_t> g = message.get<TunerFrontendScanMessage::groupIds>();
-            hidl_vec<uint8_t> groupIds(begin(g), end(g));
-            scanMessage.groupIds(groupIds);
-            break;
-        }
-        case (int) FrontendScanMessageType::INPUT_STREAM_IDS: {
-            vector<char16_t> i = message.get<TunerFrontendScanMessage::inputStreamIds>();
-            hidl_vec<uint16_t> inputStreamIds(begin(i), end(i));
-            scanMessage.inputStreamIds(inputStreamIds);
-            break;
-        }
-        case (int) FrontendScanMessageType::STANDARD: {
-            FrontendScanMessage::Standard std;
-            int standard = message.get<TunerFrontendScanMessage::std>();
-            switch (mType) {
-                case (int) FrontendType::DVBS:
-                    std.sStd(static_cast<FrontendDvbsStandard>(standard));
-                    scanMessage.std(std);
-                    break;
-                case (int) FrontendType::DVBT:
-                    std.tStd(static_cast<FrontendDvbtStandard>(standard));
-                    scanMessage.std(std);
-                    break;
-                case (int) FrontendType::ANALOG:
-                    std.sifStd(static_cast<FrontendAnalogSifStandard>(standard));
-                    scanMessage.std(std);
-                    break;
-                default:
-                    break;
-            }
-            break;
-        }
-        case (int) FrontendScanMessageType::ATSC3_PLP_INFO: {
-            vector<TunerFrontendScanAtsc3PlpInfo> plp =
-                    message.get<TunerFrontendScanMessage::atsc3PlpInfos>();
-            hidl_vec<FrontendScanAtsc3PlpInfo> plpInfo;
-            int size = plp.size();
-            plpInfo.resize(size);
-            for (int i = 0; i < size; i++) {
-                auto info = message.get<TunerFrontendScanMessage::atsc3PlpInfos>()[i];
-                FrontendScanAtsc3PlpInfo p{
-                    .plpId = static_cast<uint8_t>(info.plpId),
-                    .bLlsFlag = info.llsFlag,
-                };
-                plpInfo[i] = p;
-            }
-            scanMessage.atsc3PlpInfos(plpInfo);
-            break;
-        }
-        default:
-            break;
-    }
-    return scanMessage;
-}
-
-FrontendScanMessageExt1_1 TunerFrontendCallback::getHalScanMessageExt1_1(
-        int messageType, const TunerFrontendScanMessage& message) {
-    FrontendScanMessageExt1_1 scanMessage;
-    switch (messageType) {
-        case (int) FrontendScanMessageTypeExt1_1::HIGH_PRIORITY:
-            scanMessage.isHighPriority(message.get<TunerFrontendScanMessage::isHighPriority>());
-            break;
-        case (int) FrontendScanMessageTypeExt1_1::DVBC_ANNEX:
-            scanMessage.annex(static_cast<FrontendDvbcAnnex>(
-                    message.get<TunerFrontendScanMessage::annex>()));
-            break;
-        case (int) FrontendScanMessageTypeExt1_1::MODULATION: {
-            FrontendModulation m;
-            int modulation = message.get<TunerFrontendScanMessage::modulation>();
-            switch (mType) {
-                case (int) FrontendType::DVBC:
-                    m.dvbc(static_cast<FrontendDvbcModulation>(modulation));
-                    scanMessage.modulation(m);
-                    break;
-                case (int) FrontendType::DVBS:
-                    m.dvbs(static_cast<FrontendDvbsModulation>(modulation));
-                    scanMessage.modulation(m);
-                    break;
-                case (int) FrontendType::DVBT:
-                    m.dvbt(static_cast<FrontendDvbtConstellation>(modulation));
-                    scanMessage.modulation(m);
-                    break;
-                case (int) FrontendType::ISDBS:
-                    m.isdbs(static_cast<FrontendIsdbsModulation>(modulation));
-                    scanMessage.modulation(m);
-                    break;
-                case (int) FrontendType::ISDBS3:
-                    m.isdbs3(static_cast<FrontendIsdbs3Modulation>(modulation));
-                    scanMessage.modulation(m);
-                    break;
-                case (int) FrontendType::ISDBT:
-                    m.isdbt(static_cast<FrontendIsdbtModulation>(modulation));
-                    scanMessage.modulation(m);
-                    break;
-                case (int) FrontendType::ATSC:
-                    m.atsc(static_cast<FrontendAtscModulation>(modulation));
-                    scanMessage.modulation(m);
-                    break;
-                case (int) FrontendType::ATSC3:
-                    m.atsc3(static_cast<FrontendAtsc3Modulation>(modulation));
-                    scanMessage.modulation(m);
-                    break;
-                case (int) hardware::tv::tuner::V1_1::FrontendType::DTMB:
-                    m.dtmb(static_cast<FrontendDtmbModulation>(modulation));
-                    scanMessage.modulation(m);
-                    break;
-                default:
-                    break;
-            }
-            break;
-        }
-        default:
-            break;
-    }
-    return scanMessage;
-}
-
-bool TunerFrontendCallback::is1_1ExtendedScanMessage(int messageType) {
-    return messageType >= (int)FrontendScanMessageTypeExt1_1::MODULATION
-            && messageType <= (int)FrontendScanMessageTypeExt1_1::HIGH_PRIORITY;
-}
 }  // namespace android
diff --git a/media/jni/tuner/FrontendClient.h b/media/jni/tuner/FrontendClient.h
index 1dd950e..08c0b20 100644
--- a/media/jni/tuner/FrontendClient.h
+++ b/media/jni/tuner/FrontendClient.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,53 +17,29 @@
 #ifndef _ANDROID_MEDIA_TV_FRONTEND_CLIENT_H_
 #define _ANDROID_MEDIA_TV_FRONTEND_CLIENT_H_
 
+#include <aidl/android/hardware/tv/tuner/DemuxFilterSettings.h>
+#include <aidl/android/hardware/tv/tuner/FrontendType.h>
+#include <aidl/android/hardware/tv/tuner/Result.h>
 #include <aidl/android/media/tv/tuner/BnTunerFrontendCallback.h>
 #include <aidl/android/media/tv/tuner/ITunerFrontend.h>
-#include <android/hardware/tv/tuner/1.1/IFrontend.h>
-#include <android/hardware/tv/tuner/1.1/IFrontendCallback.h>
-#include <android/hardware/tv/tuner/1.1/types.h>
+#include <utils/RefBase.h>
 
 #include "ClientHelper.h"
 #include "FrontendClientCallback.h"
 #include "LnbClient.h"
 
 using Status = ::ndk::ScopedAStatus;
-
+using ::aidl::android::hardware::tv::tuner::FrontendEventType;
+using ::aidl::android::hardware::tv::tuner::FrontendScanMessage;
+using ::aidl::android::hardware::tv::tuner::FrontendScanMessageType;
+using ::aidl::android::hardware::tv::tuner::FrontendScanType;
+using ::aidl::android::hardware::tv::tuner::FrontendSettings;
+using ::aidl::android::hardware::tv::tuner::FrontendStatus;
+using ::aidl::android::hardware::tv::tuner::FrontendStatusType;
+using ::aidl::android::hardware::tv::tuner::FrontendType;
+using ::aidl::android::hardware::tv::tuner::Result;
 using ::aidl::android::media::tv::tuner::BnTunerFrontendCallback;
 using ::aidl::android::media::tv::tuner::ITunerFrontend;
-using ::aidl::android::media::tv::tuner::TunerFrontendAnalogSettings;
-using ::aidl::android::media::tv::tuner::TunerFrontendAtscSettings;
-using ::aidl::android::media::tv::tuner::TunerFrontendAtsc3Settings;
-using ::aidl::android::media::tv::tuner::TunerFrontendCableSettings;
-using ::aidl::android::media::tv::tuner::TunerFrontendDvbsSettings;
-using ::aidl::android::media::tv::tuner::TunerFrontendDvbtSettings;
-using ::aidl::android::media::tv::tuner::TunerFrontendDtmbSettings;
-using ::aidl::android::media::tv::tuner::TunerFrontendIsdbsSettings;
-using ::aidl::android::media::tv::tuner::TunerFrontendIsdbs3Settings;
-using ::aidl::android::media::tv::tuner::TunerFrontendIsdbtSettings;
-using ::aidl::android::media::tv::tuner::TunerFrontendScanMessage;
-using ::aidl::android::media::tv::tuner::TunerFrontendSettings;
-using ::aidl::android::media::tv::tuner::TunerFrontendStatus;
-
-using ::android::hardware::Return;
-using ::android::hardware::Void;
-using ::android::hardware::tv::tuner::V1_0::FrontendInfo;
-using ::android::hardware::tv::tuner::V1_0::FrontendEventType;
-using ::android::hardware::tv::tuner::V1_0::FrontendScanMessage;
-using ::android::hardware::tv::tuner::V1_0::FrontendScanMessageType;
-using ::android::hardware::tv::tuner::V1_0::FrontendScanType;
-using ::android::hardware::tv::tuner::V1_0::FrontendSettings;
-using ::android::hardware::tv::tuner::V1_0::FrontendStatus;
-using ::android::hardware::tv::tuner::V1_0::FrontendStatusType;
-using ::android::hardware::tv::tuner::V1_0::IFrontend;
-using ::android::hardware::tv::tuner::V1_0::Result;
-
-using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageExt1_1;
-using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageTypeExt1_1;
-using ::android::hardware::tv::tuner::V1_1::FrontendSettingsExt1_1;
-using ::android::hardware::tv::tuner::V1_1::FrontendStatusExt1_1;
-using ::android::hardware::tv::tuner::V1_1::FrontendStatusTypeExt1_1;
-using ::android::hardware::tv::tuner::V1_1::IFrontendCallback;
 
 using namespace std;
 
@@ -74,32 +50,8 @@
 public:
     TunerFrontendCallback(sp<FrontendClientCallback> frontendClientCallback);
 
-    Status onEvent(int frontendEventType);
-
-    Status onScanMessage(int messageType, const TunerFrontendScanMessage& message);
-
-    void setFrontendType(int frontendType) { mType = frontendType; }
-
-private:
-    FrontendScanMessage getHalScanMessage(int messageType, const TunerFrontendScanMessage& message);
-    FrontendScanMessageExt1_1 getHalScanMessageExt1_1(int messageType,
-            const TunerFrontendScanMessage& message);
-    bool is1_1ExtendedScanMessage(int messageType);
-
-    sp<FrontendClientCallback> mFrontendClientCallback;
-    int mType;
-};
-
-struct HidlFrontendCallback : public IFrontendCallback {
-
-public:
-    HidlFrontendCallback(sp<FrontendClientCallback> frontendClientCallback);
-
-    virtual Return<void> onEvent(FrontendEventType frontendEventType);
-    virtual Return<void> onScanMessage(
-            FrontendScanMessageType type, const FrontendScanMessage& message);
-    virtual Return<void> onScanMessageExt1_1(
-            FrontendScanMessageTypeExt1_1 type, const FrontendScanMessageExt1_1& messageExt);
+    Status onEvent(FrontendEventType frontendEventType);
+    Status onScanMessage(FrontendScanMessageType messageType, const FrontendScanMessage& message);
 
 private:
     sp<FrontendClientCallback> mFrontendClientCallback;
@@ -108,7 +60,7 @@
 struct FrontendClient : public RefBase {
 
 public:
-    FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int type);
+    FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, FrontendType type);
     ~FrontendClient();
 
     /**
@@ -116,13 +68,10 @@
      */
     Result setCallback(sp<FrontendClientCallback> frontendClientCallback);
 
-    // TODO: remove after migration to Tuner Service is done.
-    void setHidlFrontend(sp<IFrontend> frontend);
-
     /**
      * Tuner Frontend with Frontend Settings.
      */
-    Result tune(const FrontendSettings& settings, const FrontendSettingsExt1_1& settingsExt1_1);
+    Result tune(const FrontendSettings& settings);
 
     /**
      * Stop tune Frontend.
@@ -132,8 +81,7 @@
     /**
      * Scan the frontend to use the settings given.
      */
-    Result scan(const FrontendSettings& settings, FrontendScanType frontendScanType,
-            const FrontendSettingsExt1_1& settingsExt1_1);
+    Result scan(const FrontendSettings& settings, FrontendScanType frontendScanType);
 
     /**
      * Stop the previous scanning.
@@ -146,12 +94,6 @@
     vector<FrontendStatus> getStatus(vector<FrontendStatusType> statusTypes);
 
     /**
-     * Gets the 1.1 extended statuses of the frontend.
-     */
-    vector<FrontendStatusExt1_1> getStatusExtended_1_1(
-            vector<FrontendStatusTypeExt1_1> statusTypes);
-
-    /**
      * Sets Low-Noise Block downconverter (LNB) for satellite frontend.
      */
     Result setLnb(sp<LnbClient> lnbClient);
@@ -166,68 +108,28 @@
      *
      * @return lts id
      */
-    int linkCiCamToFrontend(int ciCamId);
+    int32_t linkCiCamToFrontend(int32_t ciCamId);
 
     /**
      * Unink Frontend to the cicam with given id.
      */
-    Result unlinkCiCamToFrontend(int ciCamId);
+    Result unlinkCiCamToFrontend(int32_t ciCamId);
 
     /**
      * Close Frontend.
      */
     Result close();
 
+    int32_t getId();
     shared_ptr<ITunerFrontend> getAidlFrontend();
-
-    void setId(int id);
-    int getId();
-
 private:
-    vector<FrontendStatus> getHidlStatus(vector<TunerFrontendStatus>& aidlStatus);
-    vector<FrontendStatusExt1_1> getHidlStatusExt(vector<TunerFrontendStatus>& aidlStatus);
-
-    TunerFrontendSettings getAidlFrontendSettings(
-            const FrontendSettings& settings, const FrontendSettingsExt1_1& settingsExt1_1);
-    TunerFrontendAnalogSettings getAidlAnalogSettings(
-            const FrontendSettings& settings, const FrontendSettingsExt1_1& settingsExt1_1);
-    TunerFrontendDvbsSettings getAidlDvbsSettings(
-            const FrontendSettings& settings, const FrontendSettingsExt1_1& settingsExt1_1);
-    TunerFrontendCableSettings getAidlCableSettings(
-            const FrontendSettings& settings, const FrontendSettingsExt1_1& settingsExt1_1);
-    TunerFrontendDvbtSettings getAidlDvbtSettings(
-            const FrontendSettings& settings, const FrontendSettingsExt1_1& settingsExt1_1);
-    TunerFrontendDtmbSettings getAidlDtmbSettings(const FrontendSettingsExt1_1& settingsExt1_1);
-    TunerFrontendAtscSettings getAidlAtscSettings(const FrontendSettings& settings);
-    TunerFrontendAtsc3Settings getAidlAtsc3Settings(const FrontendSettings& settings);
-    TunerFrontendIsdbsSettings getAidlIsdbsSettings(const FrontendSettings& settings);
-    TunerFrontendIsdbs3Settings getAidlIsdbs3Settings(const FrontendSettings& settings);
-    TunerFrontendIsdbtSettings getAidlIsdbtSettings(const FrontendSettings& settings);
-
-    bool validateExtendedSettings(const FrontendSettingsExt1_1& settingsExt1_1);
-
     /**
      * An AIDL Tuner Frontend Singleton assigned at the first time when the Tuner Client
      * opens a frontend cient. Default null when the service does not exist.
      */
     shared_ptr<ITunerFrontend> mTunerFrontend;
 
-    /**
-     * A Frontend 1.0 HAL interface as a fall back interface when the Tuner Service does not exist.
-     * This is a temprary connection before the Tuner Framework fully migrates to the TunerService.
-     * Default null.
-     */
-    sp<IFrontend> mFrontend;
-
-    /**
-     * A Frontend 1.1 HAL interface as a fall back interface when the Tuner Service does not exist.
-     * This is a temprary connection before the Tuner Framework fully migrates to the TunerService.
-     * Default null.
-     */
-    sp<::android::hardware::tv::tuner::V1_1::IFrontend> mFrontend_1_1;
-
-    int mId;
-    int mType;
+    FrontendType mType;
 };
 }  // namespace android
 
diff --git a/media/jni/tuner/FrontendClientCallback.h b/media/jni/tuner/FrontendClientCallback.h
index 94f8c40..15b08ef 100644
--- a/media/jni/tuner/FrontendClientCallback.h
+++ b/media/jni/tuner/FrontendClientCallback.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,11 +17,11 @@
 #ifndef _ANDROID_MEDIA_TV_FRONTEND_CLIENT_CALLBACK_H_
 #define _ANDROID_MEDIA_TV_FRONTEND_CLIENT_CALLBACK_H_
 
-using ::android::hardware::tv::tuner::V1_0::FrontendEventType;
-using ::android::hardware::tv::tuner::V1_0::FrontendScanMessage;
-using ::android::hardware::tv::tuner::V1_0::FrontendScanMessageType;
-using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageExt1_1;
-using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageTypeExt1_1;
+#include <utils/RefBase.h>
+
+using ::aidl::android::hardware::tv::tuner::FrontendEventType;
+using ::aidl::android::hardware::tv::tuner::FrontendScanMessage;
+using ::aidl::android::hardware::tv::tuner::FrontendScanMessageType;
 
 using namespace std;
 
@@ -30,8 +30,6 @@
 struct FrontendClientCallback : public RefBase {
     virtual void onEvent(FrontendEventType frontendEventType);
     virtual void onScanMessage(FrontendScanMessageType type, const FrontendScanMessage& message);
-    virtual void onScanMessageExt1_1(
-            FrontendScanMessageTypeExt1_1 type, const FrontendScanMessageExt1_1& messageExt);
 };
 }  // namespace android
 
diff --git a/media/jni/tuner/LnbClient.cpp b/media/jni/tuner/LnbClient.cpp
index 073c49a..43198e3 100644
--- a/media/jni/tuner/LnbClient.cpp
+++ b/media/jni/tuner/LnbClient.cpp
@@ -21,148 +21,89 @@
 
 #include "LnbClient.h"
 
-using ::android::hardware::tv::tuner::V1_0::Result;
-
 namespace android {
 
 /////////////// LnbClient ///////////////////////
-
 LnbClient::LnbClient(shared_ptr<ITunerLnb> tunerLnb) {
     mTunerLnb = tunerLnb;
-    mId = -1;
 }
 
 LnbClient::~LnbClient() {
-    mTunerLnb = NULL;
-    mLnb = NULL;
-    mId = -1;
-}
-
-// TODO: remove after migration to Tuner Service is done.
-void LnbClient::setHidlLnb(sp<ILnb> lnb) {
-    mLnb = lnb;
+    mTunerLnb = nullptr;
 }
 
 Result LnbClient::setCallback(sp<LnbClientCallback> cb) {
-    if (mTunerLnb != NULL) {
+    if (mTunerLnb != nullptr) {
         shared_ptr<TunerLnbCallback> aidlCallback =
                 ::ndk::SharedRefBase::make<TunerLnbCallback>(cb);
         Status s = mTunerLnb->setCallback(aidlCallback);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mLnb != NULL) {
-        sp<HidlLnbCallback> hidlCallback = new HidlLnbCallback(cb);
-        return mLnb->setCallback(hidlCallback);
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result LnbClient::setVoltage(LnbVoltage voltage) {
-    if (mTunerLnb != NULL) {
-        Status s = mTunerLnb->setVoltage((int)voltage);
+    if (mTunerLnb != nullptr) {
+        Status s = mTunerLnb->setVoltage(voltage);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mLnb != NULL) {
-        return mLnb->setVoltage(voltage);
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result LnbClient::setTone(LnbTone tone) {
-    if (mTunerLnb != NULL) {
-        Status s = mTunerLnb->setTone((int)tone);
+    if (mTunerLnb != nullptr) {
+        Status s = mTunerLnb->setTone(tone);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mLnb != NULL) {
-        return mLnb->setTone(tone);
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result LnbClient::setSatellitePosition(LnbPosition position) {
-    if (mTunerLnb != NULL) {
-        Status s = mTunerLnb->setSatellitePosition((int)position);
+    if (mTunerLnb != nullptr) {
+        Status s = mTunerLnb->setSatellitePosition(position);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mLnb != NULL) {
-        return mLnb->setSatellitePosition(position);
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result LnbClient::sendDiseqcMessage(vector<uint8_t> diseqcMessage) {
-    if (mTunerLnb != NULL) {
+    if (mTunerLnb != nullptr) {
         Status s = mTunerLnb->sendDiseqcMessage(diseqcMessage);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mLnb != NULL) {
-        return mLnb->sendDiseqcMessage(diseqcMessage);
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result LnbClient::close() {
-    if (mTunerLnb != NULL) {
+    if (mTunerLnb != nullptr) {
         Status s = mTunerLnb->close();
-        mTunerLnb = NULL;
+        mTunerLnb = nullptr;
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mLnb != NULL) {
-        Result res = mLnb->close();
-        mLnb = NULL;
-        return res;
-    }
-
     return Result::INVALID_STATE;
 }
 
-/////////////// ILnbCallback ///////////////////////
-
-HidlLnbCallback::HidlLnbCallback(sp<LnbClientCallback> lnbClientCallback)
-        : mLnbClientCallback(lnbClientCallback) {}
-
-Return<void> HidlLnbCallback::onEvent(const LnbEventType lnbEventType) {
-    if (mLnbClientCallback != NULL) {
-        mLnbClientCallback->onEvent(lnbEventType);
-    }
-    return Void();
-}
-
-Return<void> HidlLnbCallback::onDiseqcMessage(const hidl_vec<uint8_t>& diseqcMessage) {
-    if (mLnbClientCallback != NULL) {
-        mLnbClientCallback->onDiseqcMessage(diseqcMessage);
-    }
-    return Void();
-}
-
 /////////////// TunerLnbCallback ///////////////////////
-
 TunerLnbCallback::TunerLnbCallback(sp<LnbClientCallback> lnbClientCallback)
         : mLnbClientCallback(lnbClientCallback) {}
 
-Status TunerLnbCallback::onEvent(int lnbEventType) {
-    if (mLnbClientCallback != NULL) {
-        mLnbClientCallback->onEvent(static_cast<LnbEventType>(lnbEventType));
+Status TunerLnbCallback::onEvent(LnbEventType lnbEventType) {
+    if (mLnbClientCallback != nullptr) {
+        mLnbClientCallback->onEvent(lnbEventType);
         return Status::ok();
     }
     return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
 }
 
 Status TunerLnbCallback::onDiseqcMessage(const vector<uint8_t>& diseqcMessage) {
-    if (mLnbClientCallback != NULL) {
-        hidl_vec<uint8_t> msg(begin(diseqcMessage), end(diseqcMessage));
-        mLnbClientCallback->onDiseqcMessage(msg);
+    if (mLnbClientCallback != nullptr) {
+        mLnbClientCallback->onDiseqcMessage(diseqcMessage);
         return Status::ok();
     }
     return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
diff --git a/media/jni/tuner/LnbClient.h b/media/jni/tuner/LnbClient.h
index 7c6118c..86e3f67 100644
--- a/media/jni/tuner/LnbClient.h
+++ b/media/jni/tuner/LnbClient.h
@@ -17,31 +17,24 @@
 #ifndef _ANDROID_MEDIA_TV_LNB_CLIENT_H_
 #define _ANDROID_MEDIA_TV_LNB_CLIENT_H_
 
+#include <aidl/android/hardware/tv/tuner/LnbPosition.h>
+#include <aidl/android/hardware/tv/tuner/LnbTone.h>
+#include <aidl/android/hardware/tv/tuner/LnbVoltage.h>
 #include <aidl/android/media/tv/tuner/BnTunerLnbCallback.h>
 #include <aidl/android/media/tv/tuner/ITunerLnb.h>
-#include <android/hardware/tv/tuner/1.0/ILnb.h>
-#include <android/hardware/tv/tuner/1.0/ILnbCallback.h>
-#include <android/hardware/tv/tuner/1.1/types.h>
+#include <utils/RefBase.h>
 
 #include "ClientHelper.h"
 #include "LnbClientCallback.h"
 
 using Status = ::ndk::ScopedAStatus;
 
+using ::aidl::android::hardware::tv::tuner::LnbPosition;
+using ::aidl::android::hardware::tv::tuner::LnbTone;
+using ::aidl::android::hardware::tv::tuner::LnbVoltage;
 using ::aidl::android::media::tv::tuner::BnTunerLnbCallback;
 using ::aidl::android::media::tv::tuner::ITunerLnb;
 
-using ::android::hardware::Return;
-using ::android::hardware::Void;
-using ::android::hardware::hidl_vec;
-using ::android::hardware::tv::tuner::V1_0::ILnb;
-using ::android::hardware::tv::tuner::V1_0::ILnbCallback;
-using ::android::hardware::tv::tuner::V1_0::LnbId;
-using ::android::hardware::tv::tuner::V1_0::LnbPosition;
-using ::android::hardware::tv::tuner::V1_0::LnbTone;
-using ::android::hardware::tv::tuner::V1_0::LnbVoltage;
-using ::android::hardware::tv::tuner::V1_0::Result;
-
 using namespace std;
 
 namespace android {
@@ -51,33 +44,19 @@
 public:
     TunerLnbCallback(sp<LnbClientCallback> lnbClientCallback);
 
-    Status onEvent(int lnbEventType);
+    Status onEvent(LnbEventType lnbEventType);
     Status onDiseqcMessage(const vector<uint8_t>& diseqcMessage);
 
 private:
     sp<LnbClientCallback> mLnbClientCallback;
 };
 
-struct HidlLnbCallback : public ILnbCallback {
-
-public:
-    HidlLnbCallback(sp<LnbClientCallback> lnbClientCallback);
-    virtual Return<void> onEvent(const LnbEventType lnbEventType);
-    virtual Return<void> onDiseqcMessage(const hidl_vec<uint8_t>& diseqcMessage);
-
-private:
-    sp<LnbClientCallback> mLnbClientCallback;
-};
-
 struct LnbClient : public RefBase {
 
 public:
     LnbClient(shared_ptr<ITunerLnb> tunerLnb);
     ~LnbClient();
 
-    // TODO: remove after migration to Tuner Service is done.
-    void setHidlLnb(sp<ILnb> lnb);
-
     /**
      * Set the lnb callback.
      */
@@ -109,8 +88,6 @@
     Result close();
 
     shared_ptr<ITunerLnb> getAidlLnb() { return mTunerLnb; }
-    void setId(LnbId id) { mId = id; }
-    LnbId getId() { return mId; }
 
 private:
     /**
@@ -118,15 +95,6 @@
      * opens an Lnb. Default null when lnb is not opened.
      */
     shared_ptr<ITunerLnb> mTunerLnb;
-
-    /**
-     * A Lnb HAL interface that is ready before migrating to the TunerLnb.
-     * This is a temprary interface before Tuner Framework migrates to use TunerService.
-     * Default null when the HAL service does not exist.
-     */
-    sp<ILnb> mLnb;
-
-    LnbId mId;
 };
 }  // namespace android
 
diff --git a/media/jni/tuner/LnbClientCallback.h b/media/jni/tuner/LnbClientCallback.h
index 253d7ef..612514f 100644
--- a/media/jni/tuner/LnbClientCallback.h
+++ b/media/jni/tuner/LnbClientCallback.h
@@ -17,8 +17,9 @@
 #ifndef _ANDROID_MEDIA_TV_LNB_CLIENT_CALLBACK_H_
 #define _ANDROID_MEDIA_TV_LNB_CLIENT_CALLBACK_H_
 
-using ::android::hardware::hidl_vec;
-using ::android::hardware::tv::tuner::V1_0::LnbEventType;
+#include <utils/RefBase.h>
+
+using ::aidl::android::hardware::tv::tuner::LnbEventType;
 
 using namespace std;
 
@@ -26,8 +27,8 @@
 
 struct LnbClientCallback : public RefBase {
     virtual void onEvent(const LnbEventType lnbEventType);
-    virtual void onDiseqcMessage(const hidl_vec<uint8_t>& diseqcMessage);
+    virtual void onDiseqcMessage(const vector<uint8_t>& diseqcMessage);
 };
 }  // namespace android
 
-#endif  // _ANDROID_MEDIA_TV_LNB_CLIENT_CALLBACK_H_
\ No newline at end of file
+#endif // _ANDROID_MEDIA_TV_LNB_CLIENT_CALLBACK_H_
diff --git a/media/jni/tuner/TimeFilterClient.cpp b/media/jni/tuner/TimeFilterClient.cpp
index e123c9f..40dba8b 100644
--- a/media/jni/tuner/TimeFilterClient.cpp
+++ b/media/jni/tuner/TimeFilterClient.cpp
@@ -16,14 +16,15 @@
 
 #define LOG_TAG "TimeFilterClient"
 
+#include "TimeFilterClient.h"
+
+#include <aidl/android/hardware/tv/tuner/Constant64Bit.h>
 #include <android-base/logging.h>
 #include <utils/Log.h>
 
 #include "ClientHelper.h"
-#include "TimeFilterClient.h"
 
-using ::android::hardware::tv::tuner::V1_0::Result;
-using ::android::hardware::tv::tuner::V1_1::Constant64Bit;
+using ::aidl::android::hardware::tv::tuner::Constant64Bit;
 
 namespace android {
 
@@ -34,108 +35,60 @@
 }
 
 TimeFilterClient::~TimeFilterClient() {
-    mTunerTimeFilter = NULL;
-    mTimeFilter = NULL;
+    mTunerTimeFilter = nullptr;
 }
 
-// TODO: remove after migration to Tuner Service is done.
-void TimeFilterClient::setHidlTimeFilter(sp<ITimeFilter> timeFilter) {
-    mTimeFilter = timeFilter;
-}
-
-Result TimeFilterClient::setTimeStamp(long timeStamp) {
-    if (mTunerTimeFilter != NULL) {
+Result TimeFilterClient::setTimeStamp(int64_t timeStamp) {
+    if (mTunerTimeFilter != nullptr) {
         Status s = mTunerTimeFilter->setTimeStamp(timeStamp);
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mTimeFilter != NULL) {
-        return mTimeFilter->setTimeStamp(timeStamp);
-    }
-
     return Result::INVALID_STATE;
 }
 
 Result TimeFilterClient::clearTimeStamp() {
-    if (mTunerTimeFilter != NULL) {
+    if (mTunerTimeFilter != nullptr) {
         Status s = mTunerTimeFilter->clearTimeStamp();
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mTimeFilter != NULL) {
-        return mTimeFilter->clearTimeStamp();
-    }
-
     return Result::INVALID_STATE;
 }
 
-long TimeFilterClient::getTimeStamp() {
-    if (mTunerTimeFilter != NULL) {
+int64_t TimeFilterClient::getTimeStamp() {
+    if (mTunerTimeFilter != nullptr) {
         int64_t timeStamp;
         Status s = mTunerTimeFilter->getTimeStamp(&timeStamp);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
+        if (!s.isOk()) {
+            return static_cast<int64_t>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
         }
         return timeStamp;
     }
 
-    if (mTimeFilter != NULL) {
-        Result res;
-        long timestamp;
-        mTimeFilter->getTimeStamp(
-                [&](Result r, uint64_t t) {
-                    res = r;
-                    timestamp = t;
-                });
-        if (res != Result::SUCCESS) {
-            return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
-        }
-        return timestamp;
-    }
-
-    return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
+    return static_cast<int64_t>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
 }
 
-long TimeFilterClient::getSourceTime() {
-    if (mTunerTimeFilter != NULL) {
+int64_t TimeFilterClient::getSourceTime() {
+    if (mTunerTimeFilter != nullptr) {
         int64_t sourceTime;
         Status s = mTunerTimeFilter->getTimeStamp(&sourceTime);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
+        if (!s.isOk()) {
+            return static_cast<int64_t>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
         }
         return sourceTime;
     }
 
-    if (mTimeFilter != NULL) {
-        Result res;
-        long sourceTime;
-        mTimeFilter->getSourceTime(
-                [&](Result r, uint64_t t) {
-                    res = r;
-                    sourceTime = t;
-                });
-        if (res != Result::SUCCESS) {
-            return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
-        }
-        return sourceTime;
-    }
-
-    return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
+    return static_cast<int64_t>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
 }
 
 Result TimeFilterClient::close() {
-    if (mTunerTimeFilter != NULL) {
+    if (mTunerTimeFilter != nullptr) {
         Status s = mTunerTimeFilter->close();
-        mTunerTimeFilter = NULL;
+        mTunerTimeFilter = nullptr;
         return ClientHelper::getServiceSpecificErrorCode(s);
     }
 
-    if (mTimeFilter != NULL) {
-        Result res = mTimeFilter->close();
-        mTimeFilter = NULL;
-        return res;
-    }
-
     return Result::INVALID_STATE;
 }
 }  // namespace android
diff --git a/media/jni/tuner/TimeFilterClient.h b/media/jni/tuner/TimeFilterClient.h
index 56ddd68..46f33be 100644
--- a/media/jni/tuner/TimeFilterClient.h
+++ b/media/jni/tuner/TimeFilterClient.h
@@ -17,18 +17,14 @@
 #ifndef _ANDROID_MEDIA_TV_TIME_FILTER_CLIENT_H_
 #define _ANDROID_MEDIA_TV_TIME_FILTER_CLIENT_H_
 
+#include <aidl/android/hardware/tv/tuner/Result.h>
 #include <aidl/android/media/tv/tuner/ITunerTimeFilter.h>
-#include <android/hardware/tv/tuner/1.0/ITimeFilter.h>
-#include <android/hardware/tv/tuner/1.1/types.h>
-
-using ::aidl::android::media::tv::tuner::ITunerTimeFilter;
+#include <utils/RefBase.h>
 
 using Status = ::ndk::ScopedAStatus;
-using ::android::hardware::Return;
-using ::android::hardware::Void;
-using ::android::hardware::hidl_vec;
-using ::android::hardware::tv::tuner::V1_0::ITimeFilter;
-using ::android::hardware::tv::tuner::V1_0::Result;
+
+using ::aidl::android::hardware::tv::tuner::Result;
+using ::aidl::android::media::tv::tuner::ITunerTimeFilter;
 
 using namespace std;
 
@@ -40,13 +36,10 @@
     TimeFilterClient(shared_ptr<ITunerTimeFilter> tunerTimeFilter);
     ~TimeFilterClient();
 
-    // TODO: remove after migration to Tuner Service is done.
-    void setHidlTimeFilter(sp<ITimeFilter> timeFilter);
-
     /**
      * Set time stamp for time based filter.
      */
-    Result setTimeStamp(long timeStamp);
+    Result setTimeStamp(int64_t timeStamp);
 
     /**
      * Clear the time stamp in the time filter.
@@ -56,12 +49,12 @@
     /**
      * Get the current time in the time filter.
      */
-    long getTimeStamp();
+    int64_t getTimeStamp();
 
     /**
      * Get the time from the beginning of current data source.
      */
-    long getSourceTime();
+    int64_t getSourceTime();
 
     /**
      * Releases the Time Filter instance.
@@ -74,13 +67,6 @@
      * opens an TimeFilter. Default null when time filter is not opened.
      */
     shared_ptr<ITunerTimeFilter> mTunerTimeFilter;
-
-    /**
-     * A TimeFilter HAL interface that is ready before migrating to the TunerTimeFilter.
-     * This is a temprary interface before Tuner Framework migrates to use TunerService.
-     * Default null when the HAL service does not exist.
-     */
-    sp<ITimeFilter> mTimeFilter;
 };
 }  // namespace android
 
diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp
index e05dba6..d19ee0d4 100644
--- a/media/jni/tuner/TunerClient.cpp
+++ b/media/jni/tuner/TunerClient.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,31 +22,20 @@
 
 #include "TunerClient.h"
 
-using ::aidl::android::media::tv::tuner::TunerFrontendCapabilities;
-using ::aidl::android::media::tv::tuner::TunerFrontendDtmbCapabilities;
-using ::android::hardware::tv::tuner::V1_0::FrontendId;
-using ::android::hardware::tv::tuner::V1_0::FrontendStatusType;
-using ::android::hardware::tv::tuner::V1_0::FrontendType;
+using ::aidl::android::hardware::tv::tuner::FrontendStatusType;
+using ::aidl::android::hardware::tv::tuner::FrontendType;
 
 namespace android {
 
-sp<ITuner> TunerClient::mTuner;
-sp<::android::hardware::tv::tuner::V1_1::ITuner> TunerClient::mTuner_1_1;
 shared_ptr<ITunerService> TunerClient::mTunerService;
-int TunerClient::mTunerVersion;
+int32_t TunerClient::mTunerVersion;
 
 /////////////// TunerClient ///////////////////////
 
 TunerClient::TunerClient() {
-    // Get HIDL Tuner in migration stage.
-    getHidlTuner();
-    if (mTuner != NULL) {
-        updateTunerResources();
-    }
-    // Connect with Tuner Service.
     ::ndk::SpAIBinder binder(AServiceManager_getService("media.tuner"));
     mTunerService = ITunerService::fromBinder(binder);
-    if (mTunerService == NULL) {
+    if (mTunerService == nullptr) {
         ALOGE("Failed to get tuner service");
     } else {
         mTunerService->getTunerHalVersion(&mTunerVersion);
@@ -54,575 +43,124 @@
 }
 
 TunerClient::~TunerClient() {
-    mTuner = NULL;
-    mTuner_1_1 = NULL;
     mTunerVersion = 0;
-    mTunerService = NULL;
+    mTunerService = nullptr;
 }
 
-vector<FrontendId> TunerClient::getFrontendIds() {
-    vector<FrontendId> ids;
+vector<int32_t> TunerClient::getFrontendIds() {
+    vector<int32_t> ids;
 
-    if (mTunerService != NULL) {
-        vector<int32_t> v;
-        Status s = mTunerService->getFrontendIds(&v);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS || v.size() == 0) {
+    if (mTunerService != nullptr) {
+        Status s = mTunerService->getFrontendIds(&ids);
+        if (!s.isOk()) {
             ids.clear();
-            return ids;
         }
-        for (int32_t id : v) {
-            ids.push_back(static_cast<FrontendId>(id));
-        }
-        return ids;
-    }
-
-    if (mTuner != NULL) {
-        Result res;
-        mTuner->getFrontendIds([&](Result r, const hardware::hidl_vec<FrontendId>& frontendIds) {
-            res = r;
-            ids = frontendIds;
-        });
-        if (res != Result::SUCCESS || ids.size() == 0) {
-            ALOGW("Frontend ids not available");
-            ids.clear();
-            return ids;
-        }
-        return ids;
     }
 
     return ids;
 }
 
-
-sp<FrontendClient> TunerClient::openFrontend(int frontendHandle) {
-    if (mTunerService != NULL) {
+sp<FrontendClient> TunerClient::openFrontend(int32_t frontendHandle) {
+    if (mTunerService != nullptr) {
         shared_ptr<ITunerFrontend> tunerFrontend;
         Status s = mTunerService->openFrontend(frontendHandle, &tunerFrontend);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS
-                || tunerFrontend == NULL) {
-            return NULL;
+        if (!s.isOk() || tunerFrontend == nullptr) {
+            return nullptr;
         }
-        int id;
+        int32_t id;
         s = tunerFrontend->getFrontendId(&id);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return NULL;
+        if (!s.isOk()) {
+            tunerFrontend->close();
+            return nullptr;
         }
-        TunerFrontendInfo aidlFrontendInfo;
-        s = mTunerService->getFrontendInfo(id, &aidlFrontendInfo);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return NULL;
+        FrontendInfo frontendInfo;
+        s = mTunerService->getFrontendInfo(id, &frontendInfo);
+        if (!s.isOk()) {
+            tunerFrontend->close();
+            return nullptr;
         }
-        return new FrontendClient(tunerFrontend, aidlFrontendInfo.type);
+        return new FrontendClient(tunerFrontend, frontendInfo.type);
     }
 
-    if (mTuner != NULL) {
-        int id = getResourceIdFromHandle(frontendHandle, FRONTEND);
-        sp<IFrontend> hidlFrontend = openHidlFrontendById(id);
-        if (hidlFrontend != NULL) {
-            FrontendInfo hidlInfo;
-            Result res = getHidlFrontendInfo(id, hidlInfo);
-            if (res != Result::SUCCESS) {
-                return NULL;
-            }
-            sp<FrontendClient> frontendClient = new FrontendClient(
-                    NULL, (int)hidlInfo.type);
-            frontendClient->setHidlFrontend(hidlFrontend);
-            frontendClient->setId(id);
-            return frontendClient;
-        }
-    }
-
-    return NULL;
+    return nullptr;
 }
 
-shared_ptr<FrontendInfo> TunerClient::getFrontendInfo(int id) {
-    if (mTunerService != NULL) {
-        TunerFrontendInfo aidlFrontendInfo;
+shared_ptr<FrontendInfo> TunerClient::getFrontendInfo(int32_t id) {
+    if (mTunerService != nullptr) {
+        FrontendInfo aidlFrontendInfo;
         Status s = mTunerService->getFrontendInfo(id, &aidlFrontendInfo);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return NULL;
+        if (!s.isOk()) {
+            return nullptr;
         }
-        return make_shared<FrontendInfo>(frontendInfoAidlToHidl(aidlFrontendInfo));
+        return make_shared<FrontendInfo>(aidlFrontendInfo);
     }
 
-    if (mTuner != NULL) {
-        FrontendInfo hidlInfo;
-        Result res = getHidlFrontendInfo(id, hidlInfo);
-        if (res != Result::SUCCESS) {
-            return NULL;
-        }
-        return make_shared<FrontendInfo>(hidlInfo);
-    }
-
-    return NULL;
+    return nullptr;
 }
 
-shared_ptr<FrontendDtmbCapabilities> TunerClient::getFrontendDtmbCapabilities(int id) {
-    if (mTunerService != NULL) {
-        TunerFrontendDtmbCapabilities dtmbCaps;
-        Status s = mTunerService->getFrontendDtmbCapabilities(id, &dtmbCaps);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return NULL;
-        }
-        FrontendDtmbCapabilities hidlCaps{
-            .transmissionModeCap = static_cast<uint32_t>(dtmbCaps.transmissionModeCap),
-            .bandwidthCap = static_cast<uint32_t>(dtmbCaps.bandwidthCap),
-            .modulationCap = static_cast<uint32_t>(dtmbCaps.modulationCap),
-            .codeRateCap = static_cast<uint32_t>(dtmbCaps.codeRateCap),
-            .guardIntervalCap = static_cast<uint32_t>(dtmbCaps.guardIntervalCap),
-            .interleaveModeCap = static_cast<uint32_t>(dtmbCaps.interleaveModeCap),
-        };
-        return make_shared<FrontendDtmbCapabilities>(hidlCaps);
-    }
-
-    if (mTuner_1_1 != NULL) {
-        Result result;
-        FrontendDtmbCapabilities dtmbCaps;
-        mTuner_1_1->getFrontendDtmbCapabilities(id,
-                [&](Result r, const FrontendDtmbCapabilities& caps) {
-            dtmbCaps = caps;
-            result = r;
-        });
-        if (result == Result::SUCCESS) {
-            return make_shared<FrontendDtmbCapabilities>(dtmbCaps);
-        }
-    }
-
-    return NULL;
-}
-
-sp<DemuxClient> TunerClient::openDemux(int demuxHandle) {
-    if (mTunerService != NULL) {
+sp<DemuxClient> TunerClient::openDemux(int32_t demuxHandle) {
+    if (mTunerService != nullptr) {
         shared_ptr<ITunerDemux> tunerDemux;
         Status s = mTunerService->openDemux(demuxHandle, &tunerDemux);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return NULL;
+        if (!s.isOk()) {
+            return nullptr;
         }
         return new DemuxClient(tunerDemux);
     }
 
-    if (mTuner != NULL) {
-        sp<DemuxClient> demuxClient = new DemuxClient(NULL);
-        int demuxId;
-        sp<IDemux> hidlDemux = openHidlDemux(demuxId);
-        if (hidlDemux != NULL) {
-            demuxClient->setHidlDemux(hidlDemux);
-            demuxClient->setId(demuxId);
-            return demuxClient;
-        }
-    }
-
-    return NULL;
+    return nullptr;
 }
 
 shared_ptr<DemuxCapabilities> TunerClient::getDemuxCaps() {
-    if (mTunerService != NULL) {
-        TunerDemuxCapabilities aidlCaps;
+    if (mTunerService != nullptr) {
+        DemuxCapabilities aidlCaps;
         Status s = mTunerService->getDemuxCaps(&aidlCaps);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return NULL;
+        if (!s.isOk()) {
+            return nullptr;
         }
-        return make_shared<DemuxCapabilities>(getHidlDemuxCaps(aidlCaps));
+        return make_shared<DemuxCapabilities>(aidlCaps);
     }
 
-    if (mTuner != NULL) {
-        Result res;
-        DemuxCapabilities caps;
-        mTuner->getDemuxCaps([&](Result r, const DemuxCapabilities& demuxCaps) {
-            caps = demuxCaps;
-            res = r;
-        });
-        if (res == Result::SUCCESS) {
-            return make_shared<DemuxCapabilities>(caps);
-        }
-    }
-
-    return NULL;
+    return nullptr;
 }
 
-sp<DescramblerClient> TunerClient::openDescrambler(int descramblerHandle) {
-    if (mTunerService != NULL) {
+sp<DescramblerClient> TunerClient::openDescrambler(int32_t descramblerHandle) {
+    if (mTunerService != nullptr) {
         shared_ptr<ITunerDescrambler> tunerDescrambler;
         Status s = mTunerService->openDescrambler(descramblerHandle, &tunerDescrambler);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return NULL;
+        if (!s.isOk()) {
+            return nullptr;
         }
         return new DescramblerClient(tunerDescrambler);
     }
 
-    if (mTuner != NULL) {
-        sp<DescramblerClient> descramblerClient = new DescramblerClient(NULL);
-        sp<IDescrambler> hidlDescrambler = openHidlDescrambler();
-        if (hidlDescrambler != NULL) {
-            descramblerClient->setHidlDescrambler(hidlDescrambler);
-            return descramblerClient;
-        }
-    }
-
-    return NULL;
+    return nullptr;
 }
 
-sp<LnbClient> TunerClient::openLnb(int lnbHandle) {
-    if (mTunerService != NULL) {
+sp<LnbClient> TunerClient::openLnb(int32_t lnbHandle) {
+    if (mTunerService != nullptr) {
         shared_ptr<ITunerLnb> tunerLnb;
         Status s = mTunerService->openLnb(lnbHandle, &tunerLnb);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return NULL;
+        if (!s.isOk()) {
+            return nullptr;
         }
         return new LnbClient(tunerLnb);
     }
 
-    if (mTuner != NULL) {
-        int id = getResourceIdFromHandle(lnbHandle, LNB);
-        sp<LnbClient> lnbClient = new LnbClient(NULL);
-        sp<ILnb> hidlLnb = openHidlLnbById(id);
-        if (hidlLnb != NULL) {
-            lnbClient->setHidlLnb(hidlLnb);
-            lnbClient->setId(id);
-            return lnbClient;
-        }
-    }
-
-    return NULL;
+    return nullptr;
 }
 
 sp<LnbClient> TunerClient::openLnbByName(string lnbName) {
-    if (mTunerService != NULL) {
+    if (mTunerService != nullptr) {
         shared_ptr<ITunerLnb> tunerLnb;
         Status s = mTunerService->openLnbByName(lnbName, &tunerLnb);
-        if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
-            return NULL;
+        if (!s.isOk()) {
+            return nullptr;
         }
         return new LnbClient(tunerLnb);
     }
 
-    if (mTuner != NULL) {
-        sp<LnbClient> lnbClient = new LnbClient(NULL);
-        LnbId id;
-        sp<ILnb> hidlLnb = openHidlLnbByName(lnbName, id);
-        if (hidlLnb != NULL) {
-            lnbClient->setHidlLnb(hidlLnb);
-            lnbClient->setId(id);
-            return lnbClient;
-        }
-    }
-
-    return NULL;
+    return nullptr;
 }
 
-/////////////// TunerClient Helper Methods ///////////////////////
-
-void TunerClient::updateTunerResources() {
-    if (mTuner == NULL) {
-        return;
-    }
-
-    // Connect with Tuner Resource Manager.
-    ::ndk::SpAIBinder binder(AServiceManager_getService("tv_tuner_resource_mgr"));
-    mTunerResourceManager = ITunerResourceManager::fromBinder(binder);
-
-    updateFrontendResources();
-    updateLnbResources();
-    // TODO: update Demux, Descrambler.
-}
-
-// TODO: remove after migration to Tuner Service is done.
-void TunerClient::updateFrontendResources() {
-    vector<FrontendId> ids = getFrontendIds();
-    if (ids.size() == 0) {
-        return;
-    }
-    vector<TunerFrontendInfo> infos;
-    for (int i = 0; i < ids.size(); i++) {
-        shared_ptr<FrontendInfo> frontendInfo = getFrontendInfo((int)ids[i]);
-        if (frontendInfo == NULL) {
-            continue;
-        }
-        TunerFrontendInfo tunerFrontendInfo{
-            .handle = getResourceHandleFromId((int)ids[i], FRONTEND),
-            .type = static_cast<int>(frontendInfo->type),
-            .exclusiveGroupId = static_cast<int>(frontendInfo->exclusiveGroupId),
-        };
-        infos.push_back(tunerFrontendInfo);
-    }
-    mTunerResourceManager->setFrontendInfoList(infos);
-}
-
-void TunerClient::updateLnbResources() {
-    vector<int> handles = getLnbHandles();
-    if (handles.size() == 0) {
-        return;
-    }
-    mTunerResourceManager->setLnbInfoList(handles);
-}
-
-sp<ITuner> TunerClient::getHidlTuner() {
-    if (mTuner == NULL) {
-        mTunerVersion = TUNER_HAL_VERSION_UNKNOWN;
-        mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::getService();
-
-        if (mTuner_1_1 == NULL) {
-            ALOGW("Failed to get tuner 1.1 service.");
-            mTuner = ITuner::getService();
-            if (mTuner == NULL) {
-                ALOGW("Failed to get tuner 1.0 service.");
-            } else {
-                mTunerVersion = TUNER_HAL_VERSION_1_0;
-            }
-        } else {
-            mTuner = static_cast<sp<ITuner>>(mTuner_1_1);
-            mTunerVersion = TUNER_HAL_VERSION_1_1;
-         }
-     }
-     return mTuner;
-}
-
-sp<IFrontend> TunerClient::openHidlFrontendById(int id) {
-    sp<IFrontend> fe;
-    Result res;
-    mTuner->openFrontendById(id, [&](Result r, const sp<IFrontend>& frontend) {
-        fe = frontend;
-        res = r;
-    });
-    if (res != Result::SUCCESS || fe == nullptr) {
-        ALOGE("Failed to open frontend");
-        return NULL;
-    }
-    return fe;
-}
-
-Result TunerClient::getHidlFrontendInfo(int id, FrontendInfo& feInfo) {
-    Result res;
-    mTuner->getFrontendInfo(id, [&](Result r, const FrontendInfo& info) {
-        feInfo = info;
-        res = r;
-    });
-    return res;
-}
-
-sp<IDemux> TunerClient::openHidlDemux(int& demuxId) {
-    sp<IDemux> demux;
-    Result res;
-
-    mTuner->openDemux([&](Result result, uint32_t id, const sp<IDemux>& demuxSp) {
-        demux = demuxSp;
-        demuxId = id;
-        res = result;
-    });
-    if (res != Result::SUCCESS || demux == nullptr) {
-        ALOGE("Failed to open demux");
-        return NULL;
-    }
-    return demux;
-}
-
-sp<ILnb> TunerClient::openHidlLnbById(int id) {
-    sp<ILnb> lnb;
-    Result res;
-
-    mTuner->openLnbById(id, [&](Result r, const sp<ILnb>& lnbSp) {
-        res = r;
-        lnb = lnbSp;
-    });
-    if (res != Result::SUCCESS || lnb == nullptr) {
-        ALOGE("Failed to open lnb by id");
-        return NULL;
-    }
-    return lnb;
-}
-
-sp<ILnb> TunerClient::openHidlLnbByName(string name, LnbId& lnbId) {
-    sp<ILnb> lnb;
-    Result res;
-
-    mTuner->openLnbByName(name, [&](Result r, LnbId id, const sp<ILnb>& lnbSp) {
-        res = r;
-        lnb = lnbSp;
-        lnbId = id;
-    });
-    if (res != Result::SUCCESS || lnb == nullptr) {
-        ALOGE("Failed to open lnb by name");
-        return NULL;
-    }
-    return lnb;
-}
-
-// TODO: remove after migration to Tuner Service is done.
-vector<int> TunerClient::getLnbHandles() {
-    vector<int> lnbHandles;
-    if (mTuner != NULL) {
-        Result res;
-        vector<LnbId> lnbIds;
-        mTuner->getLnbIds([&](Result r, const hardware::hidl_vec<LnbId>& ids) {
-            lnbIds = ids;
-            res = r;
-        });
-        if (res != Result::SUCCESS || lnbIds.size() == 0) {
-            ALOGW("Lnb isn't available");
-        } else {
-            for (int i = 0; i < lnbIds.size(); i++) {
-                lnbHandles.push_back(getResourceHandleFromId((int)lnbIds[i], LNB));
-            }
-        }
-    }
-
-    return lnbHandles;
-}
-
-sp<IDescrambler> TunerClient::openHidlDescrambler() {
-    sp<IDescrambler> descrambler;
-    Result res;
-
-    mTuner->openDescrambler([&](Result r, const sp<IDescrambler>& descramblerSp) {
-        res = r;
-        descrambler = descramblerSp;
-    });
-
-    if (res != Result::SUCCESS || descrambler == NULL) {
-        return NULL;
-    }
-
-    return descrambler;
-}
-
-DemuxCapabilities TunerClient::getHidlDemuxCaps(TunerDemuxCapabilities& aidlCaps) {
-    DemuxCapabilities caps{
-        .numDemux = (uint32_t)aidlCaps.numDemux,
-        .numRecord = (uint32_t)aidlCaps.numRecord,
-        .numPlayback = (uint32_t)aidlCaps.numPlayback,
-        .numTsFilter = (uint32_t)aidlCaps.numTsFilter,
-        .numSectionFilter = (uint32_t)aidlCaps.numSectionFilter,
-        .numAudioFilter = (uint32_t)aidlCaps.numAudioFilter,
-        .numVideoFilter = (uint32_t)aidlCaps.numVideoFilter,
-        .numPesFilter = (uint32_t)aidlCaps.numPesFilter,
-        .numPcrFilter = (uint32_t)aidlCaps.numPcrFilter,
-        .numBytesInSectionFilter = (uint32_t)aidlCaps.numBytesInSectionFilter,
-        .filterCaps = (uint32_t)aidlCaps.filterCaps,
-        .bTimeFilter = aidlCaps.bTimeFilter,
-    };
-    caps.linkCaps.resize(aidlCaps.linkCaps.size());
-    copy(aidlCaps.linkCaps.begin(), aidlCaps.linkCaps.end(), caps.linkCaps.begin());
-    return caps;
-}
-
-FrontendInfo TunerClient::frontendInfoAidlToHidl(TunerFrontendInfo aidlFrontendInfo) {
-    FrontendInfo hidlFrontendInfo {
-        .type = static_cast<FrontendType>(aidlFrontendInfo.type),
-        .minFrequency = static_cast<uint32_t>(aidlFrontendInfo.minFrequency),
-        .maxFrequency = static_cast<uint32_t>(aidlFrontendInfo.maxFrequency),
-        .minSymbolRate = static_cast<uint32_t>(aidlFrontendInfo.minSymbolRate),
-        .maxSymbolRate = static_cast<uint32_t>(aidlFrontendInfo.maxSymbolRate),
-        .acquireRange = static_cast<uint32_t>(aidlFrontendInfo.acquireRange),
-        .exclusiveGroupId = static_cast<uint32_t>(aidlFrontendInfo.exclusiveGroupId),
-    };
-
-    int size = aidlFrontendInfo.statusCaps.size();
-    hidlFrontendInfo.statusCaps.resize(size);
-    for (int i = 0; i < size; i++) {
-        hidlFrontendInfo.statusCaps[i] =
-                static_cast<FrontendStatusType>(aidlFrontendInfo.statusCaps[i]);
-    }
-
-    switch (aidlFrontendInfo.caps.getTag()) {
-        case TunerFrontendCapabilities::analogCaps: {
-            auto analog = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::analogCaps>();
-            hidlFrontendInfo.frontendCaps.analogCaps({
-                .typeCap = static_cast<uint32_t>(analog.typeCap),
-                .sifStandardCap = static_cast<uint32_t>(analog.sifStandardCap),
-            });
-            break;
-        }
-        case TunerFrontendCapabilities::atscCaps: {
-            auto atsc = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::atscCaps>();
-            hidlFrontendInfo.frontendCaps.atscCaps({
-                .modulationCap = static_cast<uint32_t>(atsc.modulationCap),
-            });
-            break;
-        }
-        case TunerFrontendCapabilities::atsc3Caps: {
-            auto atsc3 = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::atsc3Caps>();
-            hidlFrontendInfo.frontendCaps.atsc3Caps({
-                .bandwidthCap = static_cast<uint32_t>(atsc3.bandwidthCap),
-                .modulationCap = static_cast<uint32_t>(atsc3.modulationCap),
-                .timeInterleaveModeCap = static_cast<uint32_t>(atsc3.timeInterleaveModeCap),
-                .codeRateCap = static_cast<uint32_t>(atsc3.codeRateCap),
-                .fecCap = static_cast<uint32_t>(atsc3.fecCap),
-                .demodOutputFormatCap = static_cast<uint8_t>(atsc3.demodOutputFormatCap),
-            });
-            break;
-        }
-        case TunerFrontendCapabilities::cableCaps: {
-            auto cable = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::cableCaps>();
-            hidlFrontendInfo.frontendCaps.dvbcCaps({
-                .modulationCap = static_cast<uint32_t>(cable.modulationCap),
-                .fecCap = static_cast<uint64_t>(cable.codeRateCap),
-                .annexCap = static_cast<uint8_t>(cable.annexCap),
-            });
-            break;
-        }
-        case TunerFrontendCapabilities::dvbsCaps: {
-            auto dvbs = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::dvbsCaps>();
-            hidlFrontendInfo.frontendCaps.dvbsCaps({
-                .modulationCap = static_cast<int32_t>(dvbs.modulationCap),
-                .innerfecCap = static_cast<uint64_t>(dvbs.codeRateCap),
-                .standard = static_cast<uint8_t>(dvbs.standard),
-            });
-            break;
-        }
-        case TunerFrontendCapabilities::dvbtCaps: {
-            auto dvbt = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::dvbtCaps>();
-            hidlFrontendInfo.frontendCaps.dvbtCaps({
-                .transmissionModeCap = static_cast<uint32_t>(dvbt.transmissionModeCap),
-                .bandwidthCap = static_cast<uint32_t>(dvbt.bandwidthCap),
-                .constellationCap = static_cast<uint32_t>(dvbt.constellationCap),
-                .coderateCap = static_cast<uint32_t>(dvbt.codeRateCap),
-                .hierarchyCap = static_cast<uint32_t>(dvbt.hierarchyCap),
-                .guardIntervalCap = static_cast<uint32_t>(dvbt.guardIntervalCap),
-                .isT2Supported = dvbt.isT2Supported,
-                .isMisoSupported = dvbt.isMisoSupported,
-            });
-            break;
-        }
-        case TunerFrontendCapabilities::isdbsCaps: {
-            auto isdbs = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::isdbsCaps>();
-            hidlFrontendInfo.frontendCaps.isdbsCaps({
-                .modulationCap = static_cast<uint32_t>(isdbs.modulationCap),
-                .coderateCap = static_cast<uint32_t>(isdbs.codeRateCap),
-            });
-            break;
-        }
-        case TunerFrontendCapabilities::isdbs3Caps: {
-            auto isdbs3 = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::isdbs3Caps>();
-            hidlFrontendInfo.frontendCaps.isdbs3Caps({
-                .modulationCap = static_cast<uint32_t>(isdbs3.modulationCap),
-                .coderateCap = static_cast<uint32_t>(isdbs3.codeRateCap),
-            });
-            break;
-        }
-        case TunerFrontendCapabilities::isdbtCaps: {
-            auto isdbt = aidlFrontendInfo.caps.get<TunerFrontendCapabilities::isdbtCaps>();
-            hidlFrontendInfo.frontendCaps.isdbtCaps({
-                .modeCap = static_cast<uint32_t>(isdbt.modeCap),
-                .bandwidthCap = static_cast<uint32_t>(isdbt.bandwidthCap),
-                .modulationCap = static_cast<uint32_t>(isdbt.modulationCap),
-                .coderateCap = static_cast<uint32_t>(isdbt.codeRateCap),
-                .guardIntervalCap = static_cast<uint32_t>(isdbt.guardIntervalCap),
-            });
-            break;
-        }
-    }
-    return hidlFrontendInfo;
-}
-
-// TODO: remove after migration to Tuner Service is done.
-int TunerClient::getResourceIdFromHandle(int handle, int /*resourceType*/) {
-    return (handle & 0x00ff0000) >> 16;
-}
-
-// TODO: remove after migration to Tuner Service is done.
-int TunerClient::getResourceHandleFromId(int id, int resourceType) {
-    return (resourceType & 0x000000ff) << 24
-            | (id << 16)
-            | (mResourceRequestCount++ & 0xffff);
-}
 }  // namespace android
diff --git a/media/jni/tuner/TunerClient.h b/media/jni/tuner/TunerClient.h
index 9671cf7..641f106 100644
--- a/media/jni/tuner/TunerClient.h
+++ b/media/jni/tuner/TunerClient.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,12 +17,8 @@
 #ifndef _ANDROID_MEDIA_TV_TUNER_CLIENT_H_
 #define _ANDROID_MEDIA_TV_TUNER_CLIENT_H_
 
-#include <aidl/android/media/tv/tunerresourcemanager/ITunerResourceManager.h>
 #include <aidl/android/media/tv/tuner/ITunerService.h>
-#include <aidl/android/media/tv/tuner/TunerFrontendInfo.h>
 #include <android/binder_parcel_utils.h>
-#include <android/hardware/tv/tuner/1.1/ITuner.h>
-#include <android/hardware/tv/tuner/1.1/types.h>
 
 #include "DemuxClient.h"
 #include "ClientHelper.h"
@@ -32,32 +28,19 @@
 
 using Status = ::ndk::ScopedAStatus;
 
-using ::aidl::android::media::tv::tuner::TunerDemuxCapabilities;
+using ::aidl::android::hardware::tv::tuner::DemuxCapabilities;
+using ::aidl::android::hardware::tv::tuner::FrontendInfo;
+using ::aidl::android::hardware::tv::tuner::Result;
 using ::aidl::android::media::tv::tuner::ITunerService;
-using ::aidl::android::media::tv::tuner::TunerFrontendInfo;
-using ::aidl::android::media::tv::tunerresourcemanager::ITunerResourceManager;
-
-using ::android::hardware::tv::tuner::V1_0::DemuxCapabilities;
-using ::android::hardware::tv::tuner::V1_0::FrontendId;
-using ::android::hardware::tv::tuner::V1_0::ITuner;
-using ::android::hardware::tv::tuner::V1_0::LnbId;
-using ::android::hardware::tv::tuner::V1_0::Result;
-using ::android::hardware::tv::tuner::V1_1::FrontendDtmbCapabilities;
 
 using namespace std;
 
 namespace android {
 
-const static int TUNER_HAL_VERSION_UNKNOWN = 0;
-const static int TUNER_HAL_VERSION_1_0 = 1 << 16;
-const static int TUNER_HAL_VERSION_1_1 = (1 << 16) | 1;
-
-typedef enum {
-    FRONTEND,
-    LNB,
-    DEMUX,
-    DESCRAMBLER,
-} TunerResourceType;
+const static int32_t TUNER_HAL_VERSION_UNKNOWN = 0;
+const static int32_t TUNER_HAL_VERSION_1_0 = 1 << 16;
+const static int32_t TUNER_HAL_VERSION_1_1 = (1 << 16) | 1;
+const static int32_t TUNER_HAL_VERSION_2_0 = 2 << 16;
 
 struct TunerClient : public RefBase {
 
@@ -70,7 +53,7 @@
      *
      * @return a list of the available frontend ids
      */
-    vector<FrontendId> getFrontendIds();
+    vector<int32_t> getFrontendIds();
 
     /**
      * Open a new interface of FrontendClient given a frontendHandle.
@@ -78,7 +61,7 @@
      * @param frontendHandle the handle of the frontend granted by TRM.
      * @return a newly created FrontendClient interface.
      */
-    sp<FrontendClient> openFrontend(int frontendHandle);
+    sp<FrontendClient> openFrontend(int32_t frontendHandle);
 
     /**
      * Retrieve the granted frontend's information.
@@ -86,15 +69,7 @@
      * @param id the id of the frontend granted by TRM.
      * @return the information for the frontend.
      */
-    shared_ptr<FrontendInfo> getFrontendInfo(int id);
-
-    /**
-     * Retrieve the DTMB frontend's capabilities.
-     *
-     * @param id the id of the DTMB frontend.
-     * @return the capabilities of the frontend.
-     */
-    shared_ptr<FrontendDtmbCapabilities> getFrontendDtmbCapabilities(int id);
+    shared_ptr<FrontendInfo> getFrontendInfo(int32_t id);
 
     /**
      * Open a new interface of DemuxClient given a demuxHandle.
@@ -102,7 +77,7 @@
      * @param demuxHandle the handle of the demux granted by TRM.
      * @return a newly created DemuxClient interface.
      */
-    sp<DemuxClient> openDemux(int demuxHandle);
+    sp<DemuxClient> openDemux(int32_t demuxHandle);
 
     /**
      * Retrieve the Demux capabilities.
@@ -117,7 +92,7 @@
      * @param descramblerHandle the handle of the descrambler granted by TRM.
      * @return a newly created DescramblerClient interface.
      */
-    sp<DescramblerClient> openDescrambler(int descramblerHandle);
+    sp<DescramblerClient> openDescrambler(int32_t descramblerHandle);
 
     /**
      * Open a new interface of LnbClient given an lnbHandle.
@@ -125,7 +100,7 @@
      * @param lnbHandle the handle of the LNB granted by TRM.
      * @return a newly created LnbClient interface.
      */
-    sp<LnbClient> openLnb(int lnbHandle);
+    sp<LnbClient> openLnb(int32_t lnbHandle);
 
     /**
      * Open a new interface of LnbClient given a LNB name.
@@ -139,54 +114,18 @@
      * Get the current Tuner HAL version. The high 16 bits are the major version number
      * while the low 16 bits are the minor version. Default value is unknown version 0.
      */
-    int getHalTunerVersion() { return mTunerVersion; }
+    int32_t getHalTunerVersion() { return mTunerVersion; }
 
 private:
-    sp<ITuner> getHidlTuner();
-    sp<IFrontend> openHidlFrontendById(int id);
-    sp<IDemux> openHidlDemux(int& demuxId);
-    Result getHidlFrontendInfo(int id, FrontendInfo& info);
-    sp<ILnb> openHidlLnbById(int id);
-    sp<ILnb> openHidlLnbByName(string name, LnbId& lnbId);
-    sp<IDescrambler> openHidlDescrambler();
-    vector<int> getLnbHandles();
-    DemuxCapabilities getHidlDemuxCaps(TunerDemuxCapabilities& aidlCaps);
-    FrontendInfo frontendInfoAidlToHidl(TunerFrontendInfo aidlFrontendInfo);
-    void updateTunerResources();
-    void updateFrontendResources();
-    void updateLnbResources();
-
-    int getResourceIdFromHandle(int handle, int resourceType);
-
-    int getResourceHandleFromId(int id, int resourceType);
-
     /**
      * An AIDL Tuner Service Singleton assigned at the first time the Tuner Client
      * connects with the Tuner Service. Default null when the service does not exist.
      */
     static shared_ptr<ITunerService> mTunerService;
 
-    /**
-     * A Tuner 1.0 HAL interface that is ready before connecting to the TunerService
-     * This is a temprary connection before the Tuner Framework fully migrates to the TunerService.
-     * Default null.
-     */
-    static sp<ITuner> mTuner;
-
-    /**
-     * A Tuner 1.1 HAL interface that is ready before connecting to the TunerService
-     * This is a temprary connection before the Tuner Framework fully migrates to the TunerService.
-     * Default null.
-     */
-    static sp<::android::hardware::tv::tuner::V1_1::ITuner> mTuner_1_1;
-
     // An integer that carries the Tuner version. The high 16 bits are the major version number
     // while the low 16 bits are the minor version. Default value is unknown version 0.
-    static int mTunerVersion;
-
-    shared_ptr<ITunerResourceManager> mTunerResourceManager;
-
-    int mResourceRequestCount = 0;
+    static int32_t mTunerVersion;
 };
 }  // namespace android
 
diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java
index 0c04b07..22f0ada 100644
--- a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java
+++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java
@@ -23,7 +23,6 @@
 import android.content.Context;
 import android.media.IResourceManagerService;
 import android.media.tv.TvInputManager;
-import android.media.tv.tuner.TunerFrontendInfo;
 import android.media.tv.tunerresourcemanager.CasSessionRequest;
 import android.media.tv.tunerresourcemanager.IResourcesReclaimListener;
 import android.media.tv.tunerresourcemanager.ITunerResourceManager;
@@ -31,6 +30,7 @@
 import android.media.tv.tunerresourcemanager.TunerCiCamRequest;
 import android.media.tv.tunerresourcemanager.TunerDemuxRequest;
 import android.media.tv.tunerresourcemanager.TunerDescramblerRequest;
+import android.media.tv.tunerresourcemanager.TunerFrontendInfo;
 import android.media.tv.tunerresourcemanager.TunerFrontendRequest;
 import android.media.tv.tunerresourcemanager.TunerLnbRequest;
 import android.media.tv.tunerresourcemanager.TunerResourceManager;
diff --git a/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java
index 2f36c7f..b8cb149 100644
--- a/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java
@@ -25,7 +25,6 @@
 import android.media.tv.ITvInputManager;
 import android.media.tv.TvInputManager;
 import android.media.tv.TvInputService;
-import android.media.tv.tuner.TunerFrontendInfo;
 import android.media.tv.tuner.frontend.FrontendSettings;
 import android.media.tv.tunerresourcemanager.CasSessionRequest;
 import android.media.tv.tunerresourcemanager.IResourcesReclaimListener;
@@ -33,6 +32,7 @@
 import android.media.tv.tunerresourcemanager.TunerCiCamRequest;
 import android.media.tv.tunerresourcemanager.TunerDemuxRequest;
 import android.media.tv.tunerresourcemanager.TunerDescramblerRequest;
+import android.media.tv.tunerresourcemanager.TunerFrontendInfo;
 import android.media.tv.tunerresourcemanager.TunerFrontendRequest;
 import android.media.tv.tunerresourcemanager.TunerLnbRequest;
 import android.media.tv.tunerresourcemanager.TunerResourceManager;