diff --git a/wpa_supplicant/Android.mk b/wpa_supplicant/Android.mk
index 1c69a9f..e52ff14 100644
--- a/wpa_supplicant/Android.mk
+++ b/wpa_supplicant/Android.mk
@@ -1598,7 +1598,7 @@
 LOCAL_SHARED_LIBRARIES += libdbus
 endif
 ifeq ($(WPA_SUPPLICANT_USE_HIDL), y)
-LOCAL_SHARED_LIBRARIES += android.hardware.wifi@1.0
+LOCAL_SHARED_LIBRARIES += android.hardware.wifi.supplicant@1.0
 LOCAL_SHARED_LIBRARIES += libhidl libhwbinder libutils
 LOCAL_STATIC_LIBRARIES += libwpa_hidl
 endif
@@ -1657,7 +1657,7 @@
     hidl/network.cpp \
     hidl/supplicant.cpp
 LOCAL_SHARED_LIBRARIES := \
-    android.hardware.wifi@1.0 \
+    android.hardware.wifi.supplicant@1.0 \
     libhidl \
     libhwbinder \
     libutils
diff --git a/wpa_supplicant/hidl/hidl.cpp b/wpa_supplicant/hidl/hidl.cpp
index 258fa2b..599938d 100644
--- a/wpa_supplicant/hidl/hidl.cpp
+++ b/wpa_supplicant/hidl/hidl.cpp
@@ -7,9 +7,8 @@
  * See README for more details.
  */
 
-#include <hidl/IPCThreadState.h>
-#include <hidl/IServiceManager.h>
-#include <hidl/ProcessState.h>
+#include <hwbinder/IPCThreadState.h>
+#include <hwbinder/ProcessState.h>
 
 #include "hidl_manager.h"
 
@@ -21,19 +20,22 @@
 #include "utils/includes.h"
 }
 
+using android::hardware::ProcessState;
+using android::hardware::IPCThreadState;
+using android::hardware::wifi::supplicant::V1_0::implementation::HidlManager;
+
 void wpas_hidl_sock_handler(
     int /* sock */, void * /* eloop_ctx */, void *sock_ctx)
 {
 	struct wpas_hidl_priv *priv = (wpas_hidl_priv *)sock_ctx;
-	wpa_printf(
-	    MSG_DEBUG, "Processing hidl events on FD %d", priv->hidl_fd);
-	android::IPCThreadState::self()->handlePolledCommands();
+	wpa_printf(MSG_DEBUG, "Processing hidl events on FD %d", priv->hidl_fd);
+	IPCThreadState::self()->handlePolledCommands();
 }
 
 struct wpas_hidl_priv *wpas_hidl_init(struct wpa_global *global)
 {
 	struct wpas_hidl_priv *priv;
-	wpa_supplicant_hidl::HidlManager *hidl_manager;
+	HidlManager *hidl_manager;
 
 	priv = (wpas_hidl_priv *)os_zalloc(sizeof(*priv));
 	if (!priv)
@@ -42,25 +44,24 @@
 
 	wpa_printf(MSG_DEBUG, "Initing hidl control");
 
-	android::ProcessState::self()->setThreadPoolMaxThreadCount(0);
-	android::IPCThreadState::self()->disableBackgroundScheduling(true);
-	android::IPCThreadState::self()->setupPolling(&priv->hidl_fd);
+	ProcessState::self()->setThreadPoolMaxThreadCount(0);
+	IPCThreadState::self()->disableBackgroundScheduling(true);
+	IPCThreadState::self()->setupPolling(&priv->hidl_fd);
 	if (priv->hidl_fd < 0)
 		goto err;
 
-	wpa_printf(
-	    MSG_INFO, "Processing hidl events on FD %d", priv->hidl_fd);
-	/* Look for read events from the hidl socket in the eloop. */
+	wpa_printf(MSG_INFO, "Processing hidl events on FD %d", priv->hidl_fd);
+	// Look for read events from the hidl socket in the eloop.
 	if (eloop_register_read_sock(
 		priv->hidl_fd, wpas_hidl_sock_handler, global, priv) < 0)
 		goto err;
 
-	hidl_manager = wpa_supplicant_hidl::HidlManager::getInstance();
+	hidl_manager = HidlManager::getInstance();
 	if (!hidl_manager)
 		goto err;
 	hidl_manager->registerHidlService(global);
-	/* We may not need to store this hidl manager reference in the
-	 * global data strucure because we've made it a singleton class. */
+	// We may not need to store this hidl manager reference in the
+	// global data strucure because we've made it a singleton class.
 	priv->hidl_manager = (void *)hidl_manager;
 
 	return priv;
@@ -76,9 +77,9 @@
 
 	wpa_printf(MSG_DEBUG, "Deiniting hidl control");
 
-	wpa_supplicant_hidl::HidlManager::destroyInstance();
+	HidlManager::destroyInstance();
 	eloop_unregister_read_sock(priv->hidl_fd);
-	android::IPCThreadState::shutdown();
+	IPCThreadState::shutdown();
 	os_free(priv);
 }
 
@@ -91,8 +92,7 @@
 	    MSG_DEBUG, "Registering interface to hidl control: %s",
 	    wpa_s->ifname);
 
-	wpa_supplicant_hidl::HidlManager *hidl_manager =
-	    wpa_supplicant_hidl::HidlManager::getInstance();
+	HidlManager *hidl_manager = HidlManager::getInstance();
 	if (!hidl_manager)
 		return 1;
 
@@ -108,8 +108,7 @@
 	    MSG_DEBUG, "Deregistering interface from hidl control: %s",
 	    wpa_s->ifname);
 
-	wpa_supplicant_hidl::HidlManager *hidl_manager =
-	    wpa_supplicant_hidl::HidlManager::getInstance();
+	HidlManager *hidl_manager = HidlManager::getInstance();
 	if (!hidl_manager)
 		return 1;
 
@@ -125,8 +124,7 @@
 	wpa_printf(
 	    MSG_DEBUG, "Registering network to hidl control: %d", ssid->id);
 
-	wpa_supplicant_hidl::HidlManager *hidl_manager =
-	    wpa_supplicant_hidl::HidlManager::getInstance();
+	HidlManager *hidl_manager = HidlManager::getInstance();
 	if (!hidl_manager)
 		return 1;
 
@@ -140,11 +138,9 @@
 		return 1;
 
 	wpa_printf(
-	    MSG_DEBUG, "Deregistering network from hidl control: %d",
-	    ssid->id);
+	    MSG_DEBUG, "Deregistering network from hidl control: %d", ssid->id);
 
-	wpa_supplicant_hidl::HidlManager *hidl_manager =
-	    wpa_supplicant_hidl::HidlManager::getInstance();
+	HidlManager *hidl_manager = HidlManager::getInstance();
 	if (!hidl_manager)
 		return 1;
 
@@ -160,8 +156,7 @@
 	    MSG_DEBUG, "Notifying state change event to hidl control: %d",
 	    wpa_s->wpa_state);
 
-	wpa_supplicant_hidl::HidlManager *hidl_manager =
-	    wpa_supplicant_hidl::HidlManager::getInstance();
+	HidlManager *hidl_manager = HidlManager::getInstance();
 	if (!hidl_manager)
 		return 1;
 
@@ -179,8 +174,7 @@
 	    MSG_DEBUG, "Notifying network request to hidl control: %d",
 	    ssid->id);
 
-	wpa_supplicant_hidl::HidlManager *hidl_manager =
-	    wpa_supplicant_hidl::HidlManager::getInstance();
+	HidlManager *hidl_manager = HidlManager::getInstance();
 	if (!hidl_manager)
 		return 1;
 
diff --git a/wpa_supplicant/hidl/hidl.h b/wpa_supplicant/hidl/hidl.h
index 594098d..ee7cab1 100644
--- a/wpa_supplicant/hidl/hidl.h
+++ b/wpa_supplicant/hidl/hidl.h
@@ -12,7 +12,7 @@
 
 #ifdef _cplusplus
 extern "C" {
-#endif /* _cplusplus */
+#endif  // _cplusplus
 
 /**
  * This is the hidl RPC interface entry point to the wpa_supplicant core.
@@ -36,7 +36,7 @@
 int wpas_hidl_notify_network_request(
     struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
     enum wpa_ctrl_req_type rtype, const char *default_txt);
-#else  /* CONFIG_CTRL_IFACE_HIDL */
+#else   // CONFIG_CTRL_IFACE_HIDL
 static inline int wpas_hidl_register_interface(struct wpa_supplicant *wpa_s)
 {
 	return 0;
@@ -65,10 +65,10 @@
 {
 	return 0;
 }
-#endif /* CONFIG_CTRL_IFACE_HIDL */
+#endif  // CONFIG_CTRL_IFACE_HIDL
 
 #ifdef _cplusplus
 }
-#endif /* _cplusplus */
+#endif  // _cplusplus
 
-#endif /* WPA_SUPPLICANT_HIDL_HIDL_H */
+#endif  // WPA_SUPPLICANT_HIDL_HIDL_H
diff --git a/wpa_supplicant/hidl/hidl_i.h b/wpa_supplicant/hidl/hidl_i.h
index 8c0df2e..c7a0142 100644
--- a/wpa_supplicant/hidl/hidl_i.h
+++ b/wpa_supplicant/hidl/hidl_i.h
@@ -23,6 +23,6 @@
 
 #ifdef _cplusplus
 }
-#endif /* _cplusplus */
+#endif  // _cplusplus
 
-#endif /* HIDL_I_H */
+#endif  // HIDL_I_H
diff --git a/wpa_supplicant/hidl/hidl_manager.cpp b/wpa_supplicant/hidl/hidl_manager.cpp
index 89339c5..372b221 100644
--- a/wpa_supplicant/hidl/hidl_manager.cpp
+++ b/wpa_supplicant/hidl/hidl_manager.cpp
@@ -9,19 +9,21 @@
 
 #include <algorithm>
 
-#include <hidl/IServiceManager.h>
-
-#include "hidl_constants.h"
 #include "hidl_manager.h"
-#include "wpa_supplicant_hidl/hidl_constants.h"
 
 extern "C" {
 #include "utils/common.h"
 #include "utils/includes.h"
 }
 
-namespace wpa_supplicant_hidl {
+namespace android {
+namespace hardware {
+namespace wifi {
+namespace supplicant {
+namespace V1_0 {
+namespace implementation {
 
+const char HidlManager::kServiceName[] = "wpa_supplicant";
 HidlManager *HidlManager::instance_ = NULL;
 
 HidlManager *HidlManager::getInstance()
@@ -40,13 +42,12 @@
 
 int HidlManager::registerHidlService(struct wpa_global *global)
 {
-	// Create the main hidl service object and register with system
-	// ServiceManager.
+	// Create the main hidl service object and register it.
 	supplicant_object_ = new Supplicant(global);
-
-	android::String16 service_name(hidl_constants::kServiceName);
-	android::defaultServiceManager()->addService(
-	    service_name, android::IInterface::asHidl(supplicant_object_));
+	if (supplicant_object_->registerAsService(kServiceName) !=
+	    android::NO_ERROR) {
+		return 1;
+	}
 	return 0;
 }
 
@@ -75,12 +76,12 @@
 
 	// Initialize the vector of callbacks for this object.
 	iface_callbacks_map_[ifname] =
-	    std::vector<android::sp<fi::w1::wpa_supplicant::IIfaceCallback>>();
+	    std::vector<android::sp<ISupplicantIfaceCallback>>();
 
-	// Invoke the |OnInterfaceCreated| method on all registered callbacks.
+	// Invoke the |onInterfaceCreated| method on all registered callbacks.
 	callWithEachSupplicantCallback(std::bind(
-	    &fi::w1::wpa_supplicant::ISupplicantCallback::OnInterfaceCreated,
-	    std::placeholders::_1, ifname));
+	    &ISupplicantCallback::onInterfaceCreated, std::placeholders::_1,
+	    ifname));
 	return 0;
 }
 
@@ -109,21 +110,24 @@
 	if (iface_callback_map_iter == iface_callbacks_map_.end())
 		return 1;
 	const auto &iface_callback_list = iface_callback_map_iter->second;
+#if 0   // TODO(b/31632518): HIDL object death notifications.
 	for (const auto &callback : iface_callback_list) {
-		if (android::IInterface::asHidl(callback)->unlinkToDeath(
-			nullptr, callback.get()) != android::OK) {
+		if (android::hardware::IInterface::asBinder(callback)
+			->unlinkToDeath(nullptr, callback.get()) !=
+		    android::OK) {
 			wpa_printf(
 			    MSG_ERROR,
 			    "Error deregistering for death notification for "
 			    "iface callback object");
 		}
 	}
+#endif  // TODO(b/31632518): HIDL object death notifications.
 	iface_callbacks_map_.erase(iface_callback_map_iter);
 
-	// Invoke the |OnInterfaceRemoved| method on all registered callbacks.
+	// Invoke the |onInterfaceRemoved| method on all registered callbacks.
 	callWithEachSupplicantCallback(std::bind(
-	    &fi::w1::wpa_supplicant::ISupplicantCallback::OnInterfaceRemoved,
-	    std::placeholders::_1, ifname));
+	    &ISupplicantCallback::onInterfaceRemoved, std::placeholders::_1,
+	    ifname));
 	return 0;
 }
 
@@ -155,15 +159,14 @@
 		return 1;
 
 	// Initialize the vector of callbacks for this object.
-	network_callbacks_map_[network_key] = std::vector<
-	    android::sp<fi::w1::wpa_supplicant::INetworkCallback>>();
+	network_callbacks_map_[network_key] =
+	    std::vector<android::sp<ISupplicantNetworkCallback>>();
 
-	// Invoke the |OnNetworkAdded| method on all registered callbacks.
+	// Invoke the |onNetworkAdded| method on all registered callbacks.
 	callWithEachIfaceCallback(
-	    wpa_s->ifname,
-	    std::bind(
-		&fi::w1::wpa_supplicant::IIfaceCallback::OnNetworkAdded,
-		std::placeholders::_1, ssid->id));
+	    wpa_s->ifname, std::bind(
+			       &ISupplicantIfaceCallback::onNetworkAdded,
+			       std::placeholders::_1, ssid->id));
 	return 0;
 }
 
@@ -198,9 +201,11 @@
 	if (network_callback_map_iter == network_callbacks_map_.end())
 		return 1;
 	const auto &network_callback_list = network_callback_map_iter->second;
+#if 0   // TODO(b/31632518): HIDL object death notifications.
 	for (const auto &callback : network_callback_list) {
-		if (android::IInterface::asHidl(callback)->unlinkToDeath(
-			nullptr, callback.get()) != android::OK) {
+		if (android::hardware::IInterface::asBinder(callback)
+			->unlinkToDeath(nullptr, callback.get()) !=
+		    android::OK) {
 			wpa_printf(
 			    MSG_ERROR,
 			    "Error deregistering for death "
@@ -208,14 +213,14 @@
 			    "network callback object");
 		}
 	}
+#endif  // TODO(b/31632518): HIDL object death notifications.
 	network_callbacks_map_.erase(network_callback_map_iter);
 
-	// Invoke the |OnNetworkRemoved| method on all registered callbacks.
+	// Invoke the |onNetworkRemoved| method on all registered callbacks.
 	callWithEachIfaceCallback(
-	    wpa_s->ifname,
-	    std::bind(
-		&fi::w1::wpa_supplicant::IIfaceCallback::OnNetworkRemoved,
-		std::placeholders::_1, ssid->id));
+	    wpa_s->ifname, std::bind(
+			       &ISupplicantIfaceCallback::onNetworkRemoved,
+			       std::placeholders::_1, ssid->id));
 	return 0;
 }
 
@@ -234,23 +239,24 @@
 	if (iface_object_map_.find(ifname) == iface_object_map_.end())
 		return 1;
 
-	// Invoke the |OnStateChanged| method on all registered callbacks.
-	int state = wpa_s->wpa_state;
-	std::vector<uint8_t> bssid(wpa_s->bssid, wpa_s->bssid + ETH_ALEN);
-	int network_id =
-	    fi::w1::wpa_supplicant::IIfaceCallback::NETWORK_ID_INVALID;
-	std::vector<uint8_t> ssid;
+	// Invoke the |onStateChanged| method on all registered callbacks.
+	ISupplicantIfaceCallback::State hidl_state =
+	    static_cast<ISupplicantIfaceCallback::State>(wpa_s->wpa_state);
+	hidl_array<uint8_t, 6> hidl_bssid;
+	os_memcpy(hidl_bssid.data(), wpa_s->bssid, ETH_ALEN);
+	uint32_t hidl_network_id = UINT32_MAX;
+	std::vector<uint8_t> hidl_ssid;
 	if (wpa_s->current_ssid) {
-		network_id = wpa_s->current_ssid->id;
-		ssid.assign(
+		hidl_network_id = wpa_s->current_ssid->id;
+		hidl_ssid.assign(
 		    wpa_s->current_ssid->ssid,
 		    wpa_s->current_ssid->ssid + wpa_s->current_ssid->ssid_len);
 	}
 	callWithEachIfaceCallback(
-	    wpa_s->ifname,
-	    std::bind(
-		&fi::w1::wpa_supplicant::IIfaceCallback::OnStateChanged,
-		std::placeholders::_1, state, bssid, network_id, ssid));
+	    wpa_s->ifname, std::bind(
+			       &ISupplicantIfaceCallback::onStateChanged,
+			       std::placeholders::_1, hidl_state, hidl_bssid,
+			       hidl_network_id, hidl_ssid));
 	return 0;
 }
 
@@ -275,16 +281,13 @@
 	if (network_object_map_.find(network_key) == network_object_map_.end())
 		return 1;
 
