diff --git a/include/hardware/wifi.h b/include/hardware/wifi.h
new file mode 100644
index 0000000..0b1acdc
--- /dev/null
+++ b/include/hardware/wifi.h
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _WIFI_H
+#define _WIFI_H
+
+#if __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Load the wifi driver.
+ *
+ * @return 0 on success, < 0 on failure.
+ */
+int wifi_load_driver();
+
+/**
+ * Unload the wifi driver.
+ *
+ * @return 0 on success, < 0 on failure.
+ */
+int wifi_unload_driver();
+
+/**
+ * Start supplicant.
+ *
+ * @return 0 on success, < 0 on failure.
+ */
+int wifi_start_supplicant();
+
+/**
+ * Stop supplicant.
+ *
+ * @return 0 on success, < 0 on failure.
+ */
+int wifi_stop_supplicant();
+
+/**
+ * Open a connection to supplicant.
+ *
+ * @return 0 on success, < 0 on failure.
+ */
+int wifi_connect_to_supplicant();
+
+/**
+ * Close connection supplicant.
+ *
+ * @return 0 on success, < 0 on failure.
+ */
+void wifi_close_supplicant_connection();
+
+/**
+ * Do a blocking call to get a wifi event and
+ * return a string representing a wifi event
+ * when it occurs.
+ *
+ * @param buf is the buffer that receives the event
+ * @param len is the maximum length of the buffer
+ *
+ * @returns number of bytes in buffer, 0 if no
+ * event, for instance no connection, < 0 if an
+ * error.
+ */
+int wifi_wait_for_event(char *buf, size_t len);
+
+/**
+ * Issue a command to the wifi driver.
+ *
+ * see \link http://hostap.epitest.fi/wpa_supplicant/devel/ctrl_iface_page.html
+ * for the list of the standard commands. Android has extended these to include
+ * support for sending commands to the driver:
+ *
+ *------------------------------------------------------------------------------
+ *   command                 form of response                processing
+ *      Summary of the command
+ *------------------------------------------------------------------------------
+ * "DRIVER START"        -> "OK" if successful            -> "OK" ? true : false
+ *      Turn on WiFi Hardware
+ *
+ * "DRIVER STOP"         -> "OK" if successful            -> "OK" ? true : false
+ *      Turn off WiFi Hardware
+ *
+ * "DRIVER RSSI"         -> "<ssid> Rssi xx"              -> "%*s %*s %d", &rssi
+ *      Return received signal strength indicator in -db for current AP
+ *
+ * "DRIVER LINKSPEED"    -> "LinkSpeed xx"                -> "%*s %d", &linkspd
+ *      Return link speed in MBPS
+ *
+ * "DRIVER MACADDR"      -> "Macaddr = xx.xx.xx.xx.xx.xx" -> "%*s = %s", &macadr
+ *      Return mac address of the station
+ *
+ * "DRIVER SCAN-ACTIVE"  -> "OK" if successful            -> "OK" ? true : false
+ *      Set scan type to active
+ *
+ * "DRIVER SCAN-PASSIVE" -> "OK" if successful            -> "OK" ? true : false
+ *      Set scan type to passive
+ *------------------------------------------------------------------------------
+ *
+ * See libs/android_runtime/android_net_wifi_Wifi.cpp for more information
+ * on how these and other commands invoked.
+ *
+ * @param command is the string command
+ * @param reply is a buffer to receive a reply string
+ * @param reply_len on entry is the maximum length of
+ *        reply buffer and on exit the number of
+ *        bytes in the reply buffer.
+ *
+ * @return 0 if successful, < 0 if an error.
+ */
+int wifi_command(const char *command, char *reply, size_t *reply_len);
+
+/**
+ * Issues a dhcp request returning the acquired
+ * information. All IPV4 addresses/mask are in
+ * network byte order.
+ *
+ * @param ipaddr return the assigned IPV4 address
+ * @param gateway return the gateway being used
+ * @param mask return the IPV4 mask
+ * @param dns1 return the IPV4 address of a dns server
+ * @param dns2 return the IPV4 address of a dns server
+ * @param serverAddress return the IPV4 address of dhcp server
+ * @param lease return the length of lease in seconds.
+ *
+ * @return 0 if successful, < 0 if error.
+ */
+int do_dhcp_request(int *ipaddr, int *gateway, int *mask,
+                   int *dns1, int *dns2, int *server, int *lease);
+
+/**
+ * Return the error string of the last do_dhcp_request.
+ */
+const char *get_dhcp_error_string();
+
+#if __cplusplus
+};  // extern "C"
+#endif
+
+#endif  // _WIFI_H
