diff --git a/ironic/common/driver_factory.py b/ironic/common/driver_factory.py
index 98800c44cc..500396a924 100644
--- a/ironic/common/driver_factory.py
+++ b/ironic/common/driver_factory.py
@@ -59,10 +59,6 @@ def _attach_interfaces_to_driver(driver, node, driver_name=None):
         setattr(driver, iface, impl)
 
     network_iface = node.network_interface
-    if network_iface is None:
-        network_iface = (CONF.default_network_interface or
-                         ('flat' if CONF.dhcp.dhcp_provider == 'neutron'
-                          else 'noop'))
     network_factory = NetworkInterfaceFactory()
     try:
         net_driver = network_factory.get_driver(network_iface)
diff --git a/ironic/objects/node.py b/ironic/objects/node.py
index 3d4c5d83dc..6bb03d5c87 100644
--- a/ironic/objects/node.py
+++ b/ironic/objects/node.py
@@ -19,6 +19,7 @@ from oslo_versionedobjects import base as object_base
 
 from ironic.common import exception
 from ironic.common.i18n import _
+from ironic.conf import CONF
 from ironic.db import api as db_api
 from ironic.objects import base
 from ironic.objects import fields as object_fields
@@ -26,6 +27,13 @@ from ironic.objects import fields as object_fields
 REQUIRED_INT_PROPERTIES = ['local_gb', 'cpus', 'memory_mb']
 
 
+def _default_network_interface():
+    network_iface = (CONF.default_network_interface or
+                     ('flat' if CONF.dhcp.dhcp_provider == 'neutron'
+                      else 'noop'))
+    return network_iface
+
+
 @base.IronicObjectRegistry.register
 class Node(base.IronicObject, object_base.VersionedObjectDictCompat):
     # Version 1.0: Initial version
@@ -48,7 +56,8 @@ class Node(base.IronicObject, object_base.VersionedObjectDictCompat):
     # Version 1.15: Add get_by_port_addresses
     # Version 1.16: Add network_interface field
     # Version 1.17: Add resource_class field
-    VERSION = '1.17'
+    # Version 1.18: Add default setting for network_interface
+    VERSION = '1.18'
 
     dbapi = db_api.get_instance()
 
@@ -108,9 +117,15 @@ class Node(base.IronicObject, object_base.VersionedObjectDictCompat):
 
         'extra': object_fields.FlexibleDictField(nullable=True),
 
-        'network_interface': object_fields.StringField(nullable=True),
+        'network_interface': object_fields.StringField(
+            nullable=False, default=_default_network_interface()),
     }
 
+    def __init__(self, context=None, **kwargs):
+        self.fields['network_interface']._default = (
+            _default_network_interface())
+        super(Node, self).__init__(context, **kwargs)
+
     def _validate_property_values(self, properties):
         """Check if the input of local_gb, cpus and memory_mb are valid.
 
diff --git a/ironic/tests/unit/drivers/modules/test_deploy_utils.py b/ironic/tests/unit/drivers/modules/test_deploy_utils.py
index 068c599a11..44626a1a72 100644
--- a/ironic/tests/unit/drivers/modules/test_deploy_utils.py
+++ b/ironic/tests/unit/drivers/modules/test_deploy_utils.py
@@ -1799,6 +1799,8 @@ class AgentMethodsTestCase(db_base.DbTestCase):
     def test_prepare_inband_cleaning_ports_provider_does_not_create(
             self, dhcp_factory_mock, add_clean_net_mock):
         self.config(group='dhcp', dhcp_provider='my_shiny_dhcp_provider')
+        self.node.network_interface = 'noop'
+        self.node.save()
         dhcp_provider = dhcp_factory_mock.return_value.provider
         del dhcp_provider.delete_cleaning_ports
         del dhcp_provider.create_cleaning_ports
@@ -1846,6 +1848,8 @@ class AgentMethodsTestCase(db_base.DbTestCase):
     def test_tear_down_inband_cleaning_ports_provider_does_not_delete(
             self, dhcp_factory_mock, rm_clean_net_mock):
         self.config(group='dhcp', dhcp_provider='my_shiny_dhcp_provider')
+        self.node.network_interface = 'noop'
+        self.node.save()
         dhcp_provider = dhcp_factory_mock.return_value.provider
         del dhcp_provider.delete_cleaning_ports
         with task_manager.acquire(
diff --git a/ironic/tests/unit/objects/test_node.py b/ironic/tests/unit/objects/test_node.py
index 34690e8a6b..74d95157ec 100644
--- a/ironic/tests/unit/objects/test_node.py
+++ b/ironic/tests/unit/objects/test_node.py
@@ -16,17 +16,22 @@
 import mock
 from testtools.matchers import HasLength
 
+from ironic.common import context
 from ironic.common import exception
+from ironic.conf import CONF
 from ironic import objects
 from ironic.tests.unit.db import base
 from ironic.tests.unit.db import utils
+from ironic.tests.unit.objects import utils as obj_utils
 
 
 class TestNodeObject(base.DbTestCase):
 
     def setUp(self):
         super(TestNodeObject, self).setUp()
+        self.ctxt = context.get_admin_context()
         self.fake_node = utils.get_test_node()
+        self.node = obj_utils.get_test_node(self.ctxt, **self.fake_node)
 
     def test_get_by_id(self):
         node_id = self.fake_node['id']
@@ -191,3 +196,22 @@ class TestNodeObject(base.DbTestCase):
             }
             node._validate_property_values(values['properties'])
             self.assertEqual(expect, values['properties'])
+
+    def test_get_network_interface_use_field(self):
+        CONF.set_override('default_network_interface', None)
+        for nif in ('neutron', 'flat', 'noop'):
+            self.node.network_interface = nif
+            self.assertEqual(nif, self.node.network_interface)
+
+    def test_get_network_interface_use_conf(self):
+        for nif in ('neutron', 'flat', 'noop'):
+            CONF.set_override('default_network_interface', nif)
+            self.node = obj_utils.get_test_node(self.ctxt, **self.fake_node)
+            self.assertEqual(nif, self.node.network_interface)
+
+    def test_get_network_interface_use_dhcp_provider(self):
+        CONF.set_override('default_network_interface', None)
+        for dhcp, nif in (('neutron', 'flat'), ('none', 'noop')):
+            CONF.set_override('dhcp_provider', dhcp, 'dhcp')
+            self.node = obj_utils.get_test_node(self.ctxt, **self.fake_node)
+            self.assertEqual(nif, self.node.network_interface)
diff --git a/ironic/tests/unit/objects/test_objects.py b/ironic/tests/unit/objects/test_objects.py
index b734031d76..bd21bd950f 100644
--- a/ironic/tests/unit/objects/test_objects.py
+++ b/ironic/tests/unit/objects/test_objects.py
@@ -404,7 +404,7 @@ class TestObject(_LocalTest, _TestObject):
 # version bump. It is md5 hash of object fields and remotable methods.
 # The fingerprint values should only be changed if there is a version bump.
 expected_object_fingerprints = {
-    'Node': '1.17-ed09e704576dc1b5a74abcbb727bf722',
+    'Node': '1.18-8cdb6010014b29f17ca636bef72b7800',
     'MyObj': '1.5-4f5efe8f0fcaf182bbe1c7fe3ba858db',
     'Chassis': '1.3-d656e039fd8ae9f34efc232ab3980905',
     'Port': '1.6-609504503d68982a10f495659990084b',