-	callWithEachNetworkCallback(
-	    wpa_s->ifname, ssid->id,
-	    std::bind(
-		&fi::w1::wpa_supplicant::INetworkCallback::OnNetworkRequest,
-		std::placeholders::_1, type, param));
+	// TODO(b/31646740): Parse the param string to find the appropriate
+	// callback.
 	return 0;
 }
 
 /**
- * Retrieve the |IIface| hidl object reference using the provided
+ * Retrieve the |ISupplicantIface| hidl object reference using the provided
  * ifname.
  *
  * @param ifname Name of the corresponding interface.
@@ -293,8 +296,7 @@
  * @return 0 on success, 1 on failure.
  */
 int HidlManager::getIfaceHidlObjectByIfname(
-    const std::string &ifname,
-    android::sp<fi::w1::wpa_supplicant::IIface> *iface_object)
+    const std::string &ifname, android::sp<ISupplicantIface> *iface_object)
 {
 	if (ifname.empty() || !iface_object)
 		return 1;
@@ -308,7 +310,7 @@
 }
 
 /**
- * Retrieve the |INetwork| hidl object reference using the provided
+ * Retrieve the |ISupplicantNetwork| hidl object reference using the provided
  * ifname and network_id.
  *
  * @param ifname Name of the corresponding interface.
@@ -319,7 +321,7 @@
  */
 int HidlManager::getNetworkHidlObjectByIfnameAndNetworkId(
     const std::string &ifname, int network_id,
-    android::sp<fi::w1::wpa_supplicant::INetwork> *network_object)
+    android::sp<ISupplicantNetwork> *network_object)
 {
 	if (ifname.empty() || network_id < 0 || !network_object)
 		return 1;
@@ -345,28 +347,28 @@
  * @return 0 on success, 1 on failure.
  */
 int HidlManager::addSupplicantCallbackHidlObject(
-    const android::sp<fi::w1::wpa_supplicant::ISupplicantCallback> &callback)
+    const android::sp<ISupplicantCallback> &callback)
 {
 	// Register for death notification before we add it to our list.
 	auto on_hidl_died_fctor = std::bind(
 	    &HidlManager::removeSupplicantCallbackHidlObject, this,
 	    std::placeholders::_1);
 	return registerForDeathAndAddCallbackHidlObjectToList<
-	    fi::w1::wpa_supplicant::ISupplicantCallback>(
+	    ISupplicantCallback>(
 	    callback, on_hidl_died_fctor, supplicant_callbacks_);
 }
 /**
- * Add a new |IIfaceCallback| hidl object reference to our
+ * Add a new |ISupplicantIfaceCallback| hidl object reference to our
  * interface callback list.
  *
  * @param ifname Name of the corresponding interface.
- * @param callback Hidl reference of the |IIfaceCallback| object.
+ * @param callback Hidl reference of the |ISupplicantIfaceCallback| object.
  *
  * @return 0 on success, 1 on failure.
  */
 int HidlManager::addIfaceCallbackHidlObject(
     const std::string &ifname,
-    const android::sp<fi::w1::wpa_supplicant::IIfaceCallback> &callback)
+    const android::sp<ISupplicantIfaceCallback> &callback)
 {
 	if (ifname.empty())
 		return 1;
@@ -381,23 +383,23 @@
 	    &HidlManager::removeIfaceCallbackHidlObject, this, ifname,
 	    std::placeholders::_1);
 	return registerForDeathAndAddCallbackHidlObjectToList<
-	    fi::w1::wpa_supplicant::IIfaceCallback>(
+	    ISupplicantIfaceCallback>(
 	    callback, on_hidl_died_fctor, iface_callback_list);
 }
 
 /**
- * Add a new |INetworkCallback| hidl object reference to our
+ * Add a new |ISupplicantNetworkCallback| hidl object reference to our
  * network callback list.
  *
  * @param ifname Name of the corresponding interface.
  * @param network_id ID of the corresponding network.
- * @param callback Hidl reference of the |INetworkCallback| object.
+ * @param callback Hidl reference of the |ISupplicantNetworkCallback| object.
  *
  * @return 0 on success, 1 on failure.
  */
 int HidlManager::addNetworkCallbackHidlObject(
     const std::string &ifname, int network_id,
-    const android::sp<fi::w1::wpa_supplicant::INetworkCallback> &callback)
+    const android::sp<ISupplicantNetworkCallback> &callback)
 {
 	if (ifname.empty() || network_id < 0)
 		return 1;
@@ -416,13 +418,13 @@
 	    &HidlManager::removeNetworkCallbackHidlObject, this, ifname,
 	    network_id, std::placeholders::_1);
 	return registerForDeathAndAddCallbackHidlObjectToList<
-	    fi::w1::wpa_supplicant::INetworkCallback>(
+	    ISupplicantNetworkCallback>(
 	    callback, on_hidl_died_fctor, network_callback_list);
 }
 
 /**
  * Creates a unique key for the network using the provided |ifname| and
- * |network_id| to be used in the internal map of |INetwork| objects.
+ * |network_id| to be used in the internal map of |ISupplicantNetwork| objects.
  * This is of the form |ifname|_|network_id|. For ex: "wlan0_1".
  *
  * @param ifname Name of the corresponding interface.
@@ -441,7 +443,7 @@
  * @param callback Hidl reference of the |ISupplicantCallback| object.
  */
 void HidlManager::removeSupplicantCallbackHidlObject(
-    const android::sp<fi::w1::wpa_supplicant::ISupplicantCallback> &callback)
+    const android::sp<ISupplicantCallback> &callback)
 {
 	supplicant_callbacks_.erase(
 	    std::remove(
@@ -451,15 +453,15 @@
 }
 
 /**
- * Removes the provided |IIfaceCallback| hidl object reference from
+ * Removes the provided |ISupplicantIfaceCallback| hidl object reference from
  * our interface callback list.
  *
  * @param ifname Name of the corresponding interface.
- * @param callback Hidl reference of the |IIfaceCallback| object.
+ * @param callback Hidl reference of the |ISupplicantIfaceCallback| object.
  */
 void HidlManager::removeIfaceCallbackHidlObject(
     const std::string &ifname,
-    const android::sp<fi::w1::wpa_supplicant::IIfaceCallback> &callback)
+    const android::sp<ISupplicantIfaceCallback> &callback)
 {
 	if (ifname.empty())
 		return;
@@ -477,16 +479,16 @@
 }
 
 /**
- * Removes the provided |INetworkCallback| hidl object reference from
+ * Removes the provided |ISupplicantNetworkCallback| hidl object reference from
  * our network callback list.
  *
  * @param ifname Name of the corresponding interface.
  * @param network_id ID of the corresponding network.
- * @param callback Hidl reference of the |INetworkCallback| object.
+ * @param callback Hidl reference of the |ISupplicantNetworkCallback| object.
  */
 void HidlManager::removeNetworkCallbackHidlObject(
     const std::string &ifname, int network_id,
-    const android::sp<fi::w1::wpa_supplicant::INetworkCallback> &callback)
+    const android::sp<ISupplicantNetworkCallback> &callback)
 {
 	if (ifname.empty() || network_id < 0)
 		return;
@@ -512,7 +514,7 @@
  * Add callback to the corresponding list after linking to death on the
  * corresponding hidl object reference.
  *
- * @param callback Hidl reference of the |INetworkCallback| object.
+ * @param callback Hidl reference of the |ISupplicantNetworkCallback| object.
  *
  * @return 0 on success, 1 on failure.
  */
@@ -529,10 +531,10 @@
 	// store a reference to this |CallbackObjectDeathNotifier| instance
 	// to use in |unlinkToDeath| later.
 	// NOTE: This may cause an immediate callback if the object is already
-	// dead,
-	// so add it to the list before we register for callback!
+	// dead, so add it to the list before we register for callback!
 	callback_list.push_back(callback);
-	if (android::IInterface::asHidl(callback)->linkToDeath(
+#if 0   // TODO(b/31632518): HIDL object death notifications.
+	if (android::hardware::IInterface::asBinder(callback)->linkToDeath(
 		death_notifier, callback.get()) != android::OK) {
 		wpa_printf(
 		    MSG_ERROR,
@@ -544,6 +546,7 @@
 		    callback_list.end());
 		return 1;
 	}
+#endif  // TODO(b/31632518): HIDL object death notifications.
 	return 0;
 }
 
@@ -555,8 +558,7 @@
  * |ISupplicantCallback|.
  */
 void HidlManager::callWithEachSupplicantCallback(
-    const std::function<android::hidl::Status(
-	android::sp<fi::w1::wpa_supplicant::ISupplicantCallback>)> &method)
+    const std::function<Return<void>(android::sp<ISupplicantCallback>)> &method)
 {
 	for (const auto &callback : supplicant_callbacks_) {
 		method(callback);
@@ -565,16 +567,17 @@
 
 /**
  * Helper fucntion to invoke the provided callback method on all the
- * registered |IIfaceCallback| callback hidl objects for the specified
+ * registered |ISupplicantIfaceCallback| callback hidl objects for the specified
  * |ifname|.
  *
  * @param ifname Name of the corresponding interface.
- * @param method Pointer to the required hidl method from |IIfaceCallback|.
+ * @param method Pointer to the required hidl method from
+ * |ISupplicantIfaceCallback|.
  */
 void HidlManager::callWithEachIfaceCallback(
     const std::string &ifname,
-    const std::function<android::hidl::Status(
-	android::sp<fi::w1::wpa_supplicant::IIfaceCallback>)> &method)
+    const std::function<Return<void>(android::sp<ISupplicantIfaceCallback>)>
+	&method)
 {
 	if (ifname.empty())
 		return;
@@ -590,17 +593,19 @@
 
 /**
  * Helper function to invoke the provided callback method on all the
- * registered |INetworkCallback| callback hidl objects for the specified
+ * registered |ISupplicantNetworkCallback| callback hidl objects for the
+ * specified
  * |ifname| & |network_id|.
  *
  * @param ifname Name of the corresponding interface.
  * @param network_id ID of the corresponding network.
- * @param method Pointer to the required hidl method from |INetworkCallback|.
+ * @param method Pointer to the required hidl method from
+ * |ISupplicantNetworkCallback|.
  */
 void HidlManager::callWithEachNetworkCallback(
     const std::string &ifname, int network_id,
-    const std::function<android::hidl::Status(
-	android::sp<fi::w1::wpa_supplicant::INetworkCallback>)> &method)
+    const std::function<Return<void>(android::sp<ISupplicantNetworkCallback>)>
+	&method)
 {
 	if (ifname.empty() || network_id < 0)
 		return;
@@ -617,4 +622,10 @@
 		method(callback);
 	}
 }
-}  // namespace wpa_supplicant_hidl
+
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace wifi
+}  // namespace supplicant
+}  // namespace hardware
+}  // namespace android
diff --git a/wpa_supplicant/hidl/hidl_manager.h b/wpa_supplicant/hidl/hidl_manager.h
index f6178a4..f226d2d 100644
--- a/wpa_supplicant/hidl/hidl_manager.h
+++ b/wpa_supplicant/hidl/hidl_manager.h
@@ -13,9 +13,9 @@
 #include <map>
 #include <string>
 
-#include "fi/w1/wpa_supplicant/IIfaceCallback.h"
-#include "fi/w1/wpa_supplicant/INetworkCallback.h"
-#include "fi/w1/wpa_supplicant/ISupplicantCallback.h"
+#include <android/hardware/wifi/supplicant/1.0/ISupplicantCallback.h>
+#include <android/hardware/wifi/supplicant/1.0/ISupplicantIfaceCallback.h>
+#include <android/hardware/wifi/supplicant/1.0/ISupplicantNetworkCallback.h>
 
 #include "iface.h"
 #include "network.h"
@@ -24,7 +24,12 @@
 struct wpa_global;
 struct wpa_supplicant;
 
-namespace wpa_supplicant_hidl {
+namespace android {
+namespace hardware {
+namespace wifi {
+namespace supplicant {
+namespace V1_0 {
+namespace implementation {
 
 /**
  * HidlManager is responsible for managing the lifetime of all
@@ -54,21 +59,26 @@
 	// Methods called from hidl objects.
 	int getIfaceHidlObjectByIfname(
 	    const std::string &ifname,
-	    android::sp<fi::w1::wpa_supplicant::IIface> *iface_object);
+	    android::sp<
+		android::hardware::wifi::supplicant::V1_0::ISupplicantIface>
+		*iface_object);
 	int getNetworkHidlObjectByIfnameAndNetworkId(
 	    const std::string &ifname, int network_id,
-	    android::sp<fi::w1::wpa_supplicant::INetwork> *network_object);
+	    android::sp<
+		android::hardware::wifi::supplicant::V1_0::ISupplicantNetwork>
+		*network_object);
 	int addSupplicantCallbackHidlObject(
-	    const android::sp<fi::w1::wpa_supplicant::ISupplicantCallback>
+	    const android::sp<
+		android::hardware::wifi::supplicant::V1_0::ISupplicantCallback>
 		&callback);
 	int addIfaceCallbackHidlObject(
 	    const std::string &ifname,
-	    const android::sp<fi::w1::wpa_supplicant::IIfaceCallback>
-		&callback);
+	    const android::sp<android::hardware::wifi::supplicant::V1_0::
+				  ISupplicantIfaceCallback> &callback);
 	int addNetworkCallbackHidlObject(
 	    const std::string &ifname, int network_id,
-	    const android::sp<fi::w1::wpa_supplicant::INetworkCallback>
-		&callback);
+	    const android::sp<android::hardware::wifi::supplicant::V1_0::
+				  ISupplicantNetworkCallback> &callback);
 
 private:
 	HidlManager() = default;
@@ -80,16 +90,17 @@
 	    const std::string &ifname, int network_id);
 
 	void removeSupplicantCallbackHidlObject(
-	    const android::sp<fi::w1::wpa_supplicant::ISupplicantCallback>
+	    const android::sp<
+		android::hardware::wifi::supplicant::V1_0::ISupplicantCallback>
 		&callback);
 	void removeIfaceCallbackHidlObject(
 	    const std::string &ifname,
-	    const android::sp<fi::w1::wpa_supplicant::IIfaceCallback>
-		&callback);
+	    const android::sp<android::hardware::wifi::supplicant::V1_0::
+				  ISupplicantIfaceCallback> &callback);
 	void removeNetworkCallbackHidlObject(
 	    const std::string &ifname, int network_id,
-	    const android::sp<fi::w1::wpa_supplicant::INetworkCallback>
-		&callback);
+	    const android::sp<android::hardware::wifi::supplicant::V1_0::
+				  ISupplicantNetworkCallback> &callback);
 	template <class CallbackType>
 	int registerForDeathAndAddCallbackHidlObjectToList(
 	    const android::sp<CallbackType> &callback,
@@ -98,19 +109,22 @@
 	    std::vector<android::sp<CallbackType>> &callback_list);
 
 	void callWithEachSupplicantCallback(
-	    const std::function<android::hidl::Status(
-		android::sp<fi::w1::wpa_supplicant::ISupplicantCallback>)>
-		&method);
+	    const std::function<android::hardware::Return<void>(
+		android::sp<android::hardware::wifi::supplicant::V1_0::
+				ISupplicantCallback>)> &method);
 	void callWithEachIfaceCallback(
 	    const std::string &ifname,
-	    const std::function<android::hidl::Status(
-		android::sp<fi::w1::wpa_supplicant::IIfaceCallback>)> &method);
+	    const std::function<android::hardware::Return<void>(
+		android::sp<android::hardware::wifi::supplicant::V1_0::
+				ISupplicantIfaceCallback>)> &method);
 	void callWithEachNetworkCallback(
 	    const std::string &ifname, int network_id,
-	    const std::function<android::hidl::Status(
-		android::sp<fi::w1::wpa_supplicant::INetworkCallback>)>
-		&method);
+	    const std::function<android::hardware::Return<void>(
+		android::sp<android::hardware::wifi::supplicant::V1_0::
+				ISupplicantNetworkCallback>)> &method);
 
+	// HIDL Service name.
+	static const char kServiceName[];
 	// Singleton instance of this class.
 	static HidlManager *instance_;
 	// The main hidl service object.
@@ -125,33 +139,35 @@
 	std::map<const std::string, android::sp<Network>> network_object_map_;
 
 	// Callback registered for the main hidl service object.
-	std::vector<android::sp<fi::w1::wpa_supplicant::ISupplicantCallback>>
+	std::vector<android::sp<
+	    android::hardware::wifi::supplicant::V1_0::ISupplicantCallback>>
 	    supplicant_callbacks_;
 	// Map of all the callbacks registered for interface specific
 	// hidl objects controlled by wpa_supplicant.  This map is keyed in by
 	// the corresponding |ifname|.
 	std::map<
 	    const std::string,
-	    std::vector<android::sp<fi::w1::wpa_supplicant::IIfaceCallback>>>
+	    std::vector<android::sp<android::hardware::wifi::supplicant::V1_0::
+					ISupplicantIfaceCallback>>>
 	    iface_callbacks_map_;
 	// Map of all the callbacks registered for network specific
 	// hidl objects controlled by wpa_supplicant.  This map is keyed in by
 	// the corresponding |ifname| & |network_id|.
 	std::map<
 	    const std::string,
-	    std::vector<android::sp<fi::w1::wpa_supplicant::INetworkCallback>>>
+	    std::vector<android::sp<android::hardware::wifi::supplicant::V1_0::
+					ISupplicantNetworkCallback>>>
 	    network_callbacks_map_;
 
 	/**
 	 * Helper class used to deregister the callback object reference from
-	 * our
-	 * callback list on the death of the hidl object.
+	 * our callback list on the death of the hidl object.
 	 * This class stores a reference of the callback hidl object and a
 	 * function to be called to indicate the death of the hidl object.
 	 */
 	template <class CallbackType>
 	class CallbackObjectDeathNotifier
-	    : public android::IHidl::DeathRecipient
+	    : public android::hardware::IBinder::DeathRecipient
 	{
 	public:
 		CallbackObjectDeathNotifier(
@@ -161,8 +177,8 @@
 		    : callback_(callback), on_hidl_died_(on_hidl_died)
 		{
 		}
-		void hidlDied(
-		    const android::wp<android::IHidl> & /* who */) override
+		void binderDied(const android::wp<android::hardware::IBinder>
+				    & /* who */) override
 		{
 			on_hidl_died_(callback_);
 		}
@@ -180,88 +196,116 @@
 // avoid nasty runtime conversion functions. So, adding compile time asserts
 // to guard against any internal changes breaking the hidl interface.
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::KEY_MGMT_MASK_NONE == WPA_KEY_MGMT_NONE,
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicant::DebugLevel::EXCESSIVE) ==
+	MSG_EXCESSIVE,
+    "Debug level value mismatch");
+static_assert(
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicant::DebugLevel::ERROR) == MSG_ERROR,
+    "Debug level value mismatch");
+
+static_assert(
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::KeyMgmtMask::NONE) ==
+	WPA_KEY_MGMT_NONE,
     "KeyMgmt value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::KEY_MGMT_MASK_WPA_PSK == WPA_KEY_MGMT_PSK,
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::KeyMgmtMask::WPA_PSK) ==
+	WPA_KEY_MGMT_PSK,
     "KeyMgmt value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::KEY_MGMT_MASK_WPA_EAP ==
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::KeyMgmtMask::WPA_EAP) ==
 	WPA_KEY_MGMT_IEEE8021X,
     "KeyMgmt value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::KEY_MGMT_MASK_IEEE8021X ==
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::KeyMgmtMask::IEEE8021X) ==
 	WPA_KEY_MGMT_IEEE8021X_NO_WPA,
     "KeyMgmt value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::PROTO_MASK_WPA == WPA_PROTO_WPA,
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::ProtoMask::WPA) ==
+	WPA_PROTO_WPA,
     "Proto value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::PROTO_MASK_RSN == WPA_PROTO_RSN,
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::ProtoMask::RSN) ==
+	WPA_PROTO_RSN,
     "Proto value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::PROTO_MASK_OSEN == WPA_PROTO_OSEN,
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::ProtoMask::OSEN) ==
+	WPA_PROTO_OSEN,
     "Proto value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::AUTH_ALG_MASK_OPEN == WPA_AUTH_ALG_OPEN,
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::AuthAlgMask::OPEN) ==
+	WPA_AUTH_ALG_OPEN,
     "AuthAlg value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::AUTH_ALG_MASK_SHARED ==
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::AuthAlgMask::SHARED) ==
 	WPA_AUTH_ALG_SHARED,
     "AuthAlg value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::AUTH_ALG_MASK_LEAP == WPA_AUTH_ALG_LEAP,
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::AuthAlgMask::LEAP) ==
+	WPA_AUTH_ALG_LEAP,
     "AuthAlg value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::GROUP_CIPHER_MASK_WEP40 ==
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::GroupCipherMask::WEP40) ==
 	WPA_CIPHER_WEP40,
     "GroupCipher value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::GROUP_CIPHER_MASK_WEP104 ==
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::GroupCipherMask::WEP104) ==
 	WPA_CIPHER_WEP104,
     "GroupCipher value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::GROUP_CIPHER_MASK_TKIP == WPA_CIPHER_TKIP,
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::GroupCipherMask::TKIP) ==
+	WPA_CIPHER_TKIP,
     "GroupCipher value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::GROUP_CIPHER_MASK_CCMP == WPA_CIPHER_CCMP,
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::GroupCipherMask::CCMP) ==
+	WPA_CIPHER_CCMP,
     "GroupCipher value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::PAIRWISE_CIPHER_MASK_NONE ==
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::PairwiseCipherMask::NONE) ==
 	WPA_CIPHER_NONE,
     "PairwiseCipher value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::PAIRWISE_CIPHER_MASK_TKIP ==
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::PairwiseCipherMask::TKIP) ==
 	WPA_CIPHER_TKIP,
     "PairwiseCipher value mismatch");
 static_assert(
-    fi::w1::wpa_supplicant::INetwork::PAIRWISE_CIPHER_MASK_CCMP ==
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantNetwork::PairwiseCipherMask::CCMP) ==
 	WPA_CIPHER_CCMP,
     "PairwiseCipher value mismatch");
 
 static_assert(
-    WPA_DISCONNECTED ==
-	fi::w1::wpa_supplicant::IIfaceCallback::STATE_DISCONNECTED,
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantIfaceCallback::State::DISCONNECTED) ==
+	WPA_DISCONNECTED,
     "State value mismatch");
 static_assert(
-    WPA_COMPLETED == fi::w1::wpa_supplicant::IIfaceCallback::STATE_COMPLETED,
+    static_cast<uint32_t>(android::hardware::wifi::supplicant::V1_0::
+			      ISupplicantIfaceCallback::State::COMPLETED) ==
+	WPA_COMPLETED,
     "State value mismatch");
 
