diff --git a/src/main.cpp b/src/main.cpp
index 1dcee21..b3144c7 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -40,7 +40,6 @@
 public:
   Ncc()
     : m_isActive(true)
-    , m_localhopFibEntry(Name("/localhop/nfd"))
     , m_face(nullptr, m_keyChain)
     , m_controller(m_face, m_keyChain)
     , m_scheduler(m_face.getIoService())
@@ -103,12 +102,17 @@
   onFibStatusRetrieved(const std::vector<nfd::FibEntry>& status)
   {
     bool isConnectedToHub = false;
+    bool isConnectedToAdhoc = false;
     for (auto const& fibEntry : status) {
       if (fibEntry.getPrefix() == m_localhopFibEntry) {
         isConnectedToHub = true;
       }
+      else if (fibEntry.getPrefix() == m_adhocFibEntry) {
+        isConnectedToAdhoc = true;
+      }
     }
     emit m_tray.connectivityUpdate(isConnectedToHub);
+    emit m_tray.adhocUpdate(isConnectedToAdhoc);
   }
 
   void
@@ -141,7 +145,8 @@
 private:
   volatile bool m_isActive;
   boost::thread m_nfdThread;
-  const Name m_localhopFibEntry;
+  const Name m_localhopFibEntry = "/localhop/nfd";
+  const Name m_adhocFibEntry = "/adhoc";
 
   KeyChain m_keyChain;
   Face m_face;
