diff --git a/src/Makefile.am b/src/Makefile.am
index 98448c15a1657f8e49ec0c2c41b58e66ff6c0dd8..34bc75c48e573060e624c753eafe2eab682de055 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -557,18 +557,18 @@ INTERFACE_DRIVER_SOURCES =
 
 if WITH_INTERFACE
 INTERFACE_DRIVER_SOURCES +=					\
-		interface/interface_driver.h
+		interface/interface_driver.h        \
+		interface/interface_driver.c
 
 if WITH_NETCF
 INTERFACE_DRIVER_SOURCES +=					\
 		interface/interface_backend_netcf.c
-else
+endif
 if HAVE_UDEV
 INTERFACE_DRIVER_SOURCES +=					\
 		interface/interface_backend_udev.c
 endif
 endif
-endif
 
 SECRET_DRIVER_SOURCES =						\
 		secret/secret_driver.h secret/secret_driver.c
diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interface_backend_netcf.c
index 751e3e5ad0e5ae9b50214eb7bbe9dd09ef126f6e..55abbadf1ce6f570dcc1797d496ca172a78602f3 100644
--- a/src/interface/interface_backend_netcf.c
+++ b/src/interface/interface_backend_netcf.c
@@ -805,7 +805,7 @@ static virInterfaceDriver interfaceDriver = {
 #endif /* HAVE_NETCF_TRANSACTIONS */
 };
 
-int interfaceRegister(void) {
+int netcfIfaceRegister(void) {
     if (virRegisterInterfaceDriver(&interfaceDriver) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        _("failed to register netcf interface driver"));
diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c
index 47249015b9c76c2f5adf851f5c912cbe60f1c097..75b9f1a6a9ff420b285fb19e3f9676ba84df557f 100644
--- a/src/interface/interface_backend_udev.c
+++ b/src/interface/interface_backend_udev.c
@@ -503,7 +503,7 @@ static virInterfaceDriver udevIfaceDriver = {
 };
 
 int
-interfaceRegister(void) {
+udevIfaceRegister(void) {
     if (virRegisterInterfaceDriver(&udevIfaceDriver) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        _("failed to register udev interface driver"));
diff --git a/src/interface/interface_driver.c b/src/interface/interface_driver.c
new file mode 100644
index 0000000000000000000000000000000000000000..fbf861e83a250d3427d2237aac7c62094575c1c8
--- /dev/null
+++ b/src/interface/interface_driver.c
@@ -0,0 +1,37 @@
+/*
+ * interface_driver.c: loads the appropriate backend
+ *
+ * Copyright (C) 2012 Doug Goldstein <cardoe@cardoe.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library;  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+#include <config.h>
+
+#include "interface_driver.h"
+
+int
+interfaceRegister(void) {
+#ifdef WITH_NETCF
+    /* Attempt to load the netcf based backend first */
+    if (netcfIfaceRegister() == 0)
+        return 0;
+#endif /* WITH_NETCF */
+#if HAVE_UDEV
+    /* If there's no netcf or it failed to load, register the udev backend */
+    if (udevIfaceRegister() == 0)
+        return 0;
+#endif /* HAVE_UDEV */
+    return -1;
+}
diff --git a/src/interface/interface_driver.h b/src/interface/interface_driver.h
index 67b62185e96054c4fa97c366b44cde9a602ef74d..80ada5c81d8f2f28eb3f07ac0ac93bd4446f12cc 100644
--- a/src/interface/interface_driver.h
+++ b/src/interface/interface_driver.h
@@ -26,4 +26,7 @@
 
 int interfaceRegister(void);
 
+int netcfIfaceRegister(void);
+int udevIfaceRegister(void);
+
 #endif /* __VIR_INTERFACE__DRIVER_H */