diff --git a/cas/1.0/default/FactoryLoader.h b/cas/1.0/default/FactoryLoader.h
index 18c2186..943f761 100644
--- a/cas/1.0/default/FactoryLoader.h
+++ b/cas/1.0/default/FactoryLoader.h
@@ -45,9 +45,9 @@
             sp<SharedLibrary> *library = NULL,
             T** factory = NULL);
 
-    bool enumeratePlugins(vector<HidlCasPluginDescriptor>* results);
+    bool enumeratePlugins(hidl_vec<HidlCasPluginDescriptor>* results);
 
-private:
+  private:
     typedef T*(*CreateFactoryFunc)();
 
     Mutex mMapLock;
@@ -63,9 +63,7 @@
             sp<SharedLibrary> *library,
             T** factory);
 
-    bool queryPluginsFromPath(
-            const String8 &path,
-            vector<HidlCasPluginDescriptor>* results);
+    bool queryPluginsFromPath(const String8& path, hidl_vec<HidlCasPluginDescriptor>* results);
 
     bool openFactory(const String8 &path);
     void closeFactory();
@@ -121,12 +119,9 @@
 }
 
 template <class T>
-bool FactoryLoader<T>::enumeratePlugins(
-        vector<HidlCasPluginDescriptor>* results) {
+bool FactoryLoader<T>::enumeratePlugins(hidl_vec<HidlCasPluginDescriptor>* results) {
     ALOGI("enumeratePlugins");
 
-    results->clear();
-
     String8 dirPath("/vendor/lib/mediacas");
     DIR* pDir = opendir(dirPath.string());
 
@@ -168,8 +163,8 @@
 }
 
 template <class T>
-bool FactoryLoader<T>::queryPluginsFromPath(
-        const String8 &path, vector<HidlCasPluginDescriptor>* results) {
+bool FactoryLoader<T>::queryPluginsFromPath(const String8& path,
+                                            hidl_vec<HidlCasPluginDescriptor>* results) {
     closeFactory();
 
     vector<CasPluginDescriptor> descriptors;
@@ -178,11 +173,19 @@
         return false;
     }
 
-    for (auto it = descriptors.begin(); it != descriptors.end(); it++) {
-        results->push_back( HidlCasPluginDescriptor {
-                .caSystemId = it->CA_system_id,
-                .name = it->name.c_str()});
+    results->resize(descriptors.size());
+
+    if (results->size() >= SIZE_MAX / sizeof(HidlCasPluginDescriptor)) {
+        return false;
     }
+    memset(results->data(), 0, results->size() * sizeof(HidlCasPluginDescriptor));
+
+    for (size_t i = 0; i < results->size(); i++) {
+        HidlCasPluginDescriptor& descriptor = (*results)[i];
+        descriptor.caSystemId = descriptors[i].CA_system_id;
+        descriptor.name = descriptors[i].name.c_str();
+    }
+
     return true;
 }
 
diff --git a/cas/1.0/default/MediaCasService.cpp b/cas/1.0/default/MediaCasService.cpp
index dbdd008..b159f5b 100644
--- a/cas/1.0/default/MediaCasService.cpp
+++ b/cas/1.0/default/MediaCasService.cpp
@@ -44,7 +44,7 @@
 
     ALOGV("%s", __FUNCTION__);
 
-    vector<HidlCasPluginDescriptor> results;
+    hidl_vec<HidlCasPluginDescriptor> results;
     mCasLoader.enumeratePlugins(&results);
 
     _hidl_cb(results);
diff --git a/cas/1.1/default/FactoryLoader.h b/cas/1.1/default/FactoryLoader.h
index c4a48e2..862d557 100644
--- a/cas/1.1/default/FactoryLoader.h
+++ b/cas/1.1/default/FactoryLoader.h
@@ -44,9 +44,9 @@
     bool findFactoryForScheme(int32_t CA_system_id, sp<SharedLibrary>* library = NULL,
                               T** factory = NULL);
 
-    bool enumeratePlugins(vector<HidlCasPluginDescriptor>* results);
+    bool enumeratePlugins(hidl_vec<HidlCasPluginDescriptor>* results);
 
-   private:
+  private:
     typedef T* (*CreateFactoryFunc)();
 
     Mutex mMapLock;
@@ -59,7 +59,7 @@
     bool loadFactoryForSchemeFromPath(const String8& path, int32_t CA_system_id,
                                       sp<SharedLibrary>* library, T** factory);
 
-    bool queryPluginsFromPath(const String8& path, vector<HidlCasPluginDescriptor>* results);
+    bool queryPluginsFromPath(const String8& path, hidl_vec<HidlCasPluginDescriptor>* results);
 
     bool openFactory(const String8& path);
     void closeFactory();
@@ -113,11 +113,9 @@
 }
 
 template <class T>
-bool FactoryLoader<T>::enumeratePlugins(vector<HidlCasPluginDescriptor>* results) {
+bool FactoryLoader<T>::enumeratePlugins(hidl_vec<HidlCasPluginDescriptor>* results) {
     ALOGI("enumeratePlugins");
 
-    results->clear();
-
     String8 dirPath("/vendor/lib/mediacas");
     DIR* pDir = opendir(dirPath.string());
 
@@ -159,7 +157,7 @@
 
 template <class T>
 bool FactoryLoader<T>::queryPluginsFromPath(const String8& path,
-                                            vector<HidlCasPluginDescriptor>* results) {
+                                            hidl_vec<HidlCasPluginDescriptor>* results) {
     closeFactory();
 
     vector<CasPluginDescriptor> descriptors;
@@ -168,10 +166,19 @@
         return false;
     }
 
-    for (auto it = descriptors.begin(); it != descriptors.end(); it++) {
-        results->push_back(
-                HidlCasPluginDescriptor{.caSystemId = it->CA_system_id, .name = it->name.c_str()});
+    results->resize(descriptors.size());
+
+    if (results->size() >= SIZE_MAX / sizeof(HidlCasPluginDescriptor)) {
+        return false;
     }
+    memset(results->data(), 0, results->size() * sizeof(HidlCasPluginDescriptor));
+
+    for (size_t i = 0; i < results->size(); i++) {
+        HidlCasPluginDescriptor& descriptor = (*results)[i];
+        descriptor.caSystemId = descriptors[i].CA_system_id;
+        descriptor.name = descriptors[i].name.c_str();
+    }
+
     return true;
 }
 
diff --git a/cas/1.1/default/MediaCasService.cpp b/cas/1.1/default/MediaCasService.cpp
index eb3fa6b..122c53f 100644
--- a/cas/1.1/default/MediaCasService.cpp
+++ b/cas/1.1/default/MediaCasService.cpp
@@ -68,7 +68,7 @@
 Return<void> MediaCasService::enumeratePlugins(enumeratePlugins_cb _hidl_cb) {
     ALOGV("%s", __FUNCTION__);
 
-    vector<HidlCasPluginDescriptor> results;
+    hidl_vec<HidlCasPluginDescriptor> results;
     mCasLoader.enumeratePlugins(&results);
 
     _hidl_cb(results);