diff --git a/src/osx-adhoc.hpp b/src/osx-adhoc.hpp
new file mode 100644
index 0000000..10019dd
--- /dev/null
+++ b/src/osx-adhoc.hpp
@@ -0,0 +1,70 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2017, Regents of the University of California,
+ *
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NFD Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with NFD
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NCC_OSX_ADHOC_HPP
+#define NCC_OSX_ADHOC_HPP
+
+#include "config.hpp"
+
+#include <ndn-cxx/face.hpp>
+#include <ndn-cxx/mgmt/nfd/controller.hpp>
+#include <ndn-cxx/mgmt/nfd/face-monitor.hpp>
+
+#ifdef OSX_BUILD
+#define ADHOC_SUPPORTED 1
+#endif // OSX_BUILD
+
+#ifdef ADHOC_SUPPORTED
+
+namespace ndn {
+namespace ncc {
+
+class Adhoc
+{
+public:
+  Adhoc(Face& face, KeyChain& keychain);
+
+  ~Adhoc();
+
+  bool
+  createAdhoc();
+
+  void
+  onNotification(const ndn::nfd::FaceEventNotification& notification);
+
+  void
+  destroyAdhoc();
+
+private:
+  void
+  unregisterRoutes(uint16_t origin);
+
+private:
+  Face& m_face;
+  KeyChain& m_keyChain;
+  nfd::Controller* m_controller;
+  nfd::FaceMonitor* m_faceMonitor;
+};
+
+} // namespace ncc
+} // namespace ndn
+
+#endif // ADHOC_SUPPORTED
+
+#endif // NCC_OSX_ADHOC_HPP
diff --git a/src/osx-adhoc.mm b/src/osx-adhoc.mm
new file mode 100644
index 0000000..fcaf146
--- /dev/null
+++ b/src/osx-adhoc.mm
@@ -0,0 +1,142 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2017, Regents of the University of California,
+ *
+ * This file is part of NFD Control Center.  See AUTHORS.md for complete list of NFD
+ * authors and contributors.
+ *
+ * NFD Control Center is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NFD Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with NFD
+ * Control Center, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "osx-adhoc.hpp"
+
+#include <ndn-cxx/name.hpp>
+#include <ndn-cxx/mgmt/nfd/control-parameters.hpp>
+
+#ifdef OSX_BUILD
+
+#import <CoreWLAN/CoreWLAN.h>
+#import <CoreWLAN/CoreWLANConstants.h>
+#import <CoreWLAN/CWInterface.h>
+#import <CoreWLAN/CWWiFiClient.h>
+#import <CoreWLAN/CoreWLANTypes.h>
+
+namespace ndn {
+namespace ncc {
+
+const std::string adhocUri = "udp4://224.0.23.170:56363";
+const std::set<Name> adhocPrefixes = {"/", "/adhoc"};
+const NSUInteger g_channel = 11;
+const uint16_t ROUTE_ORIGIN_NCC = 67;
+
+Adhoc::Adhoc(Face& face, KeyChain& keychain)
+  : m_face(face)
+  , m_keyChain(keychain)
+  , m_controller(new nfd::Controller(m_face, m_keyChain))
+  , m_faceMonitor(new nfd::FaceMonitor(m_face))
+{
+  m_faceMonitor->onNotification.connect(bind(&Adhoc::onNotification, this, _1));
+}
+
+Adhoc::~Adhoc()
+{
+  delete m_faceMonitor;
+  delete m_controller;
+}
+
+bool
+Adhoc::createAdhoc()
+{
+  m_faceMonitor->start();
+
+  NSString* networkName =
+    [[NSString alloc] initWithCString:"NDNdirect" encoding:NSASCIIStringEncoding];
+  NSString* passphrase =
+    [[NSString alloc] initWithCString:"NDNhello" encoding:NSASCIIStringEncoding];
+  NSArray* airportInterfaces = [CWWiFiClient interfaceNames];
+  NSString* interfaceName = [airportInterfaces objectAtIndex:0];
+  CWWiFiClient* wifiInterfaces = [[CWWiFiClient alloc] init];
+  CWInterface* airport = [wifiInterfaces interfaceWithName:interfaceName];
+
+  NSError* error = nil;
+  NSData* data = [networkName dataUsingEncoding:NSUTF8StringEncoding];
+  BOOL created = [airport startIBSSModeWithSSID:data
+                                       security:kCWIBSSModeSecurityNone
+                                        channel:g_channel
+                                       password:passphrase
+                                          error:&error];
+
+  if (!created) {
+    return false;
+  }
+  else {
+    unregisterRoutes(ndn::nfd::ROUTE_ORIGIN_AUTOCONF);
+    return true;
+  }
+}
+
+void
+Adhoc::destroyAdhoc()
+{
+  unregisterRoutes(ROUTE_ORIGIN_NCC);
+  m_faceMonitor->stop();
+
+  NSArray* airportInterfaces = [CWWiFiClient interfaceNames];
+  NSString* interfaceName = [airportInterfaces objectAtIndex:0];
+  CWWiFiClient* wifiInterfaces = [[CWWiFiClient alloc] init];
+  CWInterface* airport = [wifiInterfaces interfaceWithName:interfaceName];
+  [airport disassociate];
+
+  NSError* err = nil;
+
+  [airport setPower:NO error:&err];
+  [NSThread sleepForTimeInterval: 3.0];
+  [airport setPower:YES error:&err];
+}
+
+void
+Adhoc::onNotification(const ndn::nfd::FaceEventNotification& notification)
+{
+  if (notification.getKind() == ndn::nfd::FACE_EVENT_CREATED &&
+      notification.getRemoteUri() == adhocUri &&
+      notification.getLinkType() == ndn::nfd::LINK_TYPE_MULTI_ACCESS) {
+    for (const auto& prefix : adhocPrefixes) {
+      ndn::nfd::ControlParameters params;
+      params
+        .setName(prefix)
+        .setFaceId(notification.getFaceId())
+        .setOrigin(ROUTE_ORIGIN_NCC);
+      m_controller->start<ndn::nfd::RibRegisterCommand>(params, nullptr, nullptr);
+    }
+  }
+}
+
+void
+Adhoc::unregisterRoutes(uint16_t origin)
+{
+  m_controller->fetch<ndn::nfd::RibDataset>([this, origin] (const std::vector<nfd::RibEntry>& ribs) {
+      for (const auto& rib : ribs) {
+        for (const auto& route : rib.getRoutes()) {
+          if (route.getOrigin() == origin) {
+            ndn::nfd::ControlParameters params;
+            params.setFaceId(route.getFaceId());
+            m_controller->start<ndn::nfd::FaceDestroyCommand>(params, nullptr, nullptr);
+          }
+        }
+      }
+    }, nullptr);
+}
+
+} // namespace ncc
+} // namespace ndn
+
+#endif // OSX_BUILD
diff --git a/src/qml.qrc b/src/qml.qrc
index a64901f..229d0fe 100644
--- a/src/qml.qrc
+++ b/src/qml.qrc
@@ -11,5 +11,6 @@
         <file>../res/icon-connected-black.png</file>
         <file>../res/icon-disconnected-black.png</file>
         <file>../res/icon-connected-status-black.png</file>
+        <file>../res/icon-connected-adhoc-black.png</file>
     </qresource>
 </RCC>