-static_assert(
-    WPA_CTRL_REQ_UNKNOWN ==
-	fi::w1::wpa_supplicant::INetwork::NETWORK_RSP_UNKNOWN,
-    "Network Rsp value mismatch");
-static_assert(
-    WPA_CTRL_REQ_EXT_CERT_CHECK ==
-	fi::w1::wpa_supplicant::INetwork::NETWORK_RSP_EXT_CERT_CHECK,
-    "Network Rsp value mismatch");
-static_assert(
-    WPA_CTRL_REQ_UNKNOWN ==
-	fi::w1::wpa_supplicant::INetworkCallback::NETWORK_REQ_UNKNOWN,
-    "Network Req value mismatch");
-static_assert(
-    WPA_CTRL_REQ_EXT_CERT_CHECK ==
-	fi::w1::wpa_supplicant::INetworkCallback::NETWORK_REQ_EXT_CERT_CHECK,
-    "Network Req value mismatch");
-}  // namespace wpa_supplicant_hidl
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace wifi
+}  // namespace supplicant
+}  // namespace hardware
+}  // namespace android
 #endif  // WPA_SUPPLICANT_HIDL_HIDL_MANAGER_H
diff --git a/wpa_supplicant/hidl/hidl_return_macros.h b/wpa_supplicant/hidl/hidl_return_macros.h
new file mode 100644
index 0000000..25e8f49
--- /dev/null
+++ b/wpa_supplicant/hidl/hidl_return_macros.h
@@ -0,0 +1,16 @@
+/*
+ * hidl interface for wpa_supplicant daemon
+ * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2004-2016, Roshan Pius <rpius@google.com>
+ *
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
+ */
+
+// Macros to invoke the _hidl_cb to return status along with any return values.
+#define HIDL_RETURN(status_code, ...)                         \
+	do {                                                  \
+		SupplicantStatus status{.code = status_code}; \
+		_hidl_cb(status, ##__VA_ARGS__);              \
+		return Void();                                \
+	} while (false)
diff --git a/wpa_supplicant/hidl/iface.cpp b/wpa_supplicant/hidl/iface.cpp
index 1ba93b7..6b94aa1 100644
--- a/wpa_supplicant/hidl/iface.cpp
+++ b/wpa_supplicant/hidl/iface.cpp
@@ -8,189 +8,212 @@
  */
 
 #include "hidl_manager.h"
+#include "hidl_return_macros.h"
 #include "iface.h"
 
-namespace wpa_supplicant_hidl {
-
-#define RETURN_IF_IFACE_INVALID(wpa_s)                                  \
-	{                                                               \
-		if (!wpa_s) {                                           \
-			return android::hidl::Status::                \
-			    fromServiceSpecificError(                   \
-				ERROR_IFACE_INVALID,                    \
-				"wpa_supplicant does not control this " \
-				"interface.");                          \
-		}                                                       \
-	}  // #define RETURN_IF_IFACE_INVALID(wpa_s)
+namespace android {
+namespace hardware {
+namespace wifi {
+namespace supplicant {
+namespace V1_0 {
+namespace implementation {
 
 Iface::Iface(struct wpa_global *wpa_global, const char ifname[])
     : wpa_global_(wpa_global), ifname_(ifname)
 {
 }
 
-android::hidl::Status Iface::GetName(std::string *iface_name_out)
-{
-	// We could directly return the name we hold, but let's verify
-	// if the underlying iface still exists.
-	RETURN_IF_IFACE_INVALID(retrieveIfacePtr());
-	*iface_name_out = ifname_;
-	return android::hidl::Status::ok();
-}
-
-android::hidl::Status Iface::AddNetwork(
-    android::sp<fi::w1::wpa_supplicant::INetwork> *network_object_out)
+Return<void> Iface::getName(getName_cb _hidl_cb)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	RETURN_IF_IFACE_INVALID(wpa_s);
+	if (!wpa_s) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_IFACE_INVALID, ifname_);
+	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, ifname_);
+}
+
+Return<void> Iface::addNetwork(addNetwork_cb _hidl_cb)
+{
+	android::sp<ISupplicantNetwork> network;
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	if (!wpa_s) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_IFACE_INVALID, network);
+	}
 
 	struct wpa_ssid *ssid = wpa_supplicant_add_network(wpa_s);
 	if (!ssid) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC, "wpa_supplicant couldn't add this network.");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN, network);
 	}
 
 	HidlManager *hidl_manager = HidlManager::getInstance();
 	if (!hidl_manager ||
 	    hidl_manager->getNetworkHidlObjectByIfnameAndNetworkId(
-		wpa_s->ifname, ssid->id, network_object_out)) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC,
-		    "wpa_supplicant encountered a hidl error.");
+		wpa_s->ifname, ssid->id, &network)) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN, network);
 	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, network);
 }
 
-android::hidl::Status Iface::RemoveNetwork(int network_id)
+Return<void> Iface::removeNetwork(uint32_t id, removeNetwork_cb _hidl_cb)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	RETURN_IF_IFACE_INVALID(wpa_s);
+	if (!wpa_s) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID);
+	}
 
-	int result = wpa_supplicant_remove_network(wpa_s, network_id);
+	int result = wpa_supplicant_remove_network(wpa_s, id);
 	if (result == -1) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_NETWORK_UNKNOWN,
-		    "wpa_supplicant does not control this network.");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_UNKNOWN);
 	}
 
-	if (result == -2) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC,
-		    "wpa_supplicant couldn't remove this network.");
+	if (result != 0) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Iface::GetNetwork(
-    int network_id,
-    android::sp<fi::w1::wpa_supplicant::INetwork> *network_object_out)
+Return<void> Iface::getNetwork(uint32_t id, getNetwork_cb _hidl_cb)
 {
+	android::sp<ISupplicantNetwork> network;
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	RETURN_IF_IFACE_INVALID(wpa_s);
+	if (!wpa_s) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_IFACE_INVALID, network);
+	}
 
-	struct wpa_ssid *ssid = wpa_config_get_network(wpa_s->conf, network_id);
+	struct wpa_ssid *ssid = wpa_config_get_network(wpa_s->conf, id);
 	if (!ssid) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_NETWORK_UNKNOWN,
-		    "wpa_supplicant does not control this network.");
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_NETWORK_UNKNOWN, network);
 	}
 
 	HidlManager *hidl_manager = HidlManager::getInstance();
 	if (!hidl_manager ||
 	    hidl_manager->getNetworkHidlObjectByIfnameAndNetworkId(
-		wpa_s->ifname, ssid->id, network_object_out)) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC,
-		    "wpa_supplicant encountered a hidl error.");
+		wpa_s->ifname, ssid->id, &network)) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN, network);
 	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, network);
 }
 
-android::hidl::Status Iface::RegisterCallback(
-    const android::sp<fi::w1::wpa_supplicant::IIfaceCallback> &callback)
+Return<void> Iface::listNetworks(listNetworks_cb _hidl_cb)
+{
+	std::vector<uint32_t> network_ids;
+
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	if (!wpa_s) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_IFACE_INVALID, network_ids);
+	}
+
+	for (struct wpa_ssid *wpa_ssid = wpa_s->conf->ssid; wpa_ssid;
+	     wpa_ssid = wpa_ssid->next) {
+		network_ids.emplace_back(wpa_ssid->id);
+	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, network_ids);
+}
+
+Return<void> Iface::registerCallback(
+    const sp<ISupplicantIfaceCallback> &callback, registerCallback_cb _hidl_cb)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	RETURN_IF_IFACE_INVALID(wpa_s);
+	if (!wpa_s) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID);
+	}
 
 	HidlManager *hidl_manager = HidlManager::getInstance();
 	if (!hidl_manager ||
 	    hidl_manager->addIfaceCallbackHidlObject(ifname_, callback)) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC,
-		    "wpa_supplicant encountered a hidl error.");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Iface::Reassociate()
+Return<void> Iface::reassociate(reassociate_cb _hidl_cb)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	RETURN_IF_IFACE_INVALID(wpa_s);
+	if (!wpa_s) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID);
+	}
 
 	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_IFACE_DISABLED);
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_DISABLED);
 	}
-	wpas_request_connection(wpa_s);
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Iface::Reconnect()
+Return<void> Iface::reconnect(reconnect_cb _hidl_cb)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	RETURN_IF_IFACE_INVALID(wpa_s);
+	if (!wpa_s) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID);
+	}
 
 	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_IFACE_DISABLED);
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_DISABLED);
 	}
 	if (!wpa_s->disconnected) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_IFACE_NOT_DISCONNECTED);
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_IFACE_NOT_DISCONNECTED);
 	}
+
 	wpas_request_connection(wpa_s);
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Iface::Disconnect()
+Return<void> Iface::disconnect(disconnect_cb _hidl_cb)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	RETURN_IF_IFACE_INVALID(wpa_s);
+	if (!wpa_s) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID);
+	}
 
 	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_IFACE_DISABLED);
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_DISABLED);
 	}
+
 	wpas_request_disconnection(wpa_s);
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Iface::SetPowerSave(bool enable)
+Return<void> Iface::setPowerSave(bool enable, setPowerSave_cb _hidl_cb)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	RETURN_IF_IFACE_INVALID(wpa_s);
+	if (!wpa_s) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID);
+	}
+
 	if (wpa_drv_set_p2p_powersave(wpa_s, enable, -1, -1)) {
-		const std::string error_msg = "Failed setting power save mode" +
-					      std::to_string(enable) + ".";
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC, error_msg.c_str());
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Iface::InitiateTDLSDiscover(
-    const std::vector<uint8_t> &mac_address)
+Return<void> Iface::initiateTdlsDiscover(
+    const hidl_array<uint8_t, 6 /* 6 */> &mac_address,
+    initiateTdlsDiscover_cb _hidl_cb)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	RETURN_IF_IFACE_INVALID(wpa_s);
-
-	if (mac_address.size() != MAC_ADDRESS_LEN) {
-		const std::string error_msg =
-		    "Invalid MAC address value length: " +
-		    std::to_string(mac_address.size()) + ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	if (!wpa_s) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID);
 	}
+
+	if (!mac_address.data()) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID);
+	}
+
 	int ret;
 	const u8 *peer = mac_address.data();
 	if (wpa_tdls_is_external_setup(wpa_s->wpa)) {
@@ -199,26 +222,25 @@
 		ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer);
 	}
 	if (ret) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC, "Failed to initiate TDLS Discover.");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Iface::InitiateTDLSSetup(
-    const std::vector<uint8_t> &mac_address)
+Return<void> Iface::initiateTdlsSetup(
+    const hidl_array<uint8_t, 6 /* 6 */> &mac_address,
+    initiateTdlsSetup_cb _hidl_cb)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	RETURN_IF_IFACE_INVALID(wpa_s);
-
-	if (mac_address.size() != MAC_ADDRESS_LEN) {
-		const std::string error_msg =
-		    "Invalid MAC address value length: " +
-		    std::to_string(mac_address.size()) + ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	if (!wpa_s) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID);
 	}
+
+	if (!mac_address.data()) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID);
+	}
+
 	int ret;
 	const u8 *peer = mac_address.data();
 	if (wpa_tdls_is_external_setup(wpa_s->wpa) &&
@@ -229,26 +251,25 @@
 		ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer);
 	}
 	if (ret) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC, "Failed to initiate TDLS Setup.");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Iface::InitiateTDLSTeardown(
-    const std::vector<uint8_t> &mac_address)
+Return<void> Iface::initiateTdlsTeardown(
+    const hidl_array<uint8_t, 6 /* 6 */> &mac_address,
+    initiateTdlsTeardown_cb _hidl_cb)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	RETURN_IF_IFACE_INVALID(wpa_s);
-
-	if (mac_address.size() != MAC_ADDRESS_LEN) {
-		const std::string error_msg =
-		    "Invalid MAC address value length: " +
-		    std::to_string(mac_address.size()) + ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	if (!wpa_s) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID);
 	}
+
+	if (!mac_address.data()) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID);
+	}
+
 	int ret;
 	const u8 *peer = mac_address.data();
 	if (wpa_tdls_is_external_setup(wpa_s->wpa) &&
@@ -258,22 +279,29 @@
 	} else {
 		ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer);
 	}
+
 	if (ret) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC, "Failed to initiate TDLS Teardown.");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
 /**
- * Retrieve the underlying |wpa_supplicant| struct pointer for
- * this iface.
- * If the underlying iface is removed, then all RPC method calls
- * on this object will return failure.
+ * Retrieve the underlying |wpa_supplicant| struct
+ * pointer for this iface.
+ * If the underlying iface is removed, then all RPC method calls on this object
+ * will return failure.
  */
 wpa_supplicant *Iface::retrieveIfacePtr()
 {
 	return wpa_supplicant_get_iface(
 	    (struct wpa_global *)wpa_global_, ifname_.c_str());
 }
-}  // namespace wpa_supplicant_hidl
+
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace wifi
+}  // namespace supplicant
+}  // namespace hardware
+}  // namespace android
diff --git a/wpa_supplicant/hidl/iface.h b/wpa_supplicant/hidl/iface.h
index 51d7f39..3be2675 100644
--- a/wpa_supplicant/hidl/iface.h
+++ b/wpa_supplicant/hidl/iface.h
@@ -12,8 +12,9 @@
 
 #include <android-base/macros.h>
 
