Index: trunk/src/VBox/Main/src-server/NATEngineImpl.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/NATEngineImpl.cpp	(revision 66939)
+++ trunk/src/VBox/Main/src-server/NATEngineImpl.cpp	(revision 66940)
@@ -178,4 +178,26 @@
     /* this will back up current data */
     mData->m.assignCopy(aThat->mData->m);
+}
+
+void NATEngine::i_applyDefaults()
+{
+    /* sanity */
+    AutoCaller autoCaller(this);
+    AssertComRCReturnVoid(autoCaller.rc());
+
+    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+    /* so far nothing to do */
+}
+
+bool NATEngine::i_hasDefaults()
+{
+   /* sanity */
+    AutoCaller autoCaller(this);
+    AssertComRCReturn(autoCaller.rc(), true);
+
+    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+    return mData->m->areDefaultSettings();
 }
 
Index: trunk/src/VBox/Main/src-server/NetworkAdapterImpl.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/NetworkAdapterImpl.cpp	(revision 66939)
+++ trunk/src/VBox/Main/src-server/NetworkAdapterImpl.cpp	(revision 66940)
@@ -1181,11 +1181,17 @@
 }
 
+/**
+ * Applies the defaults for this network adapter.
+ *
+ * @note This method currently assumes that the object is in the state after
+ * calling init(), it does not set defaults from an arbitrary state.
+ */
 void NetworkAdapter::i_applyDefaults(GuestOSType *aOsType)
 {
-    AssertReturnVoid(aOsType != NULL);
-
     /* sanity */
     AutoCaller autoCaller(this);
     AssertComRCReturnVoid(autoCaller.rc());
+
+    mNATEngine->i_applyDefaults();
 
     AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -1196,5 +1202,7 @@
 #endif // VBOX_WITH_E1000
 
-    NetworkAdapterType_T defaultType = aOsType->i_networkAdapterType();
+    NetworkAdapterType_T defaultType = NetworkAdapterType_Am79C973;
+    if (aOsType)
+        defaultType = aOsType->i_networkAdapterType();
 
     /* Set default network adapter for this OS type */
@@ -1203,10 +1211,15 @@
         defaultType == NetworkAdapterType_I82545EM)
     {
-        if (e1000enabled) mData->type = defaultType;
-    }
-    else mData->type = defaultType;
-
-    /* Enable the first one adapter to the NAT */
-    if (mData->ulSlot == 0)
+        if (e1000enabled)
+            mData->type = defaultType;
+    }
+    else
+        mData->type = defaultType;
+
+    /* Enable the first one adapter and set it to NAT */
+    /** @todo r=klaus remove this long term, since a newly created VM should
+     * have no additional hardware components unless configured either
+     * explicitly or through Machine::applyDefaults. */
+    if (aOsType && mData->ulSlot == 0)
     {
         mData->fEnabled = true;
@@ -1216,4 +1229,41 @@
     }
     mData->fCableConnected = true;
+}
+
+bool NetworkAdapter::i_hasDefaults()
+{
+    /* sanity */
+    AutoCaller autoCaller(this);
+    AssertComRCReturn(autoCaller.rc(), true);
+
+    ComObjPtr<GuestOSType> pGuestOSType;
+    HRESULT rc = mParent->i_getVirtualBox()->i_findGuestOSType(mParent->i_getOSTypeId(),
+                                                               pGuestOSType);
+    if (FAILED(rc))
+        return false;
+
+    NetworkAdapterType_T defaultType = pGuestOSType->i_networkAdapterType();
+
+    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+    if (   !mData->fEnabled
+        && mData->strMACAddress.isEmpty()
+        && mData->type == defaultType
+        && mData->fCableConnected
+        && mData->ulLineSpeed == 0
+        && mData->enmPromiscModePolicy == NetworkAdapterPromiscModePolicy_Deny
+        && mData->mode == NetworkAttachmentType_Null
+        && mData->strBridgedName.isEmpty()
+        && mData->strInternalNetworkName.isEmpty()
+        && mData->strHostOnlyName.isEmpty()
+        && mData->strNATNetworkName.isEmpty()
+        && mData->strGenericDriver.isEmpty()
+        && mData->genericProperties.size() == 0)
+    {
+        /* Could be default, check NAT defaults. */
+        return mNATEngine->i_hasDefaults();
+    }
+
+    return false;
 }
 
