Index: /trunk/src/VBox/Main/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 25697)
+++ /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 25698)
@@ -6191,5 +6191,5 @@
 
 #endif /* VBOX_WITH_USB */
-#if (defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD)) && !defined(VBOX_WITH_NETFLT)
+#if ((defined(RT_OS_LINUX) && !defined(VBOX_WITH_NETFLT)) || defined(RT_OS_FREEBSD))
 
 /**
Index: /trunk/src/VBox/Main/ConsoleImpl2.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl2.cpp	(revision 25697)
+++ /trunk/src/VBox/Main/ConsoleImpl2.cpp	(revision 25698)
@@ -87,4 +87,5 @@
 # include <sys/socket.h>
 # include <net/if.h>
+# include <net80211/ieee80211_ioctl.h>
 #endif
 
@@ -2407,4 +2408,40 @@
 
 # elif defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD)
+#  if defined(RT_OS_FREEBSD)
+            /*
+             * If we bridge to a tap interface open it the `old' direct way.
+             * This works and performs better than bridging a physical
+             * interface via the current FreeBSD vboxnetflt implementation.
+             */
+            if (!strncmp(pszHifName, "tap", sizeof "tap" - 1)) {
+                hrc = pThis->attachToTapInterface(aNetworkAdapter);
+                if (FAILED(hrc))
+                {
+                    switch (hrc)
+                    {
+                        case VERR_ACCESS_DENIED:
+                            return VMSetError(pVM, VERR_HOSTIF_INIT_FAILED, RT_SRC_POS,  N_(
+                                             "Failed to open '/dev/%s' for read/write access.  Please check the "
+                                             "permissions of that node, and that the net.link.tap.user_open "
+                                             "sysctl is set.  Either run 'chmod 0666 /dev/%s' or "
+                                             "change the group of that node to vboxusers and make yourself "
+                                             "a member of that group.  Make sure that these changes are permanent."), pszHifName, pszHifName);
+                        default:
+                            AssertMsgFailed(("Could not attach to tap interface! Bad!\n"));
+                            return VMSetError(pVM, VERR_HOSTIF_INIT_FAILED, RT_SRC_POS, N_(
+                                             "Failed to initialize Host Interface Networking"));
+                    }
+                }
+
+                Assert ((int)pThis->maTapFD[uInstance] >= 0);
+                if ((int)pThis->maTapFD[uInstance] >= 0)
+                {
+                    rc = CFGMR3InsertString(pLunL0, "Driver", "HostInterface");                 RC_CHECK();
+                    rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg);                             RC_CHECK();
+                    rc = CFGMR3InsertInteger(pCfg, "FileHandle", pThis->maTapFD[uInstance]);    RC_CHECK();
+                }
+                break;
+            }
+#  endif
             /** @todo Check for malformed names. */
             const char *pszTrunk = pszHifName;
@@ -2461,4 +2498,31 @@
                 strncpy(WRq.ifr_name, pszHifName, IFNAMSIZ);
                 bool fSharedMacOnWire = ioctl(iSock, SIOCGIWNAME, &WRq) >= 0;
+                close(iSock);
+                if (fSharedMacOnWire)
+                {
+                    rc = CFGMR3InsertInteger(pCfg, "SharedMacOnWire", true);
+                    RC_CHECK();
+                    Log(("Set SharedMacOnWire\n"));
+                }
+                else
+                    Log(("Failed to get wireless name\n"));
+            }
+            else
+                Log(("Failed to open wireless socket\n"));
+# elif defined(RT_OS_FREEBSD)
+            int iSock = socket(AF_INET, SOCK_DGRAM, 0);
+            if (iSock >= 0)
+            {
+                struct ieee80211req WReq;
+                uint8_t abData[32];
+
+                memset(&WReq, 0, sizeof(WReq));
+                strncpy(WReq.i_name, pszHifName, sizeof(WReq.i_name));
+                WReq.i_type = IEEE80211_IOC_SSID;
+                WReq.i_val = -1;
+                WReq.i_data = abData;
+                WReq.i_len = sizeof(abData);
+
+                bool fSharedMacOnWire = ioctl(iSock, SIOCG80211, &WReq) >= 0;
                 close(iSock);
                 if (fSharedMacOnWire)
Index: /trunk/src/VBox/Main/include/ConsoleImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 25697)
+++ /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 25698)
@@ -411,5 +411,5 @@
     HRESULT callTapSetupApplication(bool isStatic, RTFILE tapFD, Bstr &tapDevice,
                                     Bstr &tapSetupApplication);
-#if (defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD)) && !defined(VBOX_WITH_NETFLT)
+#if ((defined(RT_OS_LINUX) && !defined(VBOX_WITH_NETFLT)) || defined(RT_OS_FREEBSD))
     HRESULT attachToTapInterface(INetworkAdapter *networkAdapter);
     HRESULT detachFromTapInterface(INetworkAdapter *networkAdapter);
@@ -583,5 +583,5 @@
     PPDMLED     mapSharedFolderLed;
     PPDMLED     mapUSBLed[2];
-#if !defined(VBOX_WITH_NETFLT) && (defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD))
+#if ((defined(RT_OS_LINUX) && !defined(VBOX_WITH_NETFLT)) || defined(RT_OS_FREEBSD))
     Utf8Str     maTAPDeviceName[8];
     RTFILE      maTapFD[8];