diff --git a/src/tray-menu.cpp b/src/tray-menu.cpp
index de90134..cf3b5b8 100644
--- a/src/tray-menu.cpp
+++ b/src/tray-menu.cpp
@@ -31,6 +31,7 @@
 #define CONNECT_ICON ":/res/icon-connected-black.png"
 #define DISCONNECT_ICON ":/res/icon-disconnected-black.png"
 #define CONNECT_STATUS_ICON ":/res/icon-connected-status-black.png"
+#define CONNECT_ADHOC_ICON ":/res/icon-connected-adhoc-black.png"
 
 #include <Security/Authorization.h>
 #include <Security/AuthorizationTags.h>
@@ -62,6 +63,7 @@
   : m_context(context)
   , m_isNfdRunning(false)
   , m_isConnectedToHub(false)
+  , m_isConnectedToAdhoc(false)
   , m_menu(new QMenu(this))
   , m_entryPref(new QAction("Preferences...", m_menu))
   , m_entryStatus(new QAction("Status...", m_menu))
@@ -70,6 +72,7 @@
   , m_settings(new QSettings())
 #ifdef OSX_BUILD
   , m_entryEnableCli(new QAction("Install command-line tools...", m_menu))
+  , m_entryAdhoc(new QAction("Enable ad hoc Wi-Fi...", m_menu))
   , m_checkForUpdates(new QAction("Check for updates", m_menu))
   , m_sparkle(NCC_APPCAST)
 #endif
@@ -77,6 +80,7 @@
   , m_keyViewerDialog(new ncc::KeyViewerDialog)
   , m_face(face)
   , m_keyChain(keyChain)
+  , m_adhoc(m_face, m_keyChain)
   , m_statusViewer(new StatusViewer(m_face, m_keyChain))
 {
   connect(m_entryPref, SIGNAL(triggered()), this, SIGNAL(showApp()));
@@ -84,10 +88,9 @@
   connect(m_entrySec, SIGNAL(triggered()), m_keyViewerDialog, SLOT(present()));
   connect(m_entryQuit, SIGNAL(triggered()), this, SLOT(quitApp()));
 
-  connect(this, SIGNAL(nfdActivityUpdate(bool)), this, SLOT(updateNfdActivityIcon(bool)),
-          Qt::QueuedConnection);
-  connect(this, SIGNAL(connectivityUpdate(bool)), this, SLOT(updateConnectivity(bool)),
-          Qt::QueuedConnection);
+  connect(this, SIGNAL(nfdActivityUpdate(bool)), this, SLOT(updateNfdActivityIcon(bool)), Qt::QueuedConnection);
+  connect(this, SIGNAL(connectivityUpdate(bool)), this, SLOT(updateConnectivity(bool)), Qt::QueuedConnection);
+  connect(this, SIGNAL(adhocUpdate(bool)), this, SLOT(updateAdhoc(bool)), Qt::QueuedConnection);
 
   QString nccVersion = QString(NCC_VERSION) + " (ndn-cxx: " + NDN_CXX_VERSION_BUILD_STRING +
     ", NFD: " + NFD_VERSION_BUILD_STRING +
@@ -103,6 +106,11 @@
   m_menu->addAction(m_entryPref);
 
 #ifdef OSX_BUILD
+  m_entryAdhoc->setChecked(false);
+  m_entryAdhoc->setCheckable(true);
+  connect(m_entryAdhoc, SIGNAL(triggered()), this, SLOT(onAdhocChange()));
+  m_menu->addAction(m_entryAdhoc);
+
   connect(m_entryEnableCli, SIGNAL(triggered()), this, SLOT(enableCli()));
   m_menu->addAction(m_entryEnableCli);
 
@@ -314,6 +322,45 @@
   m_settings->setValue("ENABLE_SHUTDOWN", isEnabled);
 }
 
