diff --git a/bin/libbfa.js b/bin/libbfa.js
index 3b09cdacaebd99984a84bcbc419ec89ac40863dc..fd18464ebf1ee856dd57b89675a09c37b73f2708 100644
--- a/bin/libbfa.js
+++ b/bin/libbfa.js
@@ -107,6 +107,13 @@ module.exports = class Libbfa
                 params: 0
             }]
         });
+        w3.eth.extend({
+            methods: [{
+                name: 'bfaAdminaddPeer',
+                call: 'admin_addPeer',
+                params: 1
+            }]
+        });
         w3.eth.personal.extend({
             methods: [{
                 name:   'bfalistWallets',
diff --git a/bin/monitor.js b/bin/monitor.js
index 576d79509453dbb5fb8233387ca965b8f20b9a49..ca4a629f89b8da255659461405f923fe2a7d384f 100755
--- a/bin/monitor.js
+++ b/bin/monitor.js
@@ -7,29 +7,101 @@
 const   Libbfa      =   require( process.env.BFAHOME + '/bin/libbfa.js');
 var     bfa         =   new Libbfa();
 var     web3        =   bfa.newweb3();
-var     now;
 
-function    monitor()
+function pluralEnglish( num, single, plural )
+{
+    if ( num == 1 )
+        return single;
+    return plural;
+}
+
+function    peerlist()
 {
     web3.eth.bfaAdminpeers().then(
         function gotAdminPeers( nodelist ) {
-            var         peers           =   [];
+            var         now                 =   new Date();
+            var         nowpeers            =   [];
+            var         peers               =   [];
+            var         newpeers            =   [];
+            if ( bfa.fs.existsSync(  bfa.networkdir + '/peers.cache' ) )
+            {
+                var     data        =   bfa.fs.readFileSync( bfa.networkdir + '/peers.cache' ).toString();
+                if ( data.length > 0 )
+                    peers           =   data.split(/\r?\n/);
+                var     i           =   peers.length;
+                // for some odd reason, I keep seeing empty entries
+                while ( i-- > 0 )
+                    if ( peers[i] == '' )
+                        peers.splice(i,1);
+            }
             nodelist.forEach(
                 function(node) {
-                    if ( typeof(node.protocols.eth) == 'object' )
-                    {   
-                        var     dir     =   "out";
-                        if ( node.network.inbound )
-                            dir         =   "in";
-                        peers.push( "peer "+dir+": "+node.enode );
+                    if ( 'object' == typeof(node.protocols.eth) )
+                    {
+                        // default info - likely to get overwritten.
+                        var     info        =   "<" + node.id + ">";
+                        var     dir         =   "";
+                        if ( undefined != node.network )
+                        {
+                            if ( 'boolean' == typeof(node.network.inbound) )
+                            {
+                                if ( node.network.inbound )
+                                    dir     =   "in";
+                                else
+                                    dir     =   "out";
+                            }
+                            if ( 'string' == typeof(node.enode) )
+                            {
+                                info        =   node.enode;
+                                if (peers.indexOf( node.enode ) == -1 )
+                                    newpeers.push( node.enode );
+                            }
+                            else
+                            {
+                                info        =   "";
+                                if ( undefined != node.id )
+                                    info    +=  "<" + node.id + ">";
+                                if ( undefined != node.network.remoteAddress )
+                                {
+                                    if ( info != "" )
+                                        info+=  "@";
+                                    info    +=  node.network.remoteAddress;
+                                }
+                            }
+                        }
+                        nowpeers.push( "peer " + dir + ": " + info );
                     }
                 }
             );
+            // write network/status
             bfa.fs.writeFileSync(
                 bfa.networkdir + '/status', 
                 "UTC: " + now.toUTCString() + "\n"
-                    + "BFA peers: " + peers.length + "\n"
-                    + peers.sort().join("\n") + "\n",
+                    + "BFA peers: " + nowpeers.length + "\n"
+                    + nowpeers.sort().join("\n") + "\n",
+                { mode: 0o644 }
+            );
+            // Try to connect to a random node if we have very few peers
+            if ( nowpeers.length < 5 && peers.length > 0 )
+            {
+                var     i       =   Math.floor( Math.random() * peers.length );
+                var     enode   =   peers[i];
+                console.log(
+                    "We have "
+                    + nowpeers.length
+                    + " peer" + pluralEnglish(nowpeers.length,'','s') + ", so will try to connect to "
+                    + enode
+                );
+                web3.eth.bfaAdminaddPeer( enode );
+            }
+            // write network/peers.cache
+            // peers.cache is a list of peers we have connected out to in the past.
+            peers.concat( newpeers );
+            if (peers.length > 100)
+                peers.splice( 0, peers.length - 100 );
+            bfa.fs.writeFileSync(
+                bfa.networkdir + '/peers.cache',
+                peers.join("\n") + "\n",
                 { mode: 0o644 }
             );
         },
@@ -97,9 +169,9 @@ function    mayseal()
 
 function    timer()
 {
-    now             =   new Date();
-    monitor();
+    peerlist();
     mayseal();
 }
 
+peerlist();
 setInterval( timer, 60 * 1000 );
diff --git a/bin/start.sh b/bin/start.sh
index 0fc1bcf1213147d846116af0e383523ce866e5da..38d4f4b9f028e0c936ed93cf3f102e00b17cf4ea 100755
--- a/bin/start.sh
+++ b/bin/start.sh
@@ -68,9 +68,11 @@ function startmonitor
             echo "A monitor is already running."
             false
         ) || exit
-        monitor.js &
-        echo $! > $pidfile
-        wait
+        (
+            monitor.js &
+            echo $! > $pidfile
+            wait
+        ) 2>&1 | ${BFAHOME}/bin/log.sh ${BFANODEDIR}/log &
     ) 9>> $pidfile
 }