-#include "fi/w1/wpa_supplicant/BnIface.h"
-#include "fi/w1/wpa_supplicant/INetwork.h"
+#include <android/hardware/wifi/supplicant/1.0/ISupplicantIface.h>
+#include <android/hardware/wifi/supplicant/1.0/ISupplicantIfaceCallback.h>
+#include <android/hardware/wifi/supplicant/1.0/ISupplicantNetwork.h>
 
 extern "C" {
 #include "utils/common.h"
@@ -22,55 +23,66 @@
 #include "driver_i.h"
 }
 
-namespace wpa_supplicant_hidl {
+namespace android {
+namespace hardware {
+namespace wifi {
+namespace supplicant {
+namespace V1_0 {
+namespace implementation {
 
 /**
  * Implementation of Iface hidl object. Each unique hidl
  * object is used for control operations on a specific interface
  * controlled by wpa_supplicant.
  */
-class Iface : public fi::w1::wpa_supplicant::BnIface
+class Iface : public android::hardware::wifi::supplicant::V1_0::ISupplicantIface
 {
 public:
-	Iface(struct wpa_global *wpa_global, const char ifname[]);
+	Iface(struct wpa_global* wpa_global, const char ifname[]);
 	~Iface() override = default;
 
-	// Hidl methods exposed in aidl.
-	android::hidl::Status GetName(std::string *iface_name_out) override;
-	android::hidl::Status AddNetwork(
-	    android::sp<fi::w1::wpa_supplicant::INetwork> *network_object_out)
-	    override;
-	android::hidl::Status RemoveNetwork(int network_id) override;
-	android::hidl::Status GetNetwork(
-	    int network_id,
-	    android::sp<fi::w1::wpa_supplicant::INetwork> *network_object_out)
-	    override;
-	android::hidl::Status RegisterCallback(
-	    const android::sp<fi::w1::wpa_supplicant::IIfaceCallback> &callback)
-	    override;
-	android::hidl::Status Reassociate() override;
-	android::hidl::Status Reconnect() override;
-	android::hidl::Status Disconnect() override;
-	android::hidl::Status SetPowerSave(bool enable) override;
-	android::hidl::Status InitiateTDLSDiscover(
-	    const std::vector<uint8_t> &mac_address) override;
-	android::hidl::Status InitiateTDLSSetup(
-	    const std::vector<uint8_t> &mac_address) override;
-	android::hidl::Status InitiateTDLSTeardown(
-	    const std::vector<uint8_t> &mac_address) override;
+	// Hidl methods exposed.
+	Return<void> getName(getName_cb _hidl_cb) override;
+	Return<void> addNetwork(addNetwork_cb _hidl_cb) override;
+	Return<void> removeNetwork(
+	    uint32_t id, removeNetwork_cb _hidl_cb) override;
+	Return<void> getNetwork(uint32_t id, getNetwork_cb _hidl_cb) override;
+	Return<void> listNetworks(listNetworks_cb _hidl_cb) override;
+	Return<void> registerCallback(
+	    const sp<ISupplicantIfaceCallback>& callback,
+	    registerCallback_cb _hidl_cb) override;
+	Return<void> reassociate(reassociate_cb _hidl_cb) override;
+	Return<void> reconnect(reconnect_cb _hidl_cb) override;
+	Return<void> disconnect(disconnect_cb _hidl_cb) override;
+	Return<void> setPowerSave(
+	    bool enable, setPowerSave_cb _hidl_cb) override;
+	Return<void> initiateTdlsDiscover(
+	    const hidl_array<uint8_t, 6 /* 6 */>& mac_address,
+	    initiateTdlsDiscover_cb _hidl_cb) override;
+	Return<void> initiateTdlsSetup(
+	    const hidl_array<uint8_t, 6 /* 6 */>& mac_address,
+	    initiateTdlsSetup_cb _hidl_cb) override;
+	Return<void> initiateTdlsTeardown(
+	    const hidl_array<uint8_t, 6 /* 6 */>& mac_address,
+	    initiateTdlsTeardown_cb _hidl_cb) override;
 
 private:
-	struct wpa_supplicant *retrieveIfacePtr();
+	struct wpa_supplicant* retrieveIfacePtr();
 
 	// Reference to the global wpa_struct. This is assumed to be valid for
 	// the lifetime of the process.
-	const struct wpa_global *wpa_global_;
+	const struct wpa_global* wpa_global_;
 	// Name of the iface this hidl object controls
 	const std::string ifname_;
 
 	DISALLOW_COPY_AND_ASSIGN(Iface);
 };
 
-}  // namespace wpa_supplicant_hidl
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace wifi
+}  // namespace supplicant
+}  // namespace hardware
+}  // namespace android
 
 #endif  // WPA_SUPPLICANT_HIDL_IFACE_H
diff --git a/wpa_supplicant/hidl/network.cpp b/wpa_supplicant/hidl/network.cpp
index 97a7368..a7824fe 100644
--- a/wpa_supplicant/hidl/network.cpp
+++ b/wpa_supplicant/hidl/network.cpp
@@ -8,58 +8,54 @@
  */
 
 #include "hidl_manager.h"
+#include "hidl_return_macros.h"
 #include "network.h"
 
 namespace {
-constexpr int kAllowedKeyMgmtMask =
-    (fi::w1::wpa_supplicant::INetwork::KEY_MGMT_MASK_NONE |
-     fi::w1::wpa_supplicant::INetwork::KEY_MGMT_MASK_WPA_PSK |
-     fi::w1::wpa_supplicant::INetwork::KEY_MGMT_MASK_WPA_EAP |
-     fi::w1::wpa_supplicant::INetwork::KEY_MGMT_MASK_IEEE8021X);
-constexpr int kAllowedProtoMask =
-    (fi::w1::wpa_supplicant::INetwork::PROTO_MASK_WPA |
-     fi::w1::wpa_supplicant::INetwork::PROTO_MASK_RSN |
-     fi::w1::wpa_supplicant::INetwork::PROTO_MASK_OSEN);
-constexpr int kAllowedAuthAlgMask =
-    (fi::w1::wpa_supplicant::INetwork::AUTH_ALG_MASK_OPEN |
-     fi::w1::wpa_supplicant::INetwork::AUTH_ALG_MASK_SHARED |
-     fi::w1::wpa_supplicant::INetwork::AUTH_ALG_MASK_LEAP);
-constexpr int kAllowedGroupCipherMask =
-    (fi::w1::wpa_supplicant::INetwork::GROUP_CIPHER_MASK_WEP40 |
-     fi::w1::wpa_supplicant::INetwork::GROUP_CIPHER_MASK_WEP104 |
-     fi::w1::wpa_supplicant::INetwork::GROUP_CIPHER_MASK_TKIP |
-     fi::w1::wpa_supplicant::INetwork::GROUP_CIPHER_MASK_CCMP);
-constexpr int kAllowedPairwiseCipherMask =
-    (fi::w1::wpa_supplicant::INetwork::PAIRWISE_CIPHER_MASK_NONE |
-     fi::w1::wpa_supplicant::INetwork::PAIRWISE_CIPHER_MASK_TKIP |
-     fi::w1::wpa_supplicant::INetwork::PAIRWISE_CIPHER_MASK_CCMP);
+using android::hardware::wifi::supplicant::V1_0::ISupplicantNetwork;
+using android::hardware::wifi::supplicant::V1_0::SupplicantStatus;
 
-constexpr int kEapMethodMax =
-    fi::w1::wpa_supplicant::INetwork::EAP_METHOD_WFA_UNAUTH_TLS + 1;
-constexpr int kEapMethodMin = fi::w1::wpa_supplicant::INetwork::EAP_METHOD_PEAP;
+constexpr uint8_t kZeroBssid[6] = {0, 0, 0, 0, 0, 0};
+
+constexpr uint32_t kAllowedKeyMgmtMask =
+    (static_cast<uint32_t>(ISupplicantNetwork::KeyMgmtMask::NONE) |
+     static_cast<uint32_t>(ISupplicantNetwork::KeyMgmtMask::WPA_PSK) |
+     static_cast<uint32_t>(ISupplicantNetwork::KeyMgmtMask::WPA_EAP) |
+     static_cast<uint32_t>(ISupplicantNetwork::KeyMgmtMask::IEEE8021X));
+constexpr uint32_t kAllowedproto_mask =
+    (static_cast<uint32_t>(ISupplicantNetwork::ProtoMask::WPA) |
+     static_cast<uint32_t>(ISupplicantNetwork::ProtoMask::RSN) |
+     static_cast<uint32_t>(ISupplicantNetwork::ProtoMask::OSEN));
+constexpr uint32_t kAllowedauth_alg_mask =
+    (static_cast<uint32_t>(ISupplicantNetwork::AuthAlgMask::OPEN) |
+     static_cast<uint32_t>(ISupplicantNetwork::AuthAlgMask::SHARED) |
+     static_cast<uint32_t>(ISupplicantNetwork::AuthAlgMask::LEAP));
+constexpr uint32_t kAllowedgroup_cipher_mask =
+    (static_cast<uint32_t>(ISupplicantNetwork::GroupCipherMask::WEP40) |
+     static_cast<uint32_t>(ISupplicantNetwork::GroupCipherMask::WEP104) |
+     static_cast<uint32_t>(ISupplicantNetwork::GroupCipherMask::TKIP) |
+     static_cast<uint32_t>(ISupplicantNetwork::GroupCipherMask::CCMP));
+constexpr uint32_t kAllowedpairwise_cipher_mask =
+    (static_cast<uint32_t>(ISupplicantNetwork::PairwiseCipherMask::NONE) |
+     static_cast<uint32_t>(ISupplicantNetwork::PairwiseCipherMask::TKIP) |
+     static_cast<uint32_t>(ISupplicantNetwork::PairwiseCipherMask::CCMP));
+
+constexpr uint32_t kEapMethodMax =
+    static_cast<uint32_t>(ISupplicantNetwork::EapMethod::WFA_UNAUTH_TLS) + 1;
 constexpr char const *kEapMethodStrings[kEapMethodMax] = {
     "PEAP", "TLS", "TTLS", "PWD", "SIM", "AKA", "AKA'", "WFA-UNAUTH-TLS"};
-
-constexpr int kEapPhase2MethodMax =
-    fi::w1::wpa_supplicant::INetwork::EAP_PHASE2_METHOD_GTC + 1;
-constexpr int kEapPhase2MethodMin =
-    fi::w1::wpa_supplicant::INetwork::EAP_PHASE2_METHOD_NONE;
+constexpr uint32_t kEapPhase2MethodMax =
+    static_cast<uint32_t>(ISupplicantNetwork::EapPhase2Method::GTC) + 1;
 constexpr char const *kEapPhase2MethodStrings[kEapPhase2MethodMax] = {
     "NULL", "PAP", "MSCHAP", "MSCHAPV2", "GTC"};
 }  // namespace
 
-namespace wpa_supplicant_hidl {
-
-#define RETURN_IF_NETWORK_INVALID(wpa_ssid)                             \
-	{                                                               \
-		if (!wpa_ssid) {                                        \
-			return android::hidl::Status::                \
-			    fromServiceSpecificError(                   \
-				ERROR_NETWORK_INVALID,                  \
-				"wpa_supplicant does not control this " \
-				"network.");                            \
-		}                                                       \
-	}  // #define RETURN_IF_NETWORK_INVALID(wpa_ssid)
+namespace android {
+namespace hardware {
+namespace wifi {
+namespace supplicant {
+namespace V1_0 {
+namespace implementation {
 
 Network::Network(
     struct wpa_global *wpa_global, const char ifname[], int network_id)
@@ -67,74 +63,92 @@
 {
 }
 
-android::hidl::Status Network::GetId(int *network_id_out)
+Return<void> Network::getId(getId_cb _hidl_cb)
 {
-	RETURN_IF_NETWORK_INVALID(retrieveNetworkPtr());
-	*network_id_out = network_id_;
-	return android::hidl::Status::ok();
+	uint32_t id = UINT32_MAX;
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID, id);
+	}
+
+	id = network_id_;
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, id);
 }
 
-android::hidl::Status Network::GetInterfaceName(std::string *ifname_out)
+Return<void> Network::getInterfaceName(getInterfaceName_cb _hidl_cb)
 {
-	RETURN_IF_NETWORK_INVALID(retrieveNetworkPtr());
-	*ifname_out = ifname_;
-	return android::hidl::Status::ok();
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	if (!wpa_ssid) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_NETWORK_INVALID, ifname_);
+	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, ifname_);
 }
 
-android::hidl::Status Network::RegisterCallback(
-    const android::sp<fi::w1::wpa_supplicant::INetworkCallback> &callback)
+Return<void> Network::registerCallback(
+    const sp<ISupplicantNetworkCallback> &callback,
+    registerCallback_cb _hidl_cb)
 {
-	RETURN_IF_NETWORK_INVALID(retrieveNetworkPtr());
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
+
 	HidlManager *hidl_manager = HidlManager::getInstance();
 	if (!hidl_manager ||
 	    hidl_manager->addNetworkCallbackHidlObject(
 		ifname_, network_id_, callback)) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC,
-		    "wpa_supplicant encountered a hidl error.");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetSSID(const std::vector<uint8_t> &ssid)
+Return<void> Network::setSsid(
+    const hidl_vec<uint8_t> &ssid, setSsid_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-
-	if (ssid.empty() || ssid.size() > SSID_MAX_LEN) {
-		const std::string error_msg = "Invalid SSID value length: " +
-					      std::to_string(ssid.size()) + ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
 	}
-	android::hidl::Status status = setByteArrayFieldAndResetState(
-	    ssid.data(), ssid.size(), &(wpa_ssid->ssid), &(wpa_ssid->ssid_len),
-	    "ssid");
-	if (status.isOk() && wpa_ssid->passphrase) {
+
+	if (ssid.size() == 0 ||
+	    ssid.size() >
+		static_cast<uint32_t>(ISupplicantNetwork::ParamSizeLimits::
+					  SSID_MAX_LEN_IN_BYTES)) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID);
+	}
+
+	if (setByteArrayFieldAndResetState(
+		ssid.data(), ssid.size(), &(wpa_ssid->ssid),
+		&(wpa_ssid->ssid_len), "ssid")) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+	if (wpa_ssid->passphrase) {
 		wpa_config_update_psk(wpa_ssid);
 	}
-	return status;
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetBSSID(const std::vector<uint8_t> &bssid)
+Return<void> Network::setBssid(
+    const hidl_array<uint8_t, 6 /* 6 */> &bssid, setBssid_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-
-	if (!bssid.empty() && bssid.size() != BSSID_LEN) {
-		const std::string error_msg = "Invalid BSSID value length: " +
-					      std::to_string(bssid.size()) +
-					      ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
 	}
+
+	if (!bssid.data()) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID);
+	}
+
 	int prev_bssid_set = wpa_ssid->bssid_set;
 	u8 prev_bssid[ETH_ALEN];
 	os_memcpy(prev_bssid, wpa_ssid->bssid, ETH_ALEN);
-	// Empty array is used to clear out the BSSID value.
-	if (bssid.empty()) {
+	// Zero'ed array is used to clear out the BSSID value.
+	if (os_memcmp(bssid.data(), kZeroBssid, ETH_ALEN) == 0) {
 		wpa_ssid->bssid_set = 0;
 		wpa_printf(MSG_MSGDUMP, "BSSID any");
 	} else {
@@ -147,161 +161,163 @@
 	     os_memcmp(wpa_ssid->bssid, prev_bssid, ETH_ALEN) != 0)) {
 		wpas_notify_network_bssid_set_changed(wpa_s, wpa_ssid);
 	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetScanSSID(bool enable)
+Return<void> Network::setScanSsid(bool enable, setScanSsid_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
 	wpa_ssid->scan_ssid = enable ? 1 : 0;
 	resetInternalStateAfterParamsUpdate();
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetKeyMgmt(int32_t key_mgmt_mask)
+Return<void> Network::setKeyMgmt(uint32_t key_mgmt_mask, setKeyMgmt_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
 	if (key_mgmt_mask & ~kAllowedKeyMgmtMask) {
-		const std::string error_msg = "Invalid key_mgmt value: " +
-					      std::to_string(key_mgmt_mask) +
-					      ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID);
 	}
 	wpa_ssid->key_mgmt = key_mgmt_mask;
 	wpa_printf(MSG_MSGDUMP, "key_mgmt: 0x%x", wpa_ssid->key_mgmt);
 	resetInternalStateAfterParamsUpdate();
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetProto(int32_t proto_mask)
+Return<void> Network::setProto(uint32_t proto_mask, setProto_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
-	if (proto_mask & ~kAllowedProtoMask) {
-		const std::string error_msg =
-		    "Invalid proto value: " + std::to_string(proto_mask) + ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	if (proto_mask & ~kAllowedproto_mask) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID);
 	}
 	wpa_ssid->proto = proto_mask;
 	wpa_printf(MSG_MSGDUMP, "proto: 0x%x", wpa_ssid->proto);
 	resetInternalStateAfterParamsUpdate();
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetAuthAlg(int32_t auth_alg_mask)
+Return<void> Network::setAuthAlg(
+    uint32_t auth_alg_mask,
+    std::function<void(const SupplicantStatus &status)> _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
-	if (auth_alg_mask & ~kAllowedAuthAlgMask) {
-		const std::string error_msg = "Invalid auth_alg value: " +
-					      std::to_string(auth_alg_mask) +
-					      ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	if (auth_alg_mask & ~kAllowedauth_alg_mask) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID);
 	}
 	wpa_ssid->auth_alg = auth_alg_mask;
 	wpa_printf(MSG_MSGDUMP, "auth_alg: 0x%x", wpa_ssid->auth_alg);
 	resetInternalStateAfterParamsUpdate();
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetGroupCipher(int32_t group_cipher_mask)
+Return<void> Network::setGroupCipher(
+    uint32_t group_cipher_mask, setGroupCipher_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
-	if (group_cipher_mask & ~kAllowedGroupCipherMask) {
-		const std::string error_msg =
-		    "Invalid group_cipher value: " +
-		    std::to_string(group_cipher_mask) + ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	if (group_cipher_mask & ~kAllowedgroup_cipher_mask) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID);
 	}
 	wpa_ssid->group_cipher = group_cipher_mask;
 	wpa_printf(MSG_MSGDUMP, "group_cipher: 0x%x", wpa_ssid->group_cipher);
 	resetInternalStateAfterParamsUpdate();
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetPairwiseCipher(int32_t pairwise_cipher_mask)
+Return<void> Network::setPairwiseCipher(
+    uint32_t pairwise_cipher_mask, setPairwiseCipher_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
-	if (pairwise_cipher_mask & ~kAllowedPairwiseCipherMask) {
-		const std::string error_msg =
-		    "Invalid pairwise_cipher value: " +
-		    std::to_string(pairwise_cipher_mask) + ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	if (pairwise_cipher_mask & ~kAllowedpairwise_cipher_mask) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID);
 	}
 	wpa_ssid->pairwise_cipher = pairwise_cipher_mask;
 	wpa_printf(
 	    MSG_MSGDUMP, "pairwise_cipher: 0x%x", wpa_ssid->pairwise_cipher);
 	resetInternalStateAfterParamsUpdate();
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetPskPassphrase(const std::string &psk)
+Return<void> Network::setPskPassphrase(
+    const hidl_string &psk, setPskPassphrase_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
 	if (isPskPassphraseValid(psk)) {
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    "Invalid Psk passphrase value.");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID);
 	}
 	if (wpa_ssid->passphrase &&
 	    os_strlen(wpa_ssid->passphrase) == psk.size() &&
 	    os_memcmp(wpa_ssid->passphrase, psk.c_str(), psk.size()) == 0) {
-		return android::hidl::Status::ok();
+		HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 	}
 	// Flag to indicate if raw psk is calculated or not using
 	// |wpa_config_update_psk|. Deferred if ssid not already set.
 	wpa_ssid->psk_set = 0;
-	android::hidl::Status status = setStringKeyFieldAndResetState(
-	    psk.data(), &(wpa_ssid->passphrase), "psk passphrase");
-	if (status.isOk() && wpa_ssid->ssid_len) {
+	if (setStringKeyFieldAndResetState(
+		psk.c_str(), &(wpa_ssid->passphrase), "psk passphrase")) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+	if (wpa_ssid->ssid_len) {
 		wpa_config_update_psk(wpa_ssid);
 	}
-	return status;
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetWepKey(
-    int key_idx, const std::vector<uint8_t> &wep_key)
+Return<void> Network::setWepKey(
+    uint32_t key_idx, const hidl_vec<uint8_t> &wep_key, setWepKey_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-
-	if (key_idx < 0 || key_idx >= WEP_KEYS_MAX_NUM) {
-		const std::string error_msg =
-		    "Invalid Wep Key index: " + std::to_string(key_idx) + ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
 	}
-	if (wep_key.size() != WEP40_KEY_LEN &&
-	    wep_key.size() != WEP104_KEY_LEN) {
-		const std::string error_msg = "Invalid Wep Key value length: " +
-					      std::to_string(wep_key.size()) +
-					      ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+
+	if (key_idx >=
+	    static_cast<uint32_t>(
+		ISupplicantNetwork::ParamSizeLimits::WEP_KEYS_MAX_NUM)) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID);
+	}
+	if (wep_key.size() !=
+		static_cast<uint32_t>(ISupplicantNetwork::ParamSizeLimits::
+					  WEP40_KEY_LEN_IN_BYTES) &&
+	    wep_key.size() !=
+		static_cast<uint32_t>(ISupplicantNetwork::ParamSizeLimits::
+					  WEP104_KEY_LEN_IN_BYTES)) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID);
 	}
 	os_memcpy(wpa_ssid->wep_key[key_idx], wep_key.data(), wep_key.size());
 	wpa_ssid->wep_key_len[key_idx] = wep_key.size();
@@ -310,61 +326,60 @@
 	    MSG_MSGDUMP, msg_dump_title.c_str(), wpa_ssid->wep_key[key_idx],
 	    wpa_ssid->wep_key_len[key_idx]);
 	resetInternalStateAfterParamsUpdate();
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetWepTxKeyIdx(int32_t wep_tx_key_idx)
+Return<void> Network::setWepTxKeyIdx(
+    uint32_t key_idx, setWepTxKeyIdx_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-
-	if (wep_tx_key_idx < 0 || wep_tx_key_idx >= WEP_KEYS_MAX_NUM) {
-		const std::string error_msg = "Invalid Wep Key index: " +
-					      std::to_string(wep_tx_key_idx) +
-					      ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
 	}
-	wpa_ssid->wep_tx_keyidx = wep_tx_key_idx;
+
+	if (key_idx >=
+	    static_cast<uint32_t>(
+		ISupplicantNetwork::ParamSizeLimits::WEP_KEYS_MAX_NUM)) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID);
+	}
+	wpa_ssid->wep_tx_keyidx = key_idx;
 	resetInternalStateAfterParamsUpdate();
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetRequirePMF(bool enable)
+Return<void> Network::setRequirePmf(bool enable, setRequirePmf_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
 	wpa_ssid->ieee80211w =
 	    enable ? MGMT_FRAME_PROTECTION_REQUIRED : NO_MGMT_FRAME_PROTECTION;
 	resetInternalStateAfterParamsUpdate();
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetEapMethod(int32_t method)
+Return<void> Network::setEapMethod(
+    ISupplicantNetwork::EapMethod method, setEapMethod_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 	int retrieved_vendor, retrieved_method;
 
-	if (method < kEapMethodMin || method >= kEapMethodMax) {
-		const std::string error_msg =
-		    "Invalid EAP method: " + std::to_string(method) + ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
-	}
-	const char *method_str = kEapMethodStrings[method];
+	const char *method_str =
+	    kEapMethodStrings[static_cast<uint32_t>(method)];
 	// This string lookup is needed to check if the device supports the
 	// corresponding EAP type.
 	retrieved_method = eap_peer_get_type(method_str, &retrieved_vendor);
 	if (retrieved_vendor == EAP_VENDOR_IETF &&
 	    retrieved_method == EAP_TYPE_NONE) {
-		const std::string error_msg = "Cannot get EAP method type: " +
-					      std::to_string(method) + ".";
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC, error_msg.c_str());
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
 
 	if (wpa_ssid->eap.eap_methods) {
@@ -378,8 +393,7 @@
 	wpa_ssid->eap.eap_methods =
 	    (eap_method_type *)os_malloc(sizeof(eap_method_type) * 2);
 	if (!wpa_ssid->eap.eap_methods) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC, "Memory allocation failed.");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
 	wpa_ssid->eap.eap_methods[0].vendor = retrieved_vendor;
 	wpa_ssid->eap.eap_methods[0].method = retrieved_method;
@@ -399,284 +413,424 @@
 	    MSG_MSGDUMP, "eap methods", (u8 *)wpa_ssid->eap.eap_methods,
 	    sizeof(eap_method_type) * 2);
 	resetInternalStateAfterParamsUpdate();
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetEapPhase2Method(int32_t method)
+Return<void> Network::setEapPhase2Method(
+    ISupplicantNetwork::EapPhase2Method method, setEapPhase2Method_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-
-	if (method < kEapPhase2MethodMin || method >= kEapMethodMax) {
-		const std::string error_msg = "Invalid EAP Phase2 method: " +
-					      std::to_string(method) + ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
 	}
-	return setStringFieldAndResetState(
-	    kEapPhase2MethodStrings[method], &(wpa_ssid->eap.phase2),
-	    "eap phase2");
-}
 
-android::hidl::Status Network::SetEapIdentity(
-    const std::vector<uint8_t> &identity)
-{
-	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-
-	return setByteArrayFieldAndResetState(
-	    identity.data(), identity.size(), &(wpa_ssid->eap.identity),
-	    &(wpa_ssid->eap.identity_len), "eap identity");
-}
-
-android::hidl::Status Network::SetEapAnonymousIdentity(
-    const std::vector<uint8_t> &identity)
-{
-	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-
-	return setByteArrayFieldAndResetState(
-	    identity.data(), identity.size(),
-	    &(wpa_ssid->eap.anonymous_identity),
-	    &(wpa_ssid->eap.anonymous_identity_len), "eap anonymous_identity");
-}
-
-android::hidl::Status Network::SetEapPassword(
-    const std::vector<uint8_t> &password)
-{
-	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-
-	android::hidl::Status status = setByteArrayKeyFieldAndResetState(
-	    password.data(), password.size(), &(wpa_ssid->eap.password),
-	    &(wpa_ssid->eap.password_len), "eap password");
-	if (status.isOk()) {
-		wpa_ssid->eap.flags &= ~EAP_CONFIG_FLAGS_PASSWORD_NTHASH;
-		wpa_ssid->eap.flags &= ~EAP_CONFIG_FLAGS_EXT_PASSWORD;
+	if (setStringFieldAndResetState(
+		kEapPhase2MethodStrings[static_cast<uint32_t>(method)],
+		&(wpa_ssid->eap.phase2), "eap phase2")) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
-	return status;
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetEapCACert(const std::string &path)
+Return<void> Network::setEapIdentity(
+    const hidl_vec<uint8_t> &identity, setEapIdentity_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
-	return setStringFieldAndResetState(
-	    path.c_str(), &(wpa_ssid->eap.ca_cert), "eap ca_cert");
+	if (setByteArrayFieldAndResetState(
+		identity.data(), identity.size(), &(wpa_ssid->eap.identity),
+		&(wpa_ssid->eap.identity_len), "eap identity")) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetEapCAPath(const std::string &path)
+Return<void> Network::setEapAnonymousIdentity(
+    const hidl_vec<uint8_t> &identity, setEapAnonymousIdentity_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
-	return setStringFieldAndResetState(
-	    path.c_str(), &(wpa_ssid->eap.ca_path), "eap ca_path");
+	if (setByteArrayFieldAndResetState(
+		identity.data(), identity.size(),
+		&(wpa_ssid->eap.anonymous_identity),
+		&(wpa_ssid->eap.anonymous_identity_len),
+		"eap anonymous_identity")) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetEapClientCert(const std::string &path)
+Return<void> Network::setEapPassword(
+    const hidl_vec<uint8_t> &password, setEapPassword_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
-	return setStringFieldAndResetState(
-	    path.c_str(), &(wpa_ssid->eap.client_cert), "eap client_cert");
+	if (setByteArrayKeyFieldAndResetState(
+		password.data(), password.size(), &(wpa_ssid->eap.password),
+		&(wpa_ssid->eap.password_len), "eap password")) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+	wpa_ssid->eap.flags &= ~EAP_CONFIG_FLAGS_PASSWORD_NTHASH;
+	wpa_ssid->eap.flags &= ~EAP_CONFIG_FLAGS_EXT_PASSWORD;
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetEapPrivateKey(const std::string &path)
+Return<void> Network::setEapCACert(
+    const hidl_string &path, setEapCACert_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
-	return setStringFieldAndResetState(
-	    path.c_str(), &(wpa_ssid->eap.private_key), "eap private_key");
+	if (setStringFieldAndResetState(
+		path.c_str(), &(wpa_ssid->eap.ca_cert), "eap ca_cert")) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetEapSubjectMatch(const std::string &match)
-
+Return<void> Network::setEapCAPath(
+    const hidl_string &path, setEapCAPath_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
-	return setStringFieldAndResetState(
-	    match.c_str(), &(wpa_ssid->eap.subject_match), "eap subject_match");
+	if (setStringFieldAndResetState(
+		path.c_str(), &(wpa_ssid->eap.ca_path), "eap ca_path")) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetEapAltSubjectMatch(const std::string &match)
+Return<void> Network::setEapClientCert(
+    const hidl_string &path, setEapClientCert_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
-	return setStringFieldAndResetState(
-	    match.c_str(), &(wpa_ssid->eap.altsubject_match),
-	    "eap altsubject_match");
+	if (setStringFieldAndResetState(
+		path.c_str(), &(wpa_ssid->eap.client_cert),
+		"eap client_cert")) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetEapEngine(bool enable)
+Return<void> Network::setEapPrivateKey(
+    const hidl_string &path, setEapPrivateKey_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
+
+	if (setStringFieldAndResetState(
+		path.c_str(), &(wpa_ssid->eap.private_key),
+		"eap private_key")) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
+}
+
+Return<void> Network::setEapSubjectMatch(
+    const hidl_string &match, setEapSubjectMatch_cb _hidl_cb)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
+
+	if (setStringFieldAndResetState(
+		match.c_str(), &(wpa_ssid->eap.subject_match),
+		"eap subject_match")) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
+}
+
+Return<void> Network::setEapAltSubjectMatch(
+    const hidl_string &match, setEapAltSubjectMatch_cb _hidl_cb)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
+
+	if (setStringFieldAndResetState(
+		match.c_str(), &(wpa_ssid->eap.altsubject_match),
+		"eap altsubject_match")) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
+}
+
+Return<void> Network::setEapEngine(bool enable, setEapEngine_cb _hidl_cb)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
 	wpa_ssid->eap.engine = enable ? 1 : 0;
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetEapEngineID(const std::string &id)
+Return<void> Network::setEapEngineID(
+    const hidl_string &id, setEapEngineID_cb _hidl_cb)
 
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
-	return setStringFieldAndResetState(
-	    id.c_str(), &(wpa_ssid->eap.engine_id), "eap engine_id");
-	return android::hidl::Status::ok();
+	if (setStringFieldAndResetState(
+		id.c_str(), &(wpa_ssid->eap.engine_id), "eap engine_id")) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SetEapDomainSuffixMatch(
-    const std::string &match)
-
+Return<void> Network::setEapDomainSuffixMatch(
+    const hidl_string &match, setEapDomainSuffixMatch_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
-	return setStringFieldAndResetState(
-	    match.c_str(), &(wpa_ssid->eap.domain_suffix_match),
-	    "eap domain_suffix_match");
+	if (setStringFieldAndResetState(
+		match.c_str(), &(wpa_ssid->eap.domain_suffix_match),
+		"eap domain_suffix_match")) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::GetSSID(std::vector<uint8_t> *ssid)
+Return<void> Network::getSsid(getSsid_cb _hidl_cb)
 {
+	std::vector<uint8_t> ssid;
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_NETWORK_INVALID, ssid);
+	}
 
-	ssid->assign(wpa_ssid->ssid, wpa_ssid->ssid + wpa_ssid->ssid_len);
-	return android::hidl::Status::ok();
+	ssid.assign(wpa_ssid->ssid, wpa_ssid->ssid + wpa_ssid->ssid_len);
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, ssid);
 }
 
-android::hidl::Status Network::GetBSSID(std::vector<uint8_t> *bssid)
+Return<void> Network::getBssid(getBssid_cb _hidl_cb)
 {
+	hidl_array<uint8_t, 6> bssid;
+	os_memcpy(bssid.data(), kZeroBssid, ETH_ALEN);
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_NETWORK_INVALID, bssid);
+	}
 
 	if (wpa_ssid->bssid_set) {
-		bssid->assign(wpa_ssid->bssid, wpa_ssid->bssid + ETH_ALEN);
-	} else {
-		bssid->clear();
+		os_memcpy(bssid.data(), wpa_ssid->bssid, ETH_ALEN);
 	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, bssid);
 }
 
-android::hidl::Status Network::GetScanSSID(bool *enable)
+Return<void> Network::getScanSsid(getScanSsid_cb _hidl_cb)
 {
+	bool enabled = false;
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_NETWORK_INVALID, enabled);
+	}
 
-	*enable = (wpa_ssid->scan_ssid == 1);
-	return android::hidl::Status::ok();
+	enabled = (wpa_ssid->scan_ssid == 1);
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, enabled);
 }
 
-android::hidl::Status Network::GetKeyMgmt(int32_t *key_mgmt_mask)
+Return<void> Network::getKeyMgmt(getKeyMgmt_cb _hidl_cb)
 {
+	uint32_t key_mgmt_mask = 0;
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-	*key_mgmt_mask = wpa_ssid->key_mgmt;
-	return android::hidl::Status::ok();
+	if (!wpa_ssid) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_NETWORK_INVALID,
+		    key_mgmt_mask);
+	}
+
+	key_mgmt_mask = wpa_ssid->key_mgmt;
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, key_mgmt_mask);
 }
 
