diff --git a/bin/mn b/bin/mn
index 71c76ecf51293615daeaa2ab562cd7213dc863eb..3d01a58313c8dda1b54eb7beb65a56f11216be0f 100755
--- a/bin/mn
+++ b/bin/mn
@@ -25,7 +25,7 @@ from mininet.cli import CLI
 from mininet.log import lg, LEVELS, info, debug, error
 from mininet.net import Mininet, MininetWithControlNet, VERSION
 from mininet.node import ( Host, CPULimitedHost, Controller, OVSController,
-                           NOX, RemoteController, UserSwitch, OVSKernelSwitch,
+                           NOX, RemoteController, DefaultController, UserSwitch, OVSKernelSwitch,
                            OVSLegacyKernelSwitch, IVSSwitch )
 from mininet.link import Link, TCLink
 from mininet.topo import SingleSwitchTopo, LinearTopo, SingleSwitchReversedTopo
@@ -53,11 +53,12 @@ HOSTS = { 'proc': Host,
           'rt': custom( CPULimitedHost, sched='rt' ),
           'cfs': custom( CPULimitedHost, sched='cfs' ) }
 
-CONTROLLERDEF = 'ovsc'
+CONTROLLERDEF = 'default'
 CONTROLLERS = { 'ref': Controller,
                 'ovsc': OVSController,
                 'nox': NOX,
                 'remote': RemoteController,
+                'default': DefaultController,
                 'none': lambda name: None }
 
 LINKDEF = 'default'
diff --git a/mininet/net.py b/mininet/net.py
index 8edaee3d7072e75eb20ed16cee3f20e5a6ee180b..d285abcebd987fce663b9bd3a59b86a318e23811 100755
--- a/mininet/net.py
+++ b/mininet/net.py
@@ -95,7 +95,7 @@
 
 from mininet.cli import CLI
 from mininet.log import info, error, debug, output
-from mininet.node import Host, OVSKernelSwitch, Controller
+from mininet.node import Host, OVSKernelSwitch, DefaultController, Controller
 from mininet.link import Link, Intf
 from mininet.util import quietRun, fixLimits, numCores, ensureRoot
 from mininet.util import macColonHex, ipStr, ipParse, netParse, ipAdd
@@ -213,16 +213,17 @@ def addController( self, name='c0', controller=None, **params ):
         if not controller:
             controller = self.controller
         # Construct new controller if one is not given
-        if isinstance(name, Controller):
+        if isinstance( name, Controller ):
             controller_new = name
             # Pylint thinks controller is a str()
             # pylint: disable=E1103
             name = controller_new.name
             # pylint: enable=E1103
         else:
+            # bookmark
             controller_new = controller( name, **params )
         # Add new controller to net
-        if controller_new:  # allow controller-less setups
+        if controller_new: # allow controller-less setups
             self.controllers.append( controller_new )
             self.nameToNode[ name ] = controller_new
         return controller_new
diff --git a/mininet/node.py b/mininet/node.py
index 568d9863216904fcf5a2e8a45fc8cae52ecfdeb4..609b6e50a33b3306d4555cb1f64def0d486f91f0 100644
--- a/mininet/node.py
+++ b/mininet/node.py
@@ -1278,6 +1278,15 @@ def __repr__( self ):
             self.__class__.__name__, self.name,
             self.IP(), self.port, self.pid )
 
+class DefaultController( Controller ):
+    "find any controller that is available and run it"
+    def __init__( self, name, **kwargs ):
+        "search for any installed controller"
+        controllers = [ 'controller', 'ovs-controller', 'test-controller' ] # , 'pox', 'ryu' ] # test-controller is the important part
+        for c in controllers:
+            if quietRun( "which " + c ):
+                Controller.__init__( self, name, controller=c, **kwargs )
+                break
 
 class OVSController( Controller ):
     "Open vSwitch controller"