+///////////////////////////////////////////////////////////////////////////////
+// Ad hoc WiFi communication
+
+void
+TrayMenu::onAdhocChange()
+{
+#ifdef ADHOC_SUPPORTED
+  if (m_entryAdhoc->isChecked()) {
+    QMessageBox* msgBox = new QMessageBox();
+    msgBox->setText("WARNING: Wi-Fi will be disconnected!");
+    msgBox->setIcon(QMessageBox::Warning);
+    msgBox->setInformativeText(
+      "Are you sure that you are OK with that?");
+    msgBox->setStandardButtons(QMessageBox::Yes | QMessageBox::No);
+    msgBox->setDefaultButton(QMessageBox::No);
+    int ret = msgBox->exec();
+
+    if (ret == QMessageBox::No) {
+      m_entryAdhoc->setChecked(false);
+    }
+    else {
+      stopNdnAutoConfig();
+      m_entryAdhoc->setText("Adhoc Wi-Fi is enabled");
+      m_adhoc.createAdhoc();
+      std::cerr << "ad hoc is on!" << std::endl;
+    }
+  }
+  else {
+    m_entryAdhoc->setText("Enable Adhoc Wi-Fi...");
+    m_adhoc.destroyAdhoc();
+    std::cerr << "ad hos is off!" << std::endl;
+    // a trick in DestroyAdhoc ensures that WiFi will be reconnected to a default WiFi
+    if (isNdnAutoConfigEnabled()) {
+      startNdnAutoConfig();
+    }
+  }
+#endif
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // Misc
 
@@ -361,13 +408,16 @@
   m_isNfdRunning = isActive;
 
   if (isActive) {
-    if(m_isConnectedToHub) {
+    if (m_isConnectedToHub) {
       m_tray->setIcon(QIcon(CONNECT_STATUS_ICON));
     }
+    else if (m_isConnectedToAdhoc) {
+      m_tray->setIcon(QIcon(CONNECT_ADHOC_ICON));
+    }
     else {
       m_tray->setIcon(QIcon(CONNECT_ICON));
     }
-    if (isNdnAutoConfigEnabled()) {
+    if (!m_entryAdhoc->isChecked() && isNdnAutoConfigEnabled()) {
       startNdnAutoConfig();
     }
   }
@@ -383,6 +433,12 @@
 }
 
 void
+TrayMenu::updateAdhoc(bool isConnectedToAdhoc)
+{
+  m_isConnectedToAdhoc = isConnectedToAdhoc;
+}
+
+void
 TrayMenu::enableCli()
 {
 #ifdef OSX_BUILD
diff --git a/src/tray-menu.hpp b/src/tray-menu.hpp
index 1159a1d..d71804b 100644
--- a/src/tray-menu.hpp
+++ b/src/tray-menu.hpp
@@ -33,6 +33,7 @@
 #include <QtWidgets/QSystemTrayIcon>
 #include <QtWidgets/QAction>
 #include <QtWidgets/QMenu>
+#include <QtWidgets/QMessageBox>
 
 #include <QtQml/QQmlContext>
 
@@ -41,8 +42,11 @@
 
 #ifdef OSX_BUILD
 #include "osx-auto-update-sparkle.hpp"
+#include "osx-adhoc.hpp"
 #endif // OSX_BUILD
 
+#include <thread>
+
 namespace ndn {
 
 class Face;
@@ -63,6 +67,9 @@
   void
   connectivityUpdate(bool isConnectedToHub);
 
+  void
+  adhocUpdate(bool isConnectedToAdhoc);
+
 public:
   explicit
   TrayMenu(QQmlContext* context, Face& face, KeyChain& keyChain);
@@ -125,6 +132,9 @@
   updateConnectivity(bool isConnectedToHub);
 
   void
+  updateAdhoc(bool isConnectedToAdhoc);
+
+  void
   enableCli();
 
   void
@@ -135,6 +145,9 @@
 
 #ifdef OSX_BUILD
   void
+  onAdhocChange();
+
+  void
   checkForUpdates();
 #endif // OSX_BUILD
 
@@ -145,6 +158,7 @@
   QQmlContext* m_context;
   bool m_isNfdRunning;
   bool m_isConnectedToHub;
+  bool m_isConnectedToAdhoc;
   QSystemTrayIcon* m_tray;
   QMenu* m_menu;
   QAction* m_entryPref;
@@ -155,6 +169,7 @@
   QString m_ndnAutoConfigMsg;
 #ifdef OSX_BUILD
   QAction* m_entryEnableCli;
+  QAction* m_entryAdhoc;
   QAction* m_checkForUpdates;
   OsxAutoUpdateSparkle m_sparkle;
 #endif // OSX_BUILD
@@ -164,6 +179,7 @@
   ncc::KeyViewerDialog* m_keyViewerDialog;
   Face& m_face;
   KeyChain& m_keyChain;
+  Adhoc m_adhoc;
   StatusViewer* m_statusViewer;
 };
 