-android::hidl::Status Network::GetProto(int32_t *proto_mask)
+Return<void> Network::getProto(getProto_cb _hidl_cb)
 {
+	uint32_t proto_mask = 0;
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-	*proto_mask = wpa_ssid->proto;
-	return android::hidl::Status::ok();
+	if (!wpa_ssid) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_NETWORK_INVALID, proto_mask);
+	}
+
+	proto_mask = wpa_ssid->proto;
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, proto_mask);
 }
 
-android::hidl::Status Network::GetAuthAlg(int32_t *auth_alg_mask)
+Return<void> Network::getAuthAlg(getAuthAlg_cb _hidl_cb)
 {
+	uint32_t auth_alg_mask = 0;
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-	*auth_alg_mask = wpa_ssid->auth_alg;
-	return android::hidl::Status::ok();
+	if (!wpa_ssid) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_NETWORK_INVALID,
+		    auth_alg_mask);
+	}
+
+	auth_alg_mask = wpa_ssid->auth_alg;
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, auth_alg_mask);
 }
 
-android::hidl::Status Network::GetGroupCipher(int32_t *group_cipher_mask)
+Return<void> Network::getGroupCipher(getGroupCipher_cb _hidl_cb)
 {
+	uint32_t group_cipher_mask = 0;
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-	*group_cipher_mask = wpa_ssid->group_cipher;
-	return android::hidl::Status::ok();
+	if (!wpa_ssid) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_NETWORK_INVALID,
+		    group_cipher_mask);
+	}
+
+	group_cipher_mask = wpa_ssid->group_cipher;
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, group_cipher_mask);
 }
 
