     public var wallets: [Wallet] {
         return managers.flatMap { $0.wallets }
     }
-    
+
+    ///
+    /// Initialize System
+    ///
+    /// - Parameters:
+    ///   - listener: The listener for handlng events.
+    ///
+    ///   - account: The account, derived from the `paperKey`, that will be used for all networks.
+    ///
+    ///   - onMainnet: boolean to indicate if this is for mainnet or for testnet.  As blockchains
+    ///       are announced, we'll filter them to be for mainent or testnet.
+    ///
+    ///   - path: The path to use for persistent storage of data, such as for BTC and ETH blocks,
+    ///       peers, transaction and logs.
+    ///
+    ///   - query: The query for BlockchiainDB interaction.
+    ///
+    ///   - listenerQueue: The queue to use when performing listen event handler callbacks.  If a
+    ///       queue is not specficied (default to `nil`), then one will be provided.
+    ///
     public init (listener: SystemListener,
                  account: Account,
                  onMainnet: Bool,
                  path: String,
-                 query: BlockChainDB) {
+                 query: BlockChainDB,
+                 listenerQueue: DispatchQueue? = nil) {
         self.listener  = listener
         self.account   = account
         self.onMainnet = onMainnet
         self.path  = path
         self.query = query
         self.callbackCoordinator = SystemCallbackCoordinator()
+        self.listenerQueue = listenerQueue ?? DispatchQueue (label: "Crypto System Listener")
 
         let _ = System.systemExtend(with: self)
-        listener.handleSystemEvent (system: self, event: SystemEvent.created)
+        announceEvent(SystemEvent.created)
     }
 
     internal func announceEvent (_ event: SystemEvent) {
-        listener?.handleSystemEvent (system: self,
-                                     event: event)
+        self.listenerQueue.async {
+            self.listener?.handleSystemEvent (system: self,
+                                              event: event)
+        }
     }
 
     ///

                    }
                default: precondition (false)
                }
        },

            transferEventCallback: { (context, cwm, wid, tid, event) in

                        self.networks.append (network)

                        // Invoke callbacks.
                        self.listenerQueue.async {
                            self.listener?.handleNetworkEvent (system: self, network: network, event: NetworkEvent.created)
                            self.listener?.handleSystemEvent  (system: self, event: SystemEvent.networkAdded(network: network))
                        }
                    }
            }
        }
