diff --git a/controller/EmbeddedNetworkController.cpp b/controller/EmbeddedNetworkController.cpp
index a83894644..9cb971a58 100644
--- a/controller/EmbeddedNetworkController.cpp
+++ b/controller/EmbeddedNetworkController.cpp
@@ -918,6 +918,7 @@ void EmbeddedNetworkController::configureHTTPControlPlane(
 
 		auto meta = json::object();
 		auto data = json::array();
+		uint64_t networkCount = 0;
 
 		for(std::set<uint64_t>::const_iterator nwid(networkIds.begin()); nwid != networkIds.end(); ++nwid) {
 			json network;
@@ -927,23 +928,26 @@ void EmbeddedNetworkController::configureHTTPControlPlane(
 
 			std::vector<json> memTmp;
 			if (_db.get(*nwid, network, memTmp)) {
-				uint64_t authorizedCount = 0;
-				uint64_t totalCount = memTmp.size();
+				if (!network.is_null()) {
+					uint64_t authorizedCount = 0;
+					uint64_t totalCount = memTmp.size();
+					networkCount++;
 
-				for (auto m = memTmp.begin(); m != memTmp.end(); ++m) {
-					bool a = OSUtils::jsonBool((*m)["authorized"], 0);
-					if (a) { authorizedCount++; }
+					for (auto m = memTmp.begin(); m != memTmp.end(); ++m) {
+						bool a = OSUtils::jsonBool((*m)["authorized"], 0);
+						if (a) { authorizedCount++; }
+					}
+
+					auto nwMeta = json::object();
+					nwMeta["totalMemberCount"] = totalCount;
+					nwMeta["authorizedMemberCount"] = authorizedCount;
+					network["meta"] = nwMeta;
+
+					data.push_back(network);
 				}
-
-				auto nwMeta = json::object();
-				nwMeta["totalMemberCount"] = totalCount;
-				nwMeta["authorizedMemberCount"] = authorizedCount;
-				network["meta"] = nwMeta;
 			}
-
-			data.push_back(network);
 		}
-		meta["networkCount"] = networkIds.size();
+		meta["networkCount"] = networkCount;
 
 		auto out = json::object();
 		out["data"] = data;
@@ -1090,26 +1094,26 @@ void EmbeddedNetworkController::configureHTTPControlPlane(
 
 		auto out = nlohmann::json::object();
 		auto meta = nlohmann::json::object();
-		auto members = nlohmann::json::array();
 		std::vector<json> memTmp;
 		if (_db.get(nwid, network, memTmp)) {
-			members.push_back(memTmp);
+			uint64_t authorizedCount = 0;
+			uint64_t totalCount = memTmp.size();
+			for (auto m = memTmp.begin(); m != memTmp.end(); ++m) {
+				bool a = OSUtils::jsonBool((*m)["authorized"], 0);
+				if (a) { authorizedCount++; }
+			}
+
+			meta["totalCount"] = totalCount;
+			meta["authorizedCount"] = authorizedCount;
+
+			out["data"] = memTmp;
+			out["meta"] = meta;
+
+			setContent(req, res, out.dump());
+		} else {
+			res.status = 404;
+			return;
 		}
-
-		uint64_t authorizedCount = 0;
-		uint64_t totalCount = memTmp.size();
-		for (auto m = memTmp.begin(); m != memTmp.end(); ++m) {
-			bool a = OSUtils::jsonBool((*m)["authorized"], 0);
-			if (a) { authorizedCount++; }
-		}
-
-		meta["totalCount"] = totalCount;
-		meta["authorizedCount"] = authorizedCount;
-
-		out["data"] = members;
-		out["meta"] = meta;
-
-		setContent(req, res, out.dump());
 	};
 	s.Get(memberListPath2, memberListGet2);
 	sv6.Get(memberListPath2, memberListGet2);
diff --git a/node/Network.cpp b/node/Network.cpp
index e13b32d53..1f49c651c 100644
--- a/node/Network.cpp
+++ b/node/Network.cpp
@@ -114,14 +114,14 @@ static _doZtFilterResult _doZtFilter(
 	// uncomment for easier debugging fprintf
 	// if (!ztDest) { return DOZTFILTER_ACCEPT; }
 #ifdef ZT_TRACE
-	char buf[40], buf2[40];
-	fprintf(stderr, "\nsrc %s dest %s inbound: %d ethertype %u", ztSource.toString(buf), ztDest.toString(buf2), inbound, etherType);
+	//char buf[40], buf2[40];
+	//fprintf(stderr, "\nsrc %s dest %s inbound: %d ethertype %u", ztSource.toString(buf), ztDest.toString(buf2), inbound, etherType);
 #endif
 
 	for(unsigned int rn=0;rn<ruleCount;++rn) {
 		const ZT_VirtualNetworkRuleType rt = (ZT_VirtualNetworkRuleType)(rules[rn].t & 0x3f);
 #ifdef ZT_TRACE
-		fprintf(stderr, "\n%02u %02d", rn, rt);
+		//fprintf(stderr, "\n%02u %02d", rn, rt);
 #endif
 
 		// First check if this is an ACTION
@@ -135,19 +135,19 @@ static _doZtFilterResult _doZtFilter(
 					case ZT_NETWORK_RULE_ACTION_DROP: {
 						if (!!skipDrop) {
 #ifdef ZT_TRACE
-							fprintf(stderr, "\tskip Drop");
+							//fprintf(stderr, "\tskip Drop");
 #endif
 							skipDrop = 0; continue;
 						}
 #ifdef ZT_TRACE
-						fprintf(stderr, "\tDrop\n");
+						//fprintf(stderr, "\tDrop\n");
 #endif
 						return DOZTFILTER_DROP;
 					}
 
 					case ZT_NETWORK_RULE_ACTION_ACCEPT: {
 #ifdef ZT_TRACE
-						fprintf(stderr, "\tAccept\n");
+						//fprintf(stderr, "\tAccept\n");
 #endif
 						return (superAccept ? DOZTFILTER_SUPER_ACCEPT : DOZTFILTER_ACCEPT); // match, accept packet
 					}
@@ -473,12 +473,12 @@ static _doZtFilterResult _doZtFilter(
 				if ((localTag != &(nconf.tags[nconf.tagCount]))&&(localTag->id() == rules[rn].v.tag.id)) {
 					const Tag *const remoteTag = ((membership) ? membership->getTag(nconf,rules[rn].v.tag.id) : (const Tag *)0);
 #ifdef ZT_TRACE
-					fprintf(stderr, "\tlocal tag [%u: %u] remote tag [%u: %u] match [%u]",
+					/*fprintf(stderr, "\tlocal tag [%u: %u] remote tag [%u: %u] match [%u]",
 							!!localTag ? localTag->id() : 0,
 							!!localTag ? localTag->value() : 0,
 							!!remoteTag ? remoteTag->id() : 0,
 							!!remoteTag ? remoteTag->value() : 0,
-							thisRuleMatches);
+							thisRuleMatches);*/
 #endif
 					if (remoteTag) {
 						const uint32_t ltv = localTag->value();
@@ -501,7 +501,7 @@ static _doZtFilterResult _doZtFilter(
 						if ((inbound)&&(!superAccept)) {
 							thisRuleMatches = hardNo;
 #ifdef ZT_TRACE
-							fprintf(stderr, "\tinbound ");
+							//fprintf(stderr, "\tinbound ");
 #endif
 						} else {
 							// Outbound side is not strict since if we have to match both tags and
@@ -512,7 +512,7 @@ static _doZtFilterResult _doZtFilter(
 							skipDrop = 1;
 							thisRuleMatches = hardYes;
 #ifdef ZT_TRACE
-							fprintf(stderr, "\toutbound ");
+							//fprintf(stderr, "\toutbound ");
 #endif
 						}
 					}
@@ -524,13 +524,13 @@ static _doZtFilterResult _doZtFilter(
 			case ZT_NETWORK_RULE_MATCH_TAG_RECEIVER: {
 					const Tag *const localTag = std::lower_bound(&(nconf.tags[0]),&(nconf.tags[nconf.tagCount]),rules[rn].v.tag.id,Tag::IdComparePredicate());
 #ifdef ZT_TRACE
-					const Tag *const remoteTag = ((membership) ? membership->getTag(nconf,rules[rn].v.tag.id) : (const Tag *)0);
+					/*const Tag *const remoteTag = ((membership) ? membership->getTag(nconf,rules[rn].v.tag.id) : (const Tag *)0);
 					fprintf(stderr, "\tlocal tag [%u: %u] remote tag [%u: %u] match [%u]",
 							!!localTag ? localTag->id() : 0,
 							!!localTag ? localTag->value() : 0,
 							!!remoteTag ? remoteTag->id() : 0,
 							!!remoteTag ? remoteTag->value() : 0,
-							thisRuleMatches);
+							thisRuleMatches);*/
 #endif
 				if (superAccept) {
 					skipDrop = 1;