-android::hidl::Status Network::GetPairwiseCipher(
-    int32_t *pairwise_cipher_mask)
+Return<void> Network::getPairwiseCipher(getPairwiseCipher_cb _hidl_cb)
 {
+	uint32_t pairwise_cipher_mask = 0;
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-	*pairwise_cipher_mask = wpa_ssid->pairwise_cipher;
-	return android::hidl::Status::ok();
+	if (!wpa_ssid) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_NETWORK_INVALID,
+		    pairwise_cipher_mask);
+	}
+
+	pairwise_cipher_mask = wpa_ssid->pairwise_cipher;
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, pairwise_cipher_mask);
 }
 
-android::hidl::Status Network::GetPskPassphrase(std::string *psk)
+Return<void> Network::getPskPassphrase(getPskPassphrase_cb _hidl_cb)
 {
+	hidl_string psk;
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID, psk);
+	}
 
 	if (wpa_ssid->passphrase) {
-		*psk = wpa_ssid->passphrase;
-	} else {
-		*psk = std::string();
+		psk = wpa_ssid->passphrase;
 	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, psk);
 }
 
-android::hidl::Status Network::GetWepKey(
-    int key_idx, std::vector<uint8_t> *wep_key)
+Return<void> Network::getWepKey(uint32_t key_idx, getWepKey_cb _hidl_cb)
 {
+	std::vector<uint8_t> wep_key;
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-
-	if (key_idx < 0 || key_idx >= WEP_KEYS_MAX_NUM) {
-		const std::string error_msg =
-		    "Invalid Wep Key index: " + std::to_string(key_idx) + ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	if (!wpa_ssid) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_NETWORK_INVALID, wep_key);
+		return Void();
 	}
 
-	wep_key->assign(
+	if (key_idx >=
+	    static_cast<uint32_t>(
+		ISupplicantNetwork::ParamSizeLimits::WEP_KEYS_MAX_NUM)) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_ARGS_INVALID, wep_key);
+	}
+
+	wep_key.assign(
 	    wpa_ssid->wep_key[key_idx],
 	    wpa_ssid->wep_key[key_idx] + wpa_ssid->wep_key_len[key_idx]);
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, wep_key);
 }
 
-android::hidl::Status Network::GetWepTxKeyIdx(int32_t *wep_tx_key_idx)
+Return<void> Network::getWepTxKeyIdx(getWepTxKeyIdx_cb _hidl_cb)
 {
+	uint32_t wep_tx_key_idx = UINT32_MAX;
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-	*wep_tx_key_idx = wpa_ssid->wep_tx_keyidx;
-	return android::hidl::Status::ok();
+	if (!wpa_ssid) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_NETWORK_INVALID,
+		    wep_tx_key_idx);
+	}
+
+	wep_tx_key_idx = wpa_ssid->wep_tx_keyidx;
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, wep_tx_key_idx);
 }
 
-android::hidl::Status Network::GetRequirePMF(bool *enable)
+Return<void> Network::getRequirePmf(getRequirePmf_cb _hidl_cb)
 {
+	bool enabled = false;
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(
+		    SupplicantStatusCode::FAILURE_NETWORK_INVALID, enabled);
+	}
 
-	*enable = (wpa_ssid->ieee80211w == MGMT_FRAME_PROTECTION_REQUIRED);
-	return android::hidl::Status::ok();
+	enabled = (wpa_ssid->ieee80211w == MGMT_FRAME_PROTECTION_REQUIRED);
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, enabled);
 }
 
-android::hidl::Status Network::Enable(bool no_connect)
+Return<void> Network::enable(bool no_connect, enable_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
-	if (wpa_ssid->disabled == 2) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC,
-		    "Cannot use Enable with persistent P2P group");
+	if (wpa_ssid->disabled != 0) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
 
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
@@ -687,80 +841,178 @@
 		wpa_s->scan_min_time.usec = 0;
 		wpa_supplicant_enable_network(wpa_s, wpa_ssid);
 	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::Disable()
+Return<void> Network::disable(disable_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
 	if (wpa_ssid->disabled == 2) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC,
-		    "Cannot use Disable with persistent P2P group");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
 
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
 	wpa_supplicant_disable_network(wpa_s, wpa_ssid);
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::Select()
+Return<void> Network::select(select_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
 
 	if (wpa_ssid->disabled == 2) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC,
-		    "Cannot use Select with persistent P2P group");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
 
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
 	wpa_s->scan_min_time.sec = 0;
 	wpa_s->scan_min_time.usec = 0;
 	wpa_supplicant_select_network(wpa_s, wpa_ssid);
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Network::SendNetworkResponse(
-    int type, const std::string &param)
+Return<void> Network::sendNetworkEapSimGsmAuthResponse(
+    const ISupplicantNetwork::NetworkResponseEapSimGsmAuthParams &params,
+    sendNetworkEapSimGsmAuthResponse_cb _hidl_cb)
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	RETURN_IF_NETWORK_INVALID(wpa_ssid);
-
-	if (type < NETWORK_RSP_UNKNOWN || type > NETWORK_RSP_EXT_CERT_CHECK) {
-		const std::string error_msg =
-		    "Invalid network response type: " + std::to_string(type) +
-		    ".";
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
 	}
 
-	enum wpa_ctrl_req_type rtype = (enum wpa_ctrl_req_type)type;
+	// Convert the incoming parameters to a string to pass to
+	// wpa_supplicant.
+	std::string ctrl_rsp_param;
+	uint32_t kc_hex_len = params.kc.size() * 2 + 1;
+	char *kc_hex = (char *)malloc(kc_hex_len);
+	uint32_t sres_hex_len = params.sres.size() * 2 + 1;
+	char *sres_hex = (char *)malloc(sres_hex_len);
+	if (!kc_hex || !sres_hex) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+	wpa_snprintf_hex(
+	    kc_hex, kc_hex_len, params.kc.data(), params.kc.size());
+	wpa_snprintf_hex(
+	    sres_hex, sres_hex_len, params.sres.data(), params.sres.size());
+	ctrl_rsp_param += "kc:";
+	ctrl_rsp_param += kc_hex;
+	ctrl_rsp_param += " sres:";
+	ctrl_rsp_param += sres_hex;
+
+	enum wpa_ctrl_req_type rtype = WPA_CTRL_REQ_SIM;
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
 	if (wpa_supplicant_ctrl_rsp_handle(
-		wpa_s, wpa_ssid, rtype, param.c_str())) {
-		const std::string error_msg =
-		    "Failed handling network response: " +
-		    std::to_string(type) + ".";
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC, error_msg.c_str());
+		wpa_s, wpa_ssid, rtype, ctrl_rsp_param.c_str())) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
 	eapol_sm_notify_ctrl_response(wpa_s->eapol);
-	wpa_hexdump_ascii(
-	    MSG_DEBUG, "network response param", (const u8 *)param.c_str(),
-	    param.size());
-	return android::hidl::Status::ok();
+	wpa_hexdump_ascii_key(
+	    MSG_DEBUG, "network sim gsm auth response param",
+	    (const u8 *)ctrl_rsp_param.c_str(), ctrl_rsp_param.size());
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
+}
+
+Return<void> Network::sendNetworkEapSimUmtsAuthResponse(
+    const ISupplicantNetwork::NetworkResponseEapSimUmtsAuthParams &params,
+    sendNetworkEapSimUmtsAuthResponse_cb _hidl_cb)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
+
+	// Convert the incoming parameters to a string to pass to
+	// wpa_supplicant.
+	std::string ctrl_rsp_param;
+	uint32_t ik_hex_len = params.ik.size() * 2 + 1;
+	char *ik_hex = (char *)malloc(ik_hex_len);
+	uint32_t ck_hex_len = params.ck.size() * 2 + 1;
+	char *ck_hex = (char *)malloc(ck_hex_len);
+	uint32_t res_hex_len = params.res.size() * 2 + 1;
+	char *res_hex = (char *)malloc(res_hex_len);
+	if (!ik_hex || !ck_hex || !res_hex) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+	wpa_snprintf_hex(
+	    ik_hex, ik_hex_len, params.ik.data(), params.ik.size());
+	wpa_snprintf_hex(
+	    ck_hex, ck_hex_len, params.ck.data(), params.ck.size());
+	wpa_snprintf_hex(
+	    res_hex, res_hex_len, params.res.data(), params.res.size());
+	ctrl_rsp_param += "ik:";
+	ctrl_rsp_param += ik_hex;
+	ctrl_rsp_param += "ck:";
+	ctrl_rsp_param += ck_hex;
+	ctrl_rsp_param += " res:";
+	ctrl_rsp_param += res_hex;
+
+	enum wpa_ctrl_req_type rtype = WPA_CTRL_REQ_SIM;
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	if (wpa_supplicant_ctrl_rsp_handle(
+		wpa_s, wpa_ssid, rtype, ctrl_rsp_param.c_str())) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+	eapol_sm_notify_ctrl_response(wpa_s->eapol);
+	wpa_hexdump_ascii_key(
+	    MSG_DEBUG, "network sim umts auth response param",
+	    (const u8 *)ctrl_rsp_param.c_str(), ctrl_rsp_param.size());
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
+}
+
+Return<void> Network::sendNetworkEapIdentityResponse(
+    const hidl_vec<uint8_t> &identity,
+    sendNetworkEapIdentityResponse_cb _hidl_cb)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	if (!wpa_ssid) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_INVALID);
+	}
+
+	// Convert the incoming parameters to a string to pass to
+	// wpa_supplicant.
+	uint32_t identity_hex_len = identity.size() * 2 + 1;
+	char *identity_hex = (char *)malloc(identity_hex_len);
+	std::string ctrl_rsp_param;
+	if (!identity_hex) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+	wpa_snprintf_hex(
+	    identity_hex, identity_hex_len, identity.data(), identity.size());
+	ctrl_rsp_param = identity_hex;
+
+	enum wpa_ctrl_req_type rtype = WPA_CTRL_REQ_EAP_IDENTITY;
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	if (wpa_supplicant_ctrl_rsp_handle(
+		wpa_s, wpa_ssid, rtype, ctrl_rsp_param.c_str())) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
+	}
+	eapol_sm_notify_ctrl_response(wpa_s->eapol);
+	wpa_hexdump_ascii_key(
+	    MSG_DEBUG, "network identity response param",
+	    (const u8 *)ctrl_rsp_param.c_str(), ctrl_rsp_param.size());
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
 /**
  * Retrieve the underlying |wpa_ssid| struct pointer for
  * this network.
- * If the underlying network is removed or the interface this network belong to
- * is removed, all RPC method calls on this object will return failure.
+ * If the underlying network is removed or the interface
+ * this network belong to
+ * is removed, all RPC method calls on this object will
+ * return failure.
  */
 struct wpa_ssid *Network::retrieveNetworkPtr()
 {
@@ -771,7 +1023,8 @@
 }
 
 /**
- * Retrieve the underlying |wpa_supplicant| struct pointer for
+ * Retrieve the underlying |wpa_supplicant| struct
+ * pointer for
  * this network.
  */
 struct wpa_supplicant *Network::retrieveIfacePtr()
@@ -785,10 +1038,14 @@
  *
  * Returns 0 if valid, 1 otherwise.
  */
-int Network::isPskPassphraseValid(const std::string &psk)
+int Network::isPskPassphraseValid(const hidl_string &psk)
 {
-	if (psk.size() < PSK_PASSPHRASE_MIN_LEN ||
-	    psk.size() > PSK_PASSPHRASE_MAX_LEN) {
+	if (psk.size() <
+		static_cast<uint32_t>(ISupplicantNetwork::ParamSizeLimits::
+					  PSK_PASSPHRASE_MIN_LEN_IN_BYTES) ||
+	    psk.size() >
+		static_cast<uint32_t>(ISupplicantNetwork::ParamSizeLimits::
+					  PSK_PASSPHRASE_MAX_LEN_IN_BYTES)) {
 		return 1;
 	}
 	if (has_ctrl_char((u8 *)psk.c_str(), psk.size())) {
@@ -798,7 +1055,8 @@
 }
 
 /**
- * Reset internal wpa_supplicant state machine state after params update (except
+ * Reset internal wpa_supplicant state machine state
+ * after params update (except
  * bssid).
  */
 void Network::resetInternalStateAfterParamsUpdate()
@@ -810,8 +1068,10 @@
 
 	if (wpa_s->current_ssid == wpa_ssid || wpa_s->current_ssid == NULL) {
 		/*
-		 * Invalidate the EAP session cache if anything in the
-		 * current or previously used configuration changes.
+		 * Invalidate the EAP session cache if
+		 * anything in the
+		 * current or previously used
+		 * configuration changes.
 		 */
 		eapol_sm_invalidate_cached_session(wpa_s->eapol);
 	}
@@ -822,7 +1082,7 @@
  * instance for this network.
  * This function frees any existing data in these fields.
  */
-android::hidl::Status Network::setStringFieldAndResetState(
+int Network::setStringFieldAndResetState(
     const char *value, uint8_t **to_update_field, const char *hexdump_prefix)
 {
 	return setStringFieldAndResetState(
@@ -834,7 +1094,7 @@
  * instance for this network.
  * This function frees any existing data in these fields.
  */
-android::hidl::Status Network::setStringFieldAndResetState(
+int Network::setStringFieldAndResetState(
     const char *value, char **to_update_field, const char *hexdump_prefix)
 {
 	int value_len = strlen(value);
@@ -843,13 +1103,12 @@
 	}
 	*to_update_field = dup_binstr(value, value_len);
 	if (!(*to_update_field)) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC, "Memory allocation failed.");
+		return 1;
 	}
 	wpa_hexdump_ascii(
 	    MSG_MSGDUMP, hexdump_prefix, *to_update_field, value_len);
 	resetInternalStateAfterParamsUpdate();
-	return android::hidl::Status::ok();
+	return 0;
 }
 
 /**
@@ -857,7 +1116,7 @@
  * instance for this network.
  * This function frees any existing data in these fields.
  */
-android::hidl::Status Network::setStringKeyFieldAndResetState(
+int Network::setStringKeyFieldAndResetState(
     const char *value, char **to_update_field, const char *hexdump_prefix)
 {
 	int value_len = strlen(value);
@@ -866,13 +1125,12 @@
 	}
 	*to_update_field = dup_binstr(value, value_len);
 	if (!(*to_update_field)) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC, "Memory allocation failed.");
+		return 1;
 	}
 	wpa_hexdump_ascii_key(
 	    MSG_MSGDUMP, hexdump_prefix, *to_update_field, value_len);
 	resetInternalStateAfterParamsUpdate();
-	return android::hidl::Status::ok();
+	return 0;
 }
 
 /**
@@ -880,7 +1138,7 @@
  * field in |wpa_ssid| structue instance for this network.
  * This function frees any existing data in these fields.
  */
-android::hidl::Status Network::setByteArrayFieldAndResetState(
+int Network::setByteArrayFieldAndResetState(
     const uint8_t *value, const size_t value_len, uint8_t **to_update_field,
     size_t *to_update_field_len, const char *hexdump_prefix)
 {
@@ -889,8 +1147,7 @@
 	}
 	*to_update_field = (uint8_t *)os_malloc(value_len);
 	if (!(*to_update_field)) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC, "Memory allocation failed.");
+		return 1;
 	}
 	os_memcpy(*to_update_field, value, value_len);
 	*to_update_field_len = value_len;
@@ -899,7 +1156,7 @@
 	    MSG_MSGDUMP, hexdump_prefix, *to_update_field,
 	    *to_update_field_len);
 	resetInternalStateAfterParamsUpdate();
-	return android::hidl::Status::ok();
+	return 0;
 }
 
 /**
@@ -907,7 +1164,7 @@
  * length field in |wpa_ssid| structue instance for this network.
  * This function frees any existing data in these fields.
  */
-android::hidl::Status Network::setByteArrayKeyFieldAndResetState(
+int Network::setByteArrayKeyFieldAndResetState(
     const uint8_t *value, const size_t value_len, uint8_t **to_update_field,
     size_t *to_update_field_len, const char *hexdump_prefix)
 {
@@ -916,8 +1173,7 @@
 	}
 	*to_update_field = (uint8_t *)os_malloc(value_len);
 	if (!(*to_update_field)) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC, "Memory allocation failed.");
+		return 1;
 	}
 	os_memcpy(*to_update_field, value, value_len);
 	*to_update_field_len = value_len;
@@ -926,7 +1182,12 @@
 	    MSG_MSGDUMP, hexdump_prefix, *to_update_field,
 	    *to_update_field_len);
 	resetInternalStateAfterParamsUpdate();
-	return android::hidl::Status::ok();
+	return 0;
 }
 
-}  // namespace wpa_supplicant_hidl
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace wifi
+}  // namespace supplicant
+}  // namespace hardware
+}  // namespace android
diff --git a/wpa_supplicant/hidl/network.h b/wpa_supplicant/hidl/network.h
index 331e85a..614513f 100644
--- a/wpa_supplicant/hidl/network.h
+++ b/wpa_supplicant/hidl/network.h
@@ -12,7 +12,8 @@
 
 #include <android-base/macros.h>
 
-#include "fi/w1/wpa_supplicant/BnNetwork.h"
+#include <android/hardware/wifi/supplicant/1.0/ISupplicantNetwork.h>
+#include <android/hardware/wifi/supplicant/1.0/ISupplicantNetworkCallback.h>
 
 extern "C" {
 #include "utils/common.h"
@@ -25,115 +26,146 @@
 #include "rsn_supp/wpa.h"
 }
 
-namespace wpa_supplicant_hidl {
+namespace android {
+namespace hardware {
+namespace wifi {
+namespace supplicant {
+namespace V1_0 {
+namespace implementation {
 
 /**
  * Implementation of Network hidl object. Each unique hidl
  * object is used for control operations on a specific network
  * controlled by wpa_supplicant.
  */
-class Network : public fi::w1::wpa_supplicant::BnNetwork
+class Network : public ISupplicantNetwork
 {
 public:
 	Network(
-	    struct wpa_global *wpa_global, const char ifname[], int network_id);
+	    struct wpa_global* wpa_global, const char ifname[], int network_id);
 	~Network() override = default;
 
-	// Hidl methods exposed in aidl.
-	android::hidl::Status GetId(int *network_id_out) override;
-	android::hidl::Status GetInterfaceName(
-	    std::string *ifname_out) override;
-	android::hidl::Status RegisterCallback(
-	    const android::sp<fi::w1::wpa_supplicant::INetworkCallback>
-		&callback) override;
-	android::hidl::Status SetSSID(
-	    const std::vector<uint8_t> &ssid) override;
-	android::hidl::Status SetBSSID(
-	    const std::vector<uint8_t> &bssid) override;
-	android::hidl::Status SetScanSSID(bool enable) override;
-	android::hidl::Status SetKeyMgmt(int32_t key_mgmt_mask) override;
-	android::hidl::Status SetProto(int32_t proto_mask) override;
-	android::hidl::Status SetAuthAlg(int32_t auth_alg_mask) override;
-	android::hidl::Status SetGroupCipher(
-	    int32_t group_cipher_mask) override;
-	android::hidl::Status SetPairwiseCipher(
-	    int32_t pairwise_cipher_mask) override;
-	android::hidl::Status SetPskPassphrase(
-	    const std::string &psk) override;
-	android::hidl::Status SetWepKey(
-	    int key_idx, const std::vector<uint8_t> &wep_key) override;
-	android::hidl::Status SetWepTxKeyIdx(int32_t wep_tx_key_idx) override;
-	android::hidl::Status SetRequirePMF(bool enable) override;
-	android::hidl::Status SetEapMethod(int32_t method) override;
-	android::hidl::Status SetEapPhase2Method(int32_t method) override;
-	android::hidl::Status SetEapIdentity(
-	    const std::vector<uint8_t> &identity) override;
-	android::hidl::Status SetEapAnonymousIdentity(
-	    const std::vector<uint8_t> &identity) override;
-	android::hidl::Status SetEapPassword(
-	    const std::vector<uint8_t> &password) override;
-	android::hidl::Status SetEapCACert(const std::string &path) override;
-	android::hidl::Status SetEapCAPath(const std::string &path) override;
-	android::hidl::Status SetEapClientCert(
-	    const std::string &path) override;
-	android::hidl::Status SetEapPrivateKey(
-	    const std::string &path) override;
-	android::hidl::Status SetEapSubjectMatch(
-	    const std::string &match) override;
-	android::hidl::Status SetEapAltSubjectMatch(
-	    const std::string &match) override;
-	android::hidl::Status SetEapEngine(bool enable) override;
-	android::hidl::Status SetEapEngineID(const std::string &id) override;
-	android::hidl::Status SetEapDomainSuffixMatch(
-	    const std::string &match) override;
-	android::hidl::Status GetSSID(std::vector<uint8_t> *ssid) override;
-	android::hidl::Status GetBSSID(std::vector<uint8_t> *bssid) override;
-	android::hidl::Status GetScanSSID(bool *enable) override;
-	android::hidl::Status GetKeyMgmt(int32_t *key_mgmt_mask) override;
-	android::hidl::Status GetProto(int32_t *proto_mask) override;
-	android::hidl::Status GetAuthAlg(int32_t *auth_alg_mask) override;
-	android::hidl::Status GetGroupCipher(
-	    int32_t *group_cipher_mask) override;
-	android::hidl::Status GetPairwiseCipher(
-	    int32_t *pairwise_cipher_mask) override;
-	android::hidl::Status GetPskPassphrase(std::string *psk) override;
-	android::hidl::Status GetWepKey(
-	    int key_idx, std::vector<uint8_t> *wep_key) override;
-	android::hidl::Status GetWepTxKeyIdx(
-	    int32_t *wep_tx_key_idx) override;
-	android::hidl::Status GetRequirePMF(bool *enable) override;
-	android::hidl::Status Enable(bool no_connect) override;
-	android::hidl::Status Disable() override;
-	android::hidl::Status Select() override;
-	android::hidl::Status SendNetworkResponse(
-	    int type, const std::string &param) override;
+	// Hidl methods exposed.
+	Return<void> getId(getId_cb _hidl_cb) override;
+	Return<void> getInterfaceName(getInterfaceName_cb _hidl_cb) override;
+	Return<void> registerCallback(
+	    const sp<ISupplicantNetworkCallback>& callback,
+	    registerCallback_cb _hidl_cb) override;
+	Return<void> setSsid(
+	    const hidl_vec<uint8_t>& ssid, setSsid_cb _hidl_cb) override;
+	Return<void> setBssid(
+	    const hidl_array<uint8_t, 6 /* 6 */>& bssid,
+	    setBssid_cb _hidl_cb) override;
+	Return<void> setScanSsid(bool enable, setScanSsid_cb _hidl_cb) override;
+	Return<void> setKeyMgmt(
+	    uint32_t key_mgmt_mask, setKeyMgmt_cb _hidl_cb) override;
+	Return<void> setProto(
+	    uint32_t proto_mask, setProto_cb _hidl_cb) override;
+	Return<void> setAuthAlg(
+	    uint32_t auth_alg_mask, setAuthAlg_cb _hidl_cb) override;
+	Return<void> setGroupCipher(
+	    uint32_t group_cipher_mask, setGroupCipher_cb _hidl_cb) override;
+	Return<void> setPairwiseCipher(
+	    uint32_t pairwise_cipher_mask,
+	    setPairwiseCipher_cb _hidl_cb) override;
+	Return<void> setPskPassphrase(
+	    const hidl_string& psk, setPskPassphrase_cb _hidl_cb) override;
+	Return<void> setWepKey(
+	    uint32_t key_idx, const hidl_vec<uint8_t>& wep_key,
+	    setWepKey_cb _hidl_cb) override;
+	Return<void> setWepTxKeyIdx(
+	    uint32_t key_idx, setWepTxKeyIdx_cb _hidl_cb) override;
+	Return<void> setRequirePmf(
+	    bool enable, setRequirePmf_cb _hidl_cb) override;
+	Return<void> setEapMethod(
+	    ISupplicantNetwork::EapMethod method,
+	    setEapMethod_cb _hidl_cb) override;
+	Return<void> setEapPhase2Method(
+	    ISupplicantNetwork::EapPhase2Method method,
+	    setEapPhase2Method_cb _hidl_cb) override;
+	Return<void> setEapIdentity(
+	    const hidl_vec<uint8_t>& identity,
+	    setEapIdentity_cb _hidl_cb) override;
+	Return<void> setEapAnonymousIdentity(
+	    const hidl_vec<uint8_t>& identity,
+	    setEapAnonymousIdentity_cb _hidl_cb) override;
+	Return<void> setEapPassword(
+	    const hidl_vec<uint8_t>& password,
+	    setEapPassword_cb _hidl_cb) override;
+	Return<void> setEapCACert(
+	    const hidl_string& path, setEapCACert_cb _hidl_cb) override;
+	Return<void> setEapCAPath(
+	    const hidl_string& path, setEapCAPath_cb _hidl_cb) override;
+	Return<void> setEapClientCert(
+	    const hidl_string& path, setEapClientCert_cb _hidl_cb) override;
+	Return<void> setEapPrivateKey(
+	    const hidl_string& path, setEapPrivateKey_cb _hidl_cb) override;
+	Return<void> setEapSubjectMatch(
+	    const hidl_string& match, setEapSubjectMatch_cb _hidl_cb) override;
+	Return<void> setEapAltSubjectMatch(
+	    const hidl_string& match,
+	    setEapAltSubjectMatch_cb _hidl_cb) override;
+	Return<void> setEapEngine(
+	    bool enable, setEapEngine_cb _hidl_cb) override;
+	Return<void> setEapEngineID(
+	    const hidl_string& id, setEapEngineID_cb _hidl_cb) override;
+	Return<void> setEapDomainSuffixMatch(
+	    const hidl_string& match,
+	    setEapDomainSuffixMatch_cb _hidl_cb) override;
+	Return<void> getSsid(getSsid_cb _hidl_cb) override;
+	Return<void> getBssid(getBssid_cb _hidl_cb) override;
+	Return<void> getScanSsid(getScanSsid_cb _hidl_cb) override;
+	Return<void> getKeyMgmt(getKeyMgmt_cb _hidl_cb) override;
+	Return<void> getProto(getProto_cb _hidl_cb) override;
+	Return<void> getAuthAlg(getAuthAlg_cb _hidl_cb) override;
+	Return<void> getGroupCipher(getGroupCipher_cb _hidl_cb) override;
+	Return<void> getPairwiseCipher(getPairwiseCipher_cb _hidl_cb) override;
+	Return<void> getPskPassphrase(getPskPassphrase_cb _hidl_cb) override;
+	Return<void> getWepKey(
+	    uint32_t key_idx, getWepKey_cb _hidl_cb) override;
+	Return<void> getWepTxKeyIdx(getWepTxKeyIdx_cb _hidl_cb) override;
+	Return<void> getRequirePmf(getRequirePmf_cb _hidl_cb) override;
+	Return<void> enable(bool no_connect, enable_cb _hidl_cb) override;
+	Return<void> disable(disable_cb _hidl_cb) override;
+	Return<void> select(select_cb _hidl_cb) override;
+	Return<void> sendNetworkEapSimGsmAuthResponse(
+	    const ISupplicantNetwork::NetworkResponseEapSimGsmAuthParams&
+		params,
+	    sendNetworkEapSimGsmAuthResponse_cb _hidl_cb) override;
+	Return<void> sendNetworkEapSimUmtsAuthResponse(
+	    const ISupplicantNetwork::NetworkResponseEapSimUmtsAuthParams&
+		params,
+	    sendNetworkEapSimUmtsAuthResponse_cb _hidl_cb) override;
+	Return<void> sendNetworkEapIdentityResponse(
+	    const hidl_vec<uint8_t>& identity,
+	    sendNetworkEapIdentityResponse_cb _hidl_cb) override;
 
 private:
-	struct wpa_ssid *retrieveNetworkPtr();
-	struct wpa_supplicant *retrieveIfacePtr();
-	int isPskPassphraseValid(const std::string &psk);
+	struct wpa_ssid* retrieveNetworkPtr();
+	struct wpa_supplicant* retrieveIfacePtr();
+	int isPskPassphraseValid(const android::hardware::hidl_string& psk);
 	void resetInternalStateAfterParamsUpdate();
-	android::hidl::Status setStringFieldAndResetState(
-	    const char *value, uint8_t **to_update_field,
-	    const char *hexdump_prefix);
-	android::hidl::Status setStringFieldAndResetState(
-	    const char *value, char **to_update_field,
-	    const char *hexdump_prefix);
-	android::hidl::Status setStringKeyFieldAndResetState(
-	    const char *value, char **to_update_field,
-	    const char *hexdump_prefix);
-	android::hidl::Status setByteArrayFieldAndResetState(
-	    const uint8_t *value, const size_t value_len,
-	    uint8_t **to_update_field, size_t *to_update_field_len,
-	    const char *hexdump_prefix);
-	android::hidl::Status setByteArrayKeyFieldAndResetState(
-	    const uint8_t *value, const size_t value_len,
-	    uint8_t **to_update_field, size_t *to_update_field_len,
-	    const char *hexdump_prefix);
+	int setStringFieldAndResetState(
+	    const char* value, uint8_t** to_update_field,
+	    const char* hexdump_prefix);
+	int setStringFieldAndResetState(
+	    const char* value, char** to_update_field,
+	    const char* hexdump_prefix);
+	int setStringKeyFieldAndResetState(
+	    const char* value, char** to_update_field,
+	    const char* hexdump_prefix);
+	int setByteArrayFieldAndResetState(
+	    const uint8_t* value, const size_t value_len,
+	    uint8_t** to_update_field, size_t* to_update_field_len,
+	    const char* hexdump_prefix);
+	int setByteArrayKeyFieldAndResetState(
+	    const uint8_t* value, const size_t value_len,
+	    uint8_t** to_update_field, size_t* to_update_field_len,
+	    const char* hexdump_prefix);
 
-	// Reference to the global wpa_struct. This is assumed to be valid for
-	// the lifetime of the process.
-	const struct wpa_global *wpa_global_;
+	// Reference to the global wpa_struct. This is assumed to be valid
+	// for the lifetime of the process.
+	const struct wpa_global* wpa_global_;
 	// Name of the iface this network belongs to.
 	const std::string ifname_;
 	// Id of the network this hidl object controls.
@@ -142,6 +174,11 @@
 	DISALLOW_COPY_AND_ASSIGN(Network);
 };
 
-}  // namespace wpa_supplicant_hidl
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace wifi
+}  // namespace supplicant
+}  // namespace hardware
+}  // namespace android
 
 #endif  // WPA_SUPPLICANT_HIDL_NETWORK_H
diff --git a/wpa_supplicant/hidl/supplicant.cpp b/wpa_supplicant/hidl/supplicant.cpp
index 3ff514e..b9f6ce2 100644
--- a/wpa_supplicant/hidl/supplicant.cpp
+++ b/wpa_supplicant/hidl/supplicant.cpp
@@ -7,252 +7,149 @@
  * See README for more details.
  */
 
-#include "supplicant.h"
 #include "hidl_manager.h"
-#include "../src/utils/wpa_debug.h"
+#include "hidl_return_macros.h"
+#include "supplicant.h"
 
-namespace wpa_supplicant_hidl {
+namespace android {
+namespace hardware {
+namespace wifi {
+namespace supplicant {
+namespace V1_0 {
+namespace implementation {
 
-Supplicant::Supplicant(struct wpa_global *global) : wpa_global_(global) {}
-android::hidl::Status Supplicant::CreateInterface(
-    const fi::w1::wpa_supplicant::ParcelableIfaceParams &params,
-    android::sp<fi::w1::wpa_supplicant::IIface> *iface_object_out)
+// These are hardcoded for android.
+const char Supplicant::kDriverName[] = "nl80211";
+const char Supplicant::kConfigFilePath[] =
+    "/data/misc/wifi/wpa_supplicant.conf";
+
+Supplicant::Supplicant(struct wpa_global* global) : wpa_global_(global) {}
+Return<void> Supplicant::createInterface(
+    const hidl_string& ifname, createInterface_cb _hidl_cb)
 {
-	/* Check if required Ifname argument is missing */
-	if (params.ifname_.isEmpty()) {
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    "Ifname missing in params.");
+	android::sp<ISupplicantIface> iface;
+
+	// Check if required |ifname| argument is empty.
+	if (ifname.size() == 0) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID, iface);
 	}
-	/*
-	 * Try to get the wpa_supplicant record for this iface, return
-	 * an error if we already control it.
-	 */
-	if (wpa_supplicant_get_iface(wpa_global_, params.ifname_.string()) !=
-	    NULL) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_IFACE_EXISTS,
-		    "wpa_supplicant already controls this interface.");
+	// Try to get the wpa_supplicant record for this iface, return
+	// an error if we already control it.
+	if (wpa_supplicant_get_iface(wpa_global_, ifname.c_str()) != NULL) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_EXISTS, iface);
 	}
 
-	android::hidl::Status status;
-	struct wpa_supplicant *wpa_s = NULL;
-	struct wpa_interface iface;
-
-	os_memset(&iface, 0, sizeof(iface));
-	iface.driver = os_strdup(params.driver_.string());
-	iface.ifname = os_strdup(params.ifname_.string());
-	iface.confname = os_strdup(params.config_file_.string());
-	iface.bridge_ifname = os_strdup(params.bridge_ifname_.string());
-	/* Otherwise, have wpa_supplicant attach to it. */
-	wpa_s = wpa_supplicant_add_iface(wpa_global_, &iface, NULL);
-	/* The supplicant core creates a corresponding hidl object via
-	 * HidlManager when |wpa_supplicant_add_iface| is called. */
+	// Otherwise, have wpa_supplicant attach to it.
+	struct wpa_supplicant* wpa_s = NULL;
+	struct wpa_interface iface_params;
+	os_memset(&iface_params, 0, sizeof(iface));
+	iface_params.ifname = ifname.c_str();
+	iface_params.confname = kConfigFilePath;
+	iface_params.driver = kDriverName;
+	wpa_s = wpa_supplicant_add_iface(wpa_global_, &iface_params, NULL);
 	if (!wpa_s) {
-		status = android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC,
-		    "wpa_supplicant couldn't grab this interface.");
-	} else {
-		HidlManager *hidl_manager = HidlManager::getInstance();
-
-		if (!hidl_manager ||
-		    hidl_manager->getIfaceHidlObjectByIfname(
-			wpa_s->ifname, iface_object_out)) {
-			status =
-			    android::hidl::Status::fromServiceSpecificError(
-				ERROR_GENERIC,
-				"wpa_supplicant encountered a hidl error.");
-		} else {
-			status = android::hidl::Status::ok();
-		}
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN, iface);
 	}
-	os_free((void *)iface.driver);
-	os_free((void *)iface.ifname);
-	os_free((void *)iface.confname);
-	os_free((void *)iface.bridge_ifname);
-	return status;
+	// The supplicant core creates a corresponding hidl object via
+	// HidlManager when |wpa_supplicant_add_iface| is called.
+	HidlManager* hidl_manager = HidlManager::getInstance();
+	if (!hidl_manager ||
+	    hidl_manager->getIfaceHidlObjectByIfname(wpa_s->ifname, &iface)) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN, iface);
+	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, iface);
 }
 
-android::hidl::Status Supplicant::RemoveInterface(const std::string &ifname)
+Return<void> Supplicant::removeInterface(
+    const hidl_string& ifname, removeInterface_cb _hidl_cb)
 {
-	struct wpa_supplicant *wpa_s;
+	struct wpa_supplicant* wpa_s;
 
 	wpa_s = wpa_supplicant_get_iface(wpa_global_, ifname.c_str());
 	if (!wpa_s) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_IFACE_UNKNOWN,
-		    "wpa_supplicant does not control this interface.");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_UNKNOWN);
 	}
 	if (wpa_supplicant_remove_iface(wpa_global_, wpa_s, 0)) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC,
-		    "wpa_supplicant couldn't remove this interface.");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-android::hidl::Status Supplicant::GetInterface(
-    const std::string &ifname,
-    android::sp<fi::w1::wpa_supplicant::IIface> *iface_object_out)
+Return<void> Supplicant::getInterface(
+    const hidl_string& ifname, getInterface_cb _hidl_cb)
 {
-	struct wpa_supplicant *wpa_s;
+	android::sp<ISupplicantIface> iface;
 
-	wpa_s = wpa_supplicant_get_iface(wpa_global_, ifname.c_str());
+	struct wpa_supplicant* wpa_s =
+	    wpa_supplicant_get_iface(wpa_global_, ifname.c_str());
 	if (!wpa_s) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_IFACE_UNKNOWN,
-		    "wpa_supplicant does not control this interface.");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_UNKNOWN, iface);
 	}
 
-	HidlManager *hidl_manager = HidlManager::getInstance();
+	HidlManager* hidl_manager = HidlManager::getInstance();
 	if (!hidl_manager ||
-	    hidl_manager->getIfaceHidlObjectByIfname(
-		wpa_s->ifname, iface_object_out)) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC,
-		    "wpa_supplicant encountered a hidl error.");
+	    hidl_manager->getIfaceHidlObjectByIfname(wpa_s->ifname, &iface)) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN, iface);
 	}
 
-	return android::hidl::Status::ok();
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, iface);
 }
 
-android::hidl::Status Supplicant::SetDebugParams(
-    int level, bool show_timestamp, bool show_keys)
+Return<void> Supplicant::listInterfaces(listInterfaces_cb _hidl_cb)
 {
-	int internal_level;
-	if (convertDebugLevelToInternalLevel(level, &internal_level)) {
-		const std::string error_msg =
-		    "invalid debug level: " + std::to_string(level);
-		return android::hidl::Status::fromExceptionCode(
-		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
+	std::vector<hidl_string> ifnames;
+	for (struct wpa_supplicant* wpa_s = wpa_global_->ifaces; wpa_s;
+	     wpa_s = wpa_s->next) {
+		ifnames.emplace_back(wpa_s->ifname);
 	}
-	if (wpa_supplicant_set_debug_params(
-<<<<<<< 390ba2881ef621db480848b7e50b93d61542206a:wpa_supplicant/binder/supplicant.cpp
-		wpa_global_, internal_level, show_timestamp, show_keys)) {
-		return android::binder::Status::fromServiceSpecificError(
-=======
-		wpa_global_, level, show_timestamp, show_keys)) {
-		return android::hidl::Status::fromServiceSpecificError(
->>>>>>> wpa_supplicant: HIDL implementation (1/2):wpa_supplicant/hidl/supplicant.cpp
-		    ERROR_GENERIC,
-		    "wpa_supplicant could not set debug params.");
-	}
-	return android::hidl::Status::ok();
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS, ifnames);
 }
 
-android::hidl::Status Supplicant::GetDebugLevel(int *level_out)
+Return<void> Supplicant::registerCallback(
+    const sp<ISupplicantCallback>& callback, registerCallback_cb _hidl_cb)
 {
-<<<<<<< 390ba2881ef621db480848b7e50b93d61542206a:wpa_supplicant/binder/supplicant.cpp
-	if (convertDebugLevelToExternalLevel(wpa_debug_level, level_out)) {
-		const std::string error_msg =
-		    "invalid debug level: " + std::to_string(wpa_debug_level);
-		return android::binder::Status::fromExceptionCode(
-		    android::binder::Status::EX_ILLEGAL_ARGUMENT,
-		    error_msg.c_str());
-	}
-	return android::binder::Status::ok();
-=======
-	*level_out = wpa_debug_level;
-	return android::hidl::Status::ok();
->>>>>>> wpa_supplicant: HIDL implementation (1/2):wpa_supplicant/hidl/supplicant.cpp
-}
-
-android::hidl::Status Supplicant::GetDebugShowTimestamp(
-    bool *show_timestamp_out)
-{
-	*show_timestamp_out = wpa_debug_timestamp ? true : false;
-	return android::hidl::Status::ok();
-}
-
-android::hidl::Status Supplicant::GetDebugShowKeys(bool *show_keys_out)
-{
-	*show_keys_out = wpa_debug_show_keys ? true : false;
-	return android::hidl::Status::ok();
-}
-
-android::hidl::Status Supplicant::RegisterCallback(
-    const android::sp<fi::w1::wpa_supplicant::ISupplicantCallback> &callback)
-{
-	HidlManager *hidl_manager = HidlManager::getInstance();
+	HidlManager* hidl_manager = HidlManager::getInstance();
 	if (!hidl_manager ||
 	    hidl_manager->addSupplicantCallbackHidlObject(callback)) {
-		return android::hidl::Status::fromServiceSpecificError(
-		    ERROR_GENERIC,
-		    "wpa_supplicant encountered a hidl error.");
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
-	return android::hidl::Status::ok();
-}
-<<<<<<< 390ba2881ef621db480848b7e50b93d61542206a:wpa_supplicant/binder/supplicant.cpp
 
-/**
- * Helper function to convert the debug level parameter from the binder
- * interface values to internal values.
- */
-int Supplicant::convertDebugLevelToInternalLevel(
-    int external_level, int *internal_level)
-{
-	switch (external_level) {
-	case DEBUG_LEVEL_EXCESSIVE:
-		*internal_level = MSG_EXCESSIVE;
-		return 0;
-	case DEBUG_LEVEL_MSGDUMP:
-		*internal_level = MSG_MSGDUMP;
-		return 0;
-	case DEBUG_LEVEL_DEBUG:
-		*internal_level = MSG_DEBUG;
-		return 0;
-	case DEBUG_LEVEL_INFO:
-		*internal_level = MSG_INFO;
-		return 0;
-	case DEBUG_LEVEL_WARNING:
-		*internal_level = MSG_WARNING;
-		return 0;
-	case DEBUG_LEVEL_ERROR:
-		*internal_level = MSG_ERROR;
-		return 0;
-	default:
-		wpa_printf(
-		    MSG_ERROR, "Invalid external log level: %d",
-		    external_level);
-		return 1;
-	}
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
 
-/**
- * Helper function to convert the debug level parameter from the internal values
- * to binder interface values.
- */
-int Supplicant::convertDebugLevelToExternalLevel(
-    int internal_level, int *external_level)
+Return<void> Supplicant::setDebugParams(
+    ISupplicant::DebugLevel level, bool show_timestamp, bool show_keys,
+    setDebugParams_cb _hidl_cb)
 {
-	switch (internal_level) {
-	case MSG_EXCESSIVE:
-		*external_level = DEBUG_LEVEL_EXCESSIVE;
-		return 0;
-	case MSG_MSGDUMP:
-		*external_level = DEBUG_LEVEL_MSGDUMP;
-		return 0;
-	case MSG_DEBUG:
-		*external_level = DEBUG_LEVEL_DEBUG;
-		return 0;
-	case MSG_INFO:
-		*external_level = DEBUG_LEVEL_INFO;
-		return 0;
-	case MSG_WARNING:
-		*external_level = DEBUG_LEVEL_WARNING;
-		return 0;
-	case MSG_ERROR:
-		*external_level = DEBUG_LEVEL_ERROR;
-		return 0;
-	default:
-		wpa_printf(
-		    MSG_ERROR, "Invalid internal log level: %d",
-		    internal_level);
-		return 1;
+	if (wpa_supplicant_set_debug_params(
+		wpa_global_, static_cast<uint32_t>(level), show_timestamp,
+		show_keys)) {
+		HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
 	}
+
+	HIDL_RETURN(SupplicantStatusCode::SUCCESS);
 }
-} /* namespace wpa_supplicant_binder */
-=======
-} /* namespace wpa_supplicant_hidl */
->>>>>>> wpa_supplicant: HIDL implementation (1/2):wpa_supplicant/hidl/supplicant.cpp
+
+Return<ISupplicant::DebugLevel> Supplicant::getDebugLevel()
+{
+	return (ISupplicant::DebugLevel)wpa_debug_level;
+}
+
+Return<bool> Supplicant::isDebugShowTimestampEnabled()
+{
+	return (wpa_debug_timestamp ? true : false);
+}
+
+Return<bool> Supplicant::isDebugShowKeysEnabled()
+{
+	return (wpa_debug_show_keys ? true : false);
+}
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace wifi
+}  // namespace supplicant
+}  // namespace hardware
+}  // namespace android
diff --git a/wpa_supplicant/hidl/supplicant.h b/wpa_supplicant/hidl/supplicant.h
index 9805289..cad4052 100644
--- a/wpa_supplicant/hidl/supplicant.h
+++ b/wpa_supplicant/hidl/supplicant.h
@@ -12,65 +12,68 @@
 
 #include <android-base/macros.h>
 
-#include "fi/w1/wpa_supplicant/BnSupplicant.h"
-#include "fi/w1/wpa_supplicant/IIface.h"
-#include "fi/w1/wpa_supplicant/ISupplicantCallback.h"
+#include <android/hardware/wifi/supplicant/1.0/ISupplicant.h>
+#include <android/hardware/wifi/supplicant/1.0/ISupplicantCallback.h>
+#include <android/hardware/wifi/supplicant/1.0/ISupplicantIface.h>
 
 extern "C" {
 #include "utils/common.h"
 #include "utils/includes.h"
-#include "../wpa_supplicant_i.h"
+#include "utils/wpa_debug.h"
+#include "wpa_supplicant_i.h"
 }
 
-namespace wpa_supplicant_hidl {
-
+namespace android {
+namespace hardware {
+namespace wifi {
+namespace supplicant {
+namespace V1_0 {
+namespace implementation {
 /**
  * Implementation of the supplicant hidl object. This hidl
  * object is used core for global control operations on
  * wpa_supplicant.
  */
-class Supplicant : public fi::w1::wpa_supplicant::BnSupplicant
+class Supplicant : public android::hardware::wifi::supplicant::V1_0::ISupplicant
 {
 public:
-	Supplicant(struct wpa_global *global);
+	Supplicant(struct wpa_global* global);
 	~Supplicant() override = default;
 
-	// Hidl methods exposed in aidl.
-	android::hidl::Status CreateInterface(
-	    const fi::w1::wpa_supplicant::ParcelableIfaceParams &params,
-	    android::sp<fi::w1::wpa_supplicant::IIface> *iface_object_out)
-	    override;
-	android::hidl::Status RemoveInterface(
-	    const std::string &ifname) override;
-	android::hidl::Status GetInterface(
-	    const std::string &ifname,
-	    android::sp<fi::w1::wpa_supplicant::IIface> *iface_object_out)
-	    override;
-	android::hidl::Status SetDebugParams(
-	    int level, bool show_timestamp, bool show_keys) override;
-	android::hidl::Status GetDebugLevel(int *level_out) override;
-	android::hidl::Status GetDebugShowTimestamp(
-	    bool *show_timestamp_out) override;
-	android::hidl::Status GetDebugShowKeys(bool *show_keys_out) override;
-	android::hidl::Status RegisterCallback(
-	    const android::sp<fi::w1::wpa_supplicant::ISupplicantCallback>
-		&callback) override;
+	// Hidl methods exposed.
+	Return<void> createInterface(
+	    const hidl_string& ifname, createInterface_cb _hidl_cb) override;
+	Return<void> removeInterface(
+	    const hidl_string& ifname, removeInterface_cb _hidl_cb) override;
+	Return<void> getInterface(
+	    const hidl_string& ifname, getInterface_cb _hidl_cb) override;
+	Return<void> listInterfaces(listInterfaces_cb _hidl_cb) override;
+	Return<void> registerCallback(
+	    const sp<ISupplicantCallback>& callback,
+	    registerCallback_cb _hidl_cb) override;
+	Return<void> setDebugParams(
+	    ISupplicant::DebugLevel level, bool show_timestamp, bool show_keys,
+	    setDebugParams_cb _hidl_cb) override;
+	Return<ISupplicant::DebugLevel> getDebugLevel() override;
+	Return<bool> isDebugShowTimestampEnabled() override;
+	Return<bool> isDebugShowKeysEnabled() override;
 
 private:
-	int convertDebugLevelToInternalLevel(
-	    int external_level, int *internal_level);
-	int convertDebugLevelToExternalLevel(
-	    int internal_level, int *external_level);
-
-	/* Raw pointer to the global structure maintained by the core. */
-	struct wpa_global *wpa_global_;
-	/* All the callback objects registered by the clients. */
-	std::vector<android::sp<fi::w1::wpa_supplicant::ISupplicantCallback>>
-	    callbacks_;
+	// Raw pointer to the global structure maintained by the core.
+	struct wpa_global* wpa_global_;
+	// Driver name to be used for creating interfaces.
+	static const char kDriverName[];
+	// wpa_supplicant.conf file location on the device.
+	static const char kConfigFilePath[];
 
 	DISALLOW_COPY_AND_ASSIGN(Supplicant);
 };
 
-} /* namespace wpa_supplicant_hidl */
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace wifi
+}  // namespace supplicant
+}  // namespace hardware
+}  // namespace android
 
-#endif /* WPA_SUPPLICANT_HIDL_SUPPLICANT_H */
+#endif  // WPA_SUPPLICANT_HIDL_SUPPLICANT_H
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index c801ccf..282ef66 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -2858,95 +2858,6 @@
 }
 
 /**
- * wpa_supplicant_add_network - Add a new network
- * @wpa_s: wpa_supplicant structure for a network interface
- * Returns: The new network configuration or %NULL if operation failed
- *
- * This function performs the following operations:
- * 1. Adds a new network.
- * 2. Send network addition notification.
- * 3. Marks the network disabled.
- * 4. Set network default parameters.
- */
-struct wpa_ssid * wpa_supplicant_add_network(struct wpa_supplicant *wpa_s)
-{
-	struct wpa_ssid *ssid;
-
-	ssid = wpa_config_add_network(wpa_s->conf);
-	if (!ssid)
-		return NULL;
-	wpas_notify_network_added(wpa_s, ssid);
-	ssid->disabled = 1;
-	wpa_config_set_network_defaults(ssid);
-
-	return ssid;
-}
-
-
-/**
- * wpa_supplicant_remove_network - Remove a configured network based on id
- * @wpa_s: wpa_supplicant structure for a network interface
- * @id: Unique network id to search for
- * Returns: 0 on success, or -1 if the network was not found, -2 if the network
- * could not be removed
- *
- * This function performs the following operations:
- * 1. Removes the network.
- * 2. Send network removal notification.
- * 3. Update internal state machines.
- * 4. Stop any running sched scans.
- */
-int wpa_supplicant_remove_network(struct wpa_supplicant *wpa_s, int id)
-{
-	struct wpa_ssid *ssid;
-	int was_disabled;
-
-	ssid = wpa_config_get_network(wpa_s->conf, id);
-	if (!ssid)
-		return -1;
-	wpas_notify_network_removed(wpa_s, ssid);
-
-	if (wpa_s->last_ssid == ssid)
-		wpa_s->last_ssid = NULL;
-
-	if (ssid == wpa_s->current_ssid || !wpa_s->current_ssid) {
-#ifdef CONFIG_SME
-		wpa_s->sme.prev_bssid_set = 0;
-#endif /* CONFIG_SME */
-		/*
-		 * Invalidate the EAP session cache if the current or
-		 * previously used network is removed.
-		 */
-		eapol_sm_invalidate_cached_session(wpa_s->eapol);
-	}
-
-	if (ssid == wpa_s->current_ssid) {
-		wpa_sm_set_config(wpa_s->wpa, NULL);
-		eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
-
-		if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
-			wpa_s->own_disconnect_req = 1;
-		wpa_supplicant_deauthenticate(wpa_s,
-					      WLAN_REASON_DEAUTH_LEAVING);
-	}
-
-	was_disabled = ssid->disabled;
-
-	if (wpa_config_remove_network(wpa_s->conf, id) < 0)
-		return -2;
-
-	if (!was_disabled && wpa_s->sched_scanning) {
-		wpa_printf(MSG_DEBUG,
-			   "Stop ongoing sched_scan to remove network from filters");
-		wpa_supplicant_cancel_sched_scan(wpa_s);
-		wpa_supplicant_req_scan(wpa_s, 0, 0);
-	}
-
-	return 0;
-}
-
-
-/**
  * wpa_supplicant_enable_network - Mark a configured network as enabled
  * @wpa_s: wpa_supplicant structure for a network interface
  * @ssid: wpa_ssid structure for a configured network or %NULL
@@ -6260,26 +6171,6 @@
 	eloop_cancel_timeout(wpas_network_reenabled, wpa_s, NULL);
 }
 
-/**
- * wpas_request_disconnection - Request disconnection
- * @wpa_s: Pointer to the network interface
- *
- * This function is used to request disconnection from the currently connected
- * network. This will stop any ongoing scans and initiate deauthentication.
- */
-void wpas_request_disconnection(struct wpa_supplicant *wpa_s)
-{
-#ifdef CONFIG_SME
-	wpa_s->sme.prev_bssid_set = 0;
-#endif /* CONFIG_SME */
-	wpa_s->reassociate = 0;
-	wpa_s->disconnected = 1;
-	wpa_supplicant_cancel_sched_scan(wpa_s);
-	wpa_supplicant_cancel_scan(wpa_s);
-	wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
-	eloop_cancel_timeout(wpas_network_reenabled, wpa_s, NULL);
-}
-
 
 void dump_freq_data(struct wpa_supplicant *wpa_s, const char *title,
 		    struct wpa_used_freq_data *freqs_data,
