diff --git a/bitcoin/psbt.c b/bitcoin/psbt.c
index 015a0eb42739..04906276577f 100644
--- a/bitcoin/psbt.c
+++ b/bitcoin/psbt.c
@@ -821,7 +821,7 @@ void psbt_txid(const tal_t *ctx,
 		wally_tx_free(tx);
 }
 
-struct amount_sat psbt_compute_fee(struct wally_psbt *psbt)
+struct amount_sat psbt_compute_fee(const struct wally_psbt *psbt)
 {
 	struct amount_sat fee, input_amt;
 	struct amount_asset asset;
diff --git a/bitcoin/psbt.h b/bitcoin/psbt.h
index 18b29862a85e..e1fa9b4068e8 100644
--- a/bitcoin/psbt.h
+++ b/bitcoin/psbt.h
@@ -249,7 +249,7 @@ struct amount_sat psbt_output_get_amount(const struct wally_psbt *psbt,
  *
  * @psbt -psbt
  */
-struct amount_sat psbt_compute_fee(struct wally_psbt *psbt);
+struct amount_sat psbt_compute_fee(const struct wally_psbt *psbt);
 
 /* psbt_has_input - Is this input present on this psbt
  *
diff --git a/bitcoin/tx.c b/bitcoin/tx.c
index 6be607b74d18..f6fb836de084 100644
--- a/bitcoin/tx.c
+++ b/bitcoin/tx.c
@@ -443,14 +443,19 @@ u8 *linearize_wtx(const tal_t *ctx, const struct wally_tx *wtx)
 	return arr;
 }
 
-size_t bitcoin_tx_weight(const struct bitcoin_tx *tx)
+size_t wally_tx_weight(const struct wally_tx *wtx)
 {
 	size_t weight;
-	int ret = wally_tx_get_weight(tx->wtx, &weight);
+	int ret = wally_tx_get_weight(wtx, &weight);
 	assert(ret == WALLY_OK);
 	return weight;
 }
 
+size_t bitcoin_tx_weight(const struct bitcoin_tx *tx)
+{
+	return wally_tx_weight(tx->wtx);
+}
+
 void wally_txid(const struct wally_tx *wtx, struct bitcoin_txid *txid)
 {
 	u8 *arr;
diff --git a/bitcoin/tx.h b/bitcoin/tx.h
index 40d7f6969412..3ebac3f4ae17 100644
--- a/bitcoin/tx.h
+++ b/bitcoin/tx.h
@@ -59,6 +59,7 @@ u8 *linearize_wtx(const tal_t *ctx, const struct wally_tx *wtx);
 
 /* Get weight of tx in Sipa. */
 size_t bitcoin_tx_weight(const struct bitcoin_tx *tx);
+size_t wally_tx_weight(const struct wally_tx *wtx);
 
 /* Allocate a tx: you just need to fill in inputs and outputs (they're
  * zeroed with inputs' sequence_number set to FFFFFFFF) */
diff --git a/channeld/channeld.c b/channeld/channeld.c
index 7b7849ec7b10..e6065f93b086 100644
--- a/channeld/channeld.c
+++ b/channeld/channeld.c
@@ -1875,7 +1875,6 @@ static void peer_in(struct peer *peer, const u8 *msg)
 		return;
 	case WIRE_INIT_RBF:
 	case WIRE_ACK_RBF:
-	case WIRE_BLACKLIST_PODLE:
 #endif
 		break;
 
diff --git a/common/channel_id.c b/common/channel_id.c
index 74e55b291243..504cb3033e69 100644
--- a/common/channel_id.c
+++ b/common/channel_id.c
@@ -18,7 +18,7 @@ void derive_channel_id_v2(struct channel_id *channel_id,
 			  const struct pubkey *basepoint_1,
 			  const struct pubkey *basepoint_2)
 {
-	/* BOLT-df8bb5994d99e4c78053f7cb57694795f8393dc5 #2:
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
 	 * `channel_id`, v2
 	 *  For channels established using the v2 protocol, the
 	 *  `channel_id` is the
@@ -47,6 +47,24 @@ void derive_channel_id_v2(struct channel_id *channel_id,
 	memcpy(channel_id, &sha, sizeof(*channel_id));
 }
 
+void derive_tmp_channel_id(struct channel_id *channel_id,
+			   const struct pubkey *opener_basepoint)
+{
+	struct sha256 sha;
+
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+	 * If the peer's revocation basepoint is unknown
+	 * (e.g. `open_channel2`), a temporary `channel_id` should be
+	 * found by using a zeroed out basepoint for the unknown peer.
+	 */
+	u8 der_keys[PUBKEY_CMPR_LEN * 2];
+	memset(der_keys, 0, PUBKEY_CMPR_LEN);
+	pubkey_to_der(der_keys + PUBKEY_CMPR_LEN, opener_basepoint);
+	sha256(&sha, der_keys, sizeof(der_keys));
+	BUILD_ASSERT(sizeof(*channel_id) == sizeof(sha));
+	memcpy(channel_id, &sha, sizeof(*channel_id));
+}
+
 /* BOLT #2:
  *
  * The sending node:
diff --git a/common/channel_id.h b/common/channel_id.h
index 78e1109bd5d5..9a3aa13e0495 100644
--- a/common/channel_id.h
+++ b/common/channel_id.h
@@ -20,14 +20,22 @@ struct channel_id {
 /* Define channel_id_eq (no padding) */
 STRUCTEQ_DEF(channel_id, 0, id);
 
+/* For v1 channel establishment */
 void derive_channel_id(struct channel_id *channel_id,
 		       const struct bitcoin_txid *txid, u16 txout);
 
+/* For v1 channel establishment */
+void temporary_channel_id(struct channel_id *channel_id);
+
+/* For v2 channel establishment */
 void derive_channel_id_v2(struct channel_id *channel_id,
 			  const struct pubkey *basepoint_1,
 			  const struct pubkey *basepoint_2);
 
-void temporary_channel_id(struct channel_id *channel_id);
+/* For v2 channel establishment */
+void derive_tmp_channel_id(struct channel_id *channel_id,
+			   const struct pubkey *opener_basepoint);
+
 /* Marshalling/unmarshalling functions */
 void towire_channel_id(u8 **pptr, const struct channel_id *channel_id);
 void fromwire_channel_id(const u8 **cursor, size_t *max,
diff --git a/common/psbt_internal.c b/common/psbt_internal.c
index 9fcd4aed5580..1686775f8c3f 100644
--- a/common/psbt_internal.c
+++ b/common/psbt_internal.c
@@ -67,8 +67,8 @@ psbt_to_witness_stacks(const tal_t *ctx,
 			/* FIXME: throw an error ? */
 			return NULL;
 
-		/* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2:
-		 * - if is the `initiator`:
+		/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+		 * - if is the *initiator*:
 		 *   - MUST send even `serial_id`s
 		 */
 		if (serial_id % 2 == side_to_stack) {
diff --git a/gossipd/gossipd.c b/gossipd/gossipd.c
index 982d55a2f9e1..8b21f167375c 100644
--- a/gossipd/gossipd.c
+++ b/gossipd/gossipd.c
@@ -768,7 +768,6 @@ static struct io_plan *peer_msg_in(struct io_conn *conn,
 	case WIRE_ACCEPT_CHANNEL2:
 	case WIRE_INIT_RBF:
 	case WIRE_ACK_RBF:
-	case WIRE_BLACKLIST_PODLE:
 #endif
 		status_broken("peer %s: relayed unexpected msg of type %s",
 			      type_to_string(tmpctx, struct node_id, &peer->id),
diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c
index 385720365c2d..e06c4e819f95 100644
--- a/lightningd/dual_open_control.c
+++ b/lightningd/dual_open_control.c
@@ -232,9 +232,7 @@ struct openchannel2_payload {
 	struct amount_sat dust_limit_satoshis;
 	struct amount_msat max_htlc_value_in_flight_msat;
 	struct amount_msat htlc_minimum_msat;
-	u32 funding_feerate_max;
-	u32 funding_feerate_min;
-	u32 funding_feerate_best;
+	u32 funding_feerate_per_kw;
 	u32 feerate_our_max;
 	u32 feerate_our_min;
 	u32 commitment_feerate_per_kw;
@@ -243,10 +241,8 @@ struct openchannel2_payload {
 	u8 channel_flags;
 	u32 locktime;
 	u8 *shutdown_scriptpubkey;
-	/* FIXME: include the podle? */
 
 	struct amount_sat accepter_funding;
-	u32 funding_feerate_per_kw;
 	struct wally_psbt *psbt;
 	const u8 *our_shutdown_scriptpubkey;
 	char *err_msg;
@@ -267,18 +263,14 @@ openchannel2_hook_serialize(struct openchannel2_payload *payload,
 				  payload->max_htlc_value_in_flight_msat);
 	json_add_amount_msat_only(stream, "htlc_minimum_msat",
 				  payload->htlc_minimum_msat);
-	json_add_num(stream, "funding_feerate_max",
-		     payload->funding_feerate_max);
-	json_add_num(stream, "funding_feerate_min",
-		     payload->funding_feerate_min);
-	json_add_num(stream, "funding_feerate_best",
-		     payload->funding_feerate_best);
+	json_add_num(stream, "funding_feerate_per_kw",
+		     payload->funding_feerate_per_kw);
+	json_add_num(stream, "commitment_feerate_per_kw",
+		     payload->commitment_feerate_per_kw);
 	json_add_num(stream, "feerate_our_max",
 		     payload->feerate_our_max);
 	json_add_num(stream, "feerate_our_min",
 		     payload->feerate_our_min);
-	json_add_num(stream, "commitment_feerate_per_kw",
-		     payload->commitment_feerate_per_kw);
 	json_add_num(stream, "to_self_delay", payload->to_self_delay);
 	json_add_num(stream, "max_accepted_htlcs", payload->max_accepted_htlcs);
 	json_add_num(stream, "channel_flags", payload->channel_flags);
@@ -286,7 +278,6 @@ openchannel2_hook_serialize(struct openchannel2_payload *payload,
 	if (tal_bytelen(payload->shutdown_scriptpubkey) != 0)
 		json_add_hex_talarr(stream, "shutdown_scriptpubkey",
 				    payload->shutdown_scriptpubkey);
-	/* FIXME: include the podle? */
 	json_object_end(stream);
 }
 
@@ -691,38 +682,11 @@ openchannel2_hook_cb(struct openchannel2_payload *payload STEALS)
 		return subd_send_msg(dualopend, take(msg));
 	}
 
-	/* If there's no plugin, the funding_feerate_per_kw will be zero.
-	 * In this case, we set the funding_feerate_per_kw to the default,
-	 * the 'best' */
-	if (payload->funding_feerate_per_kw == 0) {
-		u32 best_feerate
-			= payload->funding_feerate_per_kw
-			= payload->funding_feerate_best;
-
-		/* We use the old checks here now, against the base feerate */
-		if (best_feerate < payload->feerate_our_min) {
-			msg = towire_dualopend_fail(NULL, tal_fmt(tmpctx,
-						    "feerate_per_kw %u below"
-						    " minimum %u",
-						    best_feerate,
-						    payload->feerate_our_min));
-			return subd_send_msg(dualopend, take(msg));
-		}
-		if (best_feerate > payload->feerate_our_max) {
-			msg = towire_dualopend_fail(NULL, tal_fmt(tmpctx,
-						    "feerate_per_kw %u above"
-						    " maximum %u",
-						    best_feerate,
-						    payload->feerate_our_max));
-			return subd_send_msg(dualopend, take(msg));
-		}
-	}
-
 	channel->cid = payload->channel_id;
 	channel->opener = REMOTE;
 	channel->open_attempt = new_channel_open_attempt(channel);
-	msg = towire_dualopend_got_offer_reply(NULL, payload->accepter_funding,
-					       payload->funding_feerate_per_kw,
+	msg = towire_dualopend_got_offer_reply(NULL,
+					       payload->accepter_funding,
 					       payload->psbt,
 					       payload->our_shutdown_scriptpubkey);
 
@@ -809,26 +773,6 @@ openchannel2_hook_deserialize(struct openchannel2_payload *payload,
 				 &payload->accepter_funding))
 		fatal("Plugin failed to supply accepter_funding_msat field");
 
-	const jsmntok_t *t = json_get_member(buffer, toks, "funding_feerate");
-	/* If they don't return a feerate, we use the best */
-	if (!t)
-		payload->funding_feerate_per_kw = payload->funding_feerate_best;
-	else {
-		if (!json_to_number(buffer, t,
-				    &payload->funding_feerate_per_kw))
-			fatal("Unable to parse 'funding-feerate'");
-		if (payload->funding_feerate_per_kw
-				< payload->funding_feerate_min
-		    || payload->funding_feerate_per_kw
-				> payload->funding_feerate_max)
-			/* FIXME: return an error instead of failing? */
-			fatal("Plugin supplied invalid funding feerate %d."
-			      " Outside valid range %d - %d",
-			      payload->funding_feerate_per_kw,
-			      payload->funding_feerate_min,
-			      payload->funding_feerate_max);
-	}
-
 	if (!payload->psbt &&
 		!amount_sat_eq(payload->accepter_funding, AMOUNT_SAT(0))) {
 		/* Gotta give a PSBT if you set the accepter_funding amount */
@@ -1038,13 +982,30 @@ REGISTER_PLUGIN_HOOK(rbf_channel,
 		     rbf_channel_hook_serialize,
 		     struct rbf_channel_payload *);
 
+static bool feerate_satisfied(struct wally_psbt *psbt,
+			      u32 funding_feerate)
+{
+	struct wally_tx *wtx;
+	size_t tx_weight;
+	struct amount_sat fee_paid, expected_fee;
+
+	wtx = psbt_final_tx(NULL, psbt);
+	tx_weight = wally_tx_weight(wtx);
+	tal_free(wtx);
+
+	fee_paid = psbt_compute_fee(psbt);
+	expected_fee = amount_tx_fee(funding_feerate, tx_weight);
+
+	return amount_sat_greater_eq(fee_paid, expected_fee);
+}
+
 static struct amount_sat calculate_reserve(struct channel_config *their_config,
 					   struct amount_sat funding_total,
 					   enum side opener)
 {
 	struct amount_sat reserve, dust_limit;
 
-	/* BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2
 	 *
 	 * The channel reserve is fixed at 1% of the total channel balance
 	 * rounded down (sum of `funding_satoshis` from `open_channel2`
@@ -1475,6 +1436,24 @@ static void handle_peer_tx_sigs_sent(struct subd *dualopend,
 					      &channel->funding,
 					      &channel->funding_txid,
 					      &channel->remote_funding_locked);
+
+		/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2
+		 * The receiving node:  ...
+		 * - MUST fail the channel if:
+		 *   - the `witness_stack` weight lowers the
+		 *   effective `feerate` below the agreed upon
+		 *   transaction `feerate`
+		 */
+		if (!feerate_satisfied(inflight->funding_psbt,
+				       inflight->funding->feerate))
+			channel_fail_permanent(channel,
+					       REASON_PROTOCOL,
+					       "Agreed feerate %dperkw not"
+					       " met with witnesses %s",
+					       inflight->funding->feerate,
+					       type_to_string(tmpctx,
+							      struct wally_psbt,
+							      inflight->funding_psbt));
 	}
 }
 
@@ -1679,9 +1658,7 @@ static void accepter_got_offer(struct subd *dualopend,
 					  &payload->dust_limit_satoshis,
 					  &payload->max_htlc_value_in_flight_msat,
 					  &payload->htlc_minimum_msat,
-					  &payload->funding_feerate_max,
-					  &payload->funding_feerate_min,
-					  &payload->funding_feerate_best,
+					  &payload->funding_feerate_per_kw,
 					  &payload->commitment_feerate_per_kw,
 					  &payload->to_self_delay,
 					  &payload->max_accepted_htlcs,
@@ -1697,13 +1674,10 @@ static void accepter_got_offer(struct subd *dualopend,
 	 * min + max feerates. Ideally, the plugin will fail to
 	 * contribute funds if the peer's feerate range is outside of
 	 * this acceptable range, but we delegate that decision to
-	 * the plugin's logic */
+	 * the plugin */
 	payload->feerate_our_min = feerate_min(dualopend->ld, NULL);
 	payload->feerate_our_max = feerate_max(dualopend->ld, NULL);
 
-	/* Set the inital to feerate to zero, in case there is no plugin */
-	payload->funding_feerate_per_kw = 0;
-
 	tal_add_destructor2(dualopend, openchannel2_remove_dualopend, payload);
 	plugin_hook_call_openchannel2(dualopend->ld, payload);
 }
@@ -1777,6 +1751,24 @@ static void handle_peer_tx_sigs_msg(struct subd *dualopend,
 					      &channel->funding,
 					      &channel->funding_txid,
 					      &channel->remote_funding_locked);
+
+		/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2
+		 * The receiving node:  ...
+		 * - MUST fail the channel if:
+		 *   - the `witness_stack` weight lowers the
+		 *   effective `feerate` below the agreed upon
+		 *   transaction `feerate`
+		 */
+		if (!feerate_satisfied(inflight->funding_psbt,
+				       inflight->funding->feerate))
+			channel_fail_permanent(channel,
+					       REASON_PROTOCOL,
+					       "Agreed feerate %dperkw not"
+					       " met with witnesses %s",
+					       inflight->funding->feerate,
+					       type_to_string(tmpctx,
+							      struct wally_psbt,
+							      inflight->funding_psbt));
 	}
 
 	/* Send notification with peer's signed PSBT */
@@ -1804,9 +1796,12 @@ static void handle_validate_rbf(struct subd *dualopend,
 	inputs_present = tal_arr(tmpctx, bool, candidate_psbt->num_inputs);
 	memset(inputs_present, true, tal_bytelen(inputs_present));
 
-	/* Iterate through all previous inflights, confirm
-	 * that at least one input is in all proposed RBFs, including
-	 * this one. */
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+	 * The receiving node: ...
+	 *    - MUST fail the negotiation if: ...
+	 *    - the transaction does not share a common input with
+	 *    all previous funding transactions
+	 */
 	list_for_each(&channel->inflights, inflight, list) {
 		/* Remove every non-matching input from set */
 		for (size_t i = 0; i < candidate_psbt->num_inputs; i++) {
@@ -1851,13 +1846,12 @@ static void handle_validate_rbf(struct subd *dualopend,
 	assert(inflight);
 	last_fee = psbt_compute_fee(inflight->funding_psbt);
 
-	/* BOLT-8edf819f1de3b110653f0b21594a04cfd03d5240 #2:
-	 *
-	 * The receiving node:
-	 * - if this is an RBF attempt:
-	 *  - MUST fail the RBF attempt if:
-	 *    - the completed transaction's total fees paid
-	 *      is less than the last successful funding transaction's fees.
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+	 * The receiving node: ...
+	 * - if is an RBF attempt:
+	 *   - MUST fail the negotiation if:
+	 *   - the transaction's total fees is less than the last
+	 *   successfully negotiated transaction's fees
 	 */
 	if (!amount_sat_greater(candidate_fee, last_fee)) {
 		char *errmsg = tal_fmt(tmpctx, "Proposed funding tx fee (%s)"
@@ -2723,8 +2717,6 @@ static void start_fresh_dualopend(struct peer *peer,
 				    pps, &channel->local_basepoints,
 				    &channel->local_funding_pubkey,
 				    channel->minimum_depth,
-				    feerate_min(peer->ld, NULL),
-				    feerate_max(peer->ld, NULL),
 				    send_msg);
 	subd_send_msg(channel->owner, take(msg));
 
@@ -2796,8 +2788,6 @@ void peer_restart_dualopend(struct peer *peer,
 				      &channel->local_funding_pubkey,
 				      &channel->channel_info.remote_fundingkey,
 				      channel->minimum_depth,
-				      feerate_min(peer->ld, NULL),
-				      feerate_max(peer->ld, NULL),
 				      &inflight->funding->txid,
 				      inflight->funding->outnum,
 				      first_inflight->funding->feerate,
diff --git a/openingd/dualopend.c b/openingd/dualopend.c
index 18ea4598e8d2..8bbe344bb6f4 100644
--- a/openingd/dualopend.c
+++ b/openingd/dualopend.c
@@ -73,11 +73,22 @@ enum tx_msgs {
 };
 
 /*
- * BOLT-544bda7144d91b3f51856189b8932610649f9e93 #2:
-  - MUST NOT send more than 2^12 ... messages
+ * BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+ * The maximum inputs and outputs are capped at 252. This effectively fixes
+ * the byte size of the input and output counts on the transaction to one (1).
  */
 #define MAX_TX_MSG_RCVD (1 << 12)
 
+/*
+ * BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+ * The receiving node: ...
+ * - MUST fail the negotiation if: ...
+ *  - there are more than 252 inputs
+ *  - there are more than 252 outputs
+ */
+#define MAX_FUNDING_INPUTS 252
+#define MAX_FUNDING_OUTPUTS 252
+
 /* State for a 'new' funding transaction. There should be one
  * for every new funding transaction attempt */
 struct tx_state {
@@ -131,7 +142,6 @@ struct state {
 
 	/* Constraints on a channel they open. */
 	u32 minimum_depth;
-	u32 min_feerate, max_feerate;
 	struct amount_msat min_effective_htlc_capacity;
 
 	/* Limits on what remote config we accept. */
@@ -153,7 +163,6 @@ struct state {
 	struct channel_id channel_id;
 	u8 channel_flags;
 
-	struct sha256 opening_podle_h2;
 	enum tx_role our_role;
 
 	u32 feerate_per_kw_funding;
@@ -220,8 +229,7 @@ static u8 *psbt_changeset_get_next(const tal_t *ctx,
 		msg = towire_tx_add_input(ctx, cid, serial_id,
 					  prevtx, in->tx_input.index,
 					  in->tx_input.sequence,
-					  script,
-					  NULL);
+					  script);
 
 		tal_arr_remove(&set->added_ins, 0);
 		return msg;
@@ -432,18 +440,26 @@ static void check_channel_id(struct state *state,
 					     id_in));
 }
 
+static bool is_dust(struct tx_state *tx_state,
+		    struct amount_sat amount)
+{
+	return !amount_sat_greater(amount, tx_state->localconf.dust_limit)
+		|| !amount_sat_greater(amount, tx_state->remoteconf.dust_limit);
+}
+
 static void set_reserve(struct tx_state *tx_state,
 			struct amount_sat funding_total,
 			enum tx_role our_role)
 {
 	struct amount_sat reserve, dust_limit;
 
-	/* BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
 	 *
-	 * The channel reserve is fixed at 1% of the total channel balance
-	 * rounded down (sum of `funding_satoshis` from `open_channel2`
-	 * and `accept_channel2`) or the `dust_limit_satoshis` from
-	 * `open_channel2`, whichever is greater.
+	 * Instead, the channel reserve is fixed at 1% of the total
+	 * channel balance (`open_channel2`.`funding_satoshis` +
+	 * `accept_channel2`.`funding_satoshis`) rounded down to the
+	 * nearest whole satoshi or the `dust_limit_satoshis`, whichever is
+	 * greater.
 	 */
 	reserve = amount_sat_div(funding_total, 100);
 	dust_limit = our_role == TX_INITIATOR ?
@@ -461,14 +477,12 @@ static void set_reserve(struct tx_state *tx_state,
 
 static bool is_openers(const struct wally_map *unknowns)
 {
-	/* BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2
-	 * The sending node:
-	 * ...
-	 *   - if is the `initiator`:
-	 *     - MUST send even `serial_id`s
-	 *   - if is the `contributor`:
-	 *   ...
-	 *     - MUST send odd `serial_id`s
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+	 * The sending node: ...
+	 * - if is the *initiator*:
+	 *   - MUST send even `serial_id`s
+	 * - if is the *non-initiator*:
+	 *   - MUST send odd `serial_id`s
 	 */
 	u64 serial_id;
 	if (!psbt_get_serial_id(unknowns, &serial_id))
@@ -489,7 +503,8 @@ static size_t psbt_input_weight(struct wally_psbt *psbt,
 		(psbt->inputs[in].redeem_script_len +
 			(varint_t) varint_size(psbt->inputs[in].redeem_script_len)) * 4;
 
-	/* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #3:
+	 *
 	 * The minimum witness weight for an input is 110.
 	 */
 	weight += 110;
@@ -532,15 +547,16 @@ static char *check_balances(const tal_t *ctx,
 	size_t accepter_weight = 0;
 
 
-	/* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2:
-	 * The initiator is responsible for paying the fees
-	 * for the following fields, to be referred to as
-	 * the `common fields`.
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+	 *
+	 * The *initiator* is responsible for paying the fees for the
+	 * following fields, to be referred to as the `common fields`.
 	 *   - version
 	 *   - segwit marker + flag
 	 *   - input count
 	 *   - output count
-	 *   - locktime */
+	 *   - locktime
+	 */
 	size_t initiator_weight =
 		bitcoin_tx_core_weight(psbt->num_inputs,
 				       psbt->num_outputs);
@@ -550,6 +566,29 @@ static char *check_balances(const tal_t *ctx,
 				    &state->our_funding_pubkey,
 				    &state->their_funding_pubkey);
 
+	/*
+	 * BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+	 * The receiving node: ...
+	 * - MUST fail the negotiation if: ...
+	 *  - there are more than 252 inputs
+	 */
+	if (tx_state->psbt->num_inputs > MAX_FUNDING_INPUTS)
+		negotiation_failed(state, "Too many inputs. Have %zu,"
+				   " Max allowed %zu",
+				   tx_state->psbt->num_inputs,
+				   MAX_FUNDING_INPUTS);
+	/*
+	 * BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+	 * The receiving node: ...
+	 * - MUST fail the negotiation if: ...
+	 *  - there are more than 252 outputs
+	 */
+	if (tx_state->psbt->num_outputs > MAX_FUNDING_OUTPUTS)
+		negotiation_failed(state, "Too many inputs. Have %zu,"
+				   " Max allowed %zu",
+				   tx_state->psbt->num_outputs,
+				   MAX_FUNDING_OUTPUTS);
+
 	/* Find funding output, check balance */
 	if (find_txout(psbt,
 		       scriptpubkey_p2wsh(tmpctx, funding_wscript),
@@ -564,12 +603,15 @@ static char *check_balances(const tal_t *ctx,
 			return "overflow adding desired funding";
 		}
 
-		/* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2:
-		 * The receiving node:
-		 *   ...
-		 *   - MUST fail the channel if:
-		 *   	...
-		 *     - the value of the funding output is incorrect
+		/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+		 *
+		 * Upon receipt of consecutive `tx_complete`s, the receiving
+		 * node:
+		 * - if is the *accepter*:
+		 *   - MUST fail the negotiation if: ...
+		 *     - the value of the funding output is not equal to the
+		 *       sum of `open_channel2`.`funding_satoshis`
+		 *       and `accept_channel2`. `funding_satoshis`
 		 */
 		if (!amount_sat_eq(total_funding, output_val)) {
 			return tal_fmt(tmpctx, "total desired funding %s != "
@@ -582,27 +624,25 @@ static char *check_balances(const tal_t *ctx,
 						      &output_val));
 		}
 
-		/* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2:
-		 * The receiving node:
-		 *   ...
-		 *   - MUST fail the channel if:
-		 *   	...
-		 *   	- if the `funding_output` of the resulting
-		 *   	transaction is less than the `dust_limit`
+		/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+		 *
+		 * Upon receipt of consecutive `tx_complete`s, the receiving
+		 * node:
+		 *   - if is the *accepter*:
+		 *     - MUST fail the negotiation if: ...
+		 *     - the value of the funding output is
+		 *       less than the `dust_limit`
 		 */
-		if (!amount_sat_greater(output_val,
-				tx_state->remoteconf.dust_limit) ||
-		    !amount_sat_greater(output_val,
-				tx_state->localconf.dust_limit)) {
+		if (is_dust(tx_state, output_val))
 			return "funding output is dust";
-		}
 	} else {
-		/* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2:
-		 * The receiving node:
-		 *   ...
-		 *   - MUST fail the channel if:
-		 *     - no funding output is received, identified by
-		 *       the `script`
+		/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+		 *
+		 * Upon receipt of consecutive `tx_complete`s, the receiving
+		 * node:
+		 *   - if is the *accepter*:
+		 *     - MUST fail the negotiation if:
+		 *     - no funding output was received
 		 */
 		return "funding output not present";
 	}
@@ -652,17 +692,16 @@ static char *check_balances(const tal_t *ctx,
 			return "overflow adding output total";
 		}
 
-		/* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2:
-		 * The sending node:
-		 *   - MUST specify a `sats` value greater
-		 *     than the dust limit
+		/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+		 * The receiving node:
+		 * ...
+		 * - MUST fail the negotiation if:
+		 *   ...
+		 *   - the `sats` amount is less than or equal to
+		 *     the `dust_limit`
 		 */
-		if (!amount_sat_greater(amt,
-				tx_state->remoteconf.dust_limit) ||
-		    !amount_sat_greater(amt,
-				tx_state->localconf.dust_limit)) {
+		if (is_dust(tx_state, amt))
 			return "output is dust";
-		}
 
 		if (is_openers(&psbt->outputs[i].unknowns)) {
 			/* Don't add the funding output to
@@ -687,25 +726,25 @@ static char *check_balances(const tal_t *ctx,
 		}
 	}
 
-	/* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2:
-	 * The receiving node: ...
-	 * - MUST fail the channel if:
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+	 *  The receiving node:
+	 *  ...
+	 *  - MUST fail the negotiation if:
 	 *   ...
-	 *   - the total satoshis of the inputs is less than
-	 *     the outputs
+	 *   - the peer's total input satoshis is less than their outputs
 	 */
-	if (!amount_sat_greater_eq(tot_input_amt, tot_output_amt)) {
-		return "inputs less than total outputs";
-	}
+	/* We check both, why not? */
+	if (!amount_sat_greater_eq(initiator_inputs, initiator_outs))
+		return "initiator inputs less than outputs";
 
-	/* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2:
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
 	 * The receiving node: ...
-	 * - MUST fail the channel if:
+	 * - MUST fail the negotiation if:
 	 *   ...
-	 *   - the peer's paid feerate does not meet or exceed
-	 *   the agreed `feerate`, (based on the miminum fee).
-	 *   - the `initiator`'s fees do not cover the `common`
-	 *     fields
+	 *   - the peer's paid feerate does not meet or exceed the
+	 *   agreed `feerate`, (based on the `minimum fee`).
+	 *   - if is the *non-initiator*:
+	 *     - the *initiator*'s fees do not cover the `common` fields
 	 */
 	if (!amount_sat_sub(&accepter_diff, accepter_inputs,
 			    accepter_outs)) {
@@ -717,10 +756,13 @@ static char *check_balances(const tal_t *ctx,
 		return "initiator inputs less than outputs";
 	}
 
-	/* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2:
-	 * Each party to the transaction is responsible for
-	 * paying the fees for their input, output,
-	 * and witness at the agreed `feerate`. */
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+	 * The receiving node:  ...
+	 * - MUST fail the negotiation if:
+	 *   ...
+	 *   - the peer's paid feerate does not meet or exceed the
+	 *   agreed `feerate`, (based on the `minimum fee`).
+	 */
 	accepter_fee = amount_tx_fee(feerate_per_kw_funding,
 				     accepter_weight);
 	initiator_fee = amount_tx_fee(feerate_per_kw_funding,
@@ -1202,7 +1244,6 @@ static u8 *opening_negotiate_msg(const tal_t *ctx, struct state *state)
 		case WIRE_TX_REMOVE_OUTPUT:
 		case WIRE_TX_COMPLETE:
 		case WIRE_ACK_RBF:
-		case WIRE_BLACKLIST_PODLE:
 		case WIRE_CHANNEL_ANNOUNCEMENT:
 		case WIRE_CHANNEL_UPDATE:
 		case WIRE_NODE_ANNOUNCEMENT:
@@ -1252,8 +1293,6 @@ static bool run_tx_interactive(struct state *state,
 			struct bitcoin_tx *tx;
 			struct bitcoin_txid txid;
 			struct amount_sat amt;
-			struct tlv_tx_add_input_tlvs *add_tlvs =
-				tlv_tx_add_input_tlvs_new(tmpctx);
 
 			if (!fromwire_tx_add_input(tmpctx, msg, &cid,
 						   &serial_id,
@@ -1261,8 +1300,7 @@ static bool run_tx_interactive(struct state *state,
 							       &tx_bytes),
 						   &outnum, &sequence,
 						   cast_const2(u8 **,
-							       &redeemscript),
-						   add_tlvs))
+							       &redeemscript)))
 				open_err_fatal(state,
 					       "Parsing tx_add_input %s",
 					       tal_hex(tmpctx, msg));
@@ -1270,32 +1308,31 @@ static bool run_tx_interactive(struct state *state,
 			check_channel_id(state, &cid, &state->channel_id);
 
 			/*
-			 * BOLT-544bda7144d91b3f51856189b8932610649f9e93 #2:
-			 * The receiving node:
-			 * - MUST fail the transaction collaboration if:
-			 *   - it receives more than 2^12 `tx_add_input`
-			 *   messages */
+			 * BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+			 * The receiving node: ...
+			 *   - MUST fail the negotiation if: ...
+			 *   - if has received 4096 `tx_add_input`
+			 *   messages during this negotiation
+			 */
 			if (++tx_state->tx_msg_count[TX_ADD_INPUT] > MAX_TX_MSG_RCVD)
 				open_err_warn(state, "Too many `tx_add_input`s"
 					      " received %d", MAX_TX_MSG_RCVD);
 			/*
-			 * BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2:
-			 * - if is the `initiator`:
-			 *   - MUST send even `serial_id`s
-			 * - MUST fail the transaction collaboration if:
-			 *   ...
-			 * - it receives a `serial_id` from the peer
-			 *   with the incorrect parity
+			 * BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+			 * The receiving node: ...
+			 *   - MUST fail the negotiation if: ...
+			 *   - the `serial_id` has the wrong parity
 			 */
 			if (serial_id % 2 == our_role)
 				open_err_warn(state,
 					      "Invalid serial_id rcvd. %"PRIu64,
 					      serial_id);
 			/*
-			 * BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2:
-			 * - MUST fail the transaction collaboration if:
-			 *   ...
-			 *  - it recieves a duplicate `serial_id`
+			 * BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+			 * The receiving node: ...
+			 *   - MUST fail the negotiation if: ...
+			 *   - the `serial_id` is already included in
+			 *   the transaction
 			 */
 			if (psbt_find_serial_input(psbt, serial_id) != -1)
 				open_err_warn(state, "Duplicate serial_id rcvd."
@@ -1312,11 +1349,11 @@ static bool run_tx_interactive(struct state *state,
 					      "Invalid tx outnum sent. %u",
 					      outnum);
 			/*
-			 * BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2:
-			 * - MUST fail the transaction collaboration if:
-			 *   ...
-			 *  - it receives an input that would create a
-			 *    malleable transaction id (e.g. pre-Segwit)
+			 * BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+			 * The receiving node: ...
+			 *   - MUST fail the negotiation if: ...
+			 *   - the `prevtx_out` input of `prevtx` is
+			 *   not an `OP_0` to `OP_16` followed by a single push
 			 */
 			if (!is_segwit_output(&tx->wtx->outputs[outnum],
 					      redeemscript))
@@ -1327,14 +1364,12 @@ static bool run_tx_interactive(struct state *state,
 							     tx));
 
 			/*
-			 * BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2:
-			 *  - MUST NOT re-transmit inputs it has already
-			 *    received from the peer
-			 *  ...
-			 * - MUST fail the transaction collaboration if:
-			 *   ...
-			 *  - it receives a duplicate input to one it
-			 *    sent previously
+			 * BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+			 *   The receiving node: ...
+			 *    - MUST fail the negotiation if:
+			 *    - the `prevtx` and `prevtx_vout` are
+			 *    identical to a previously added (and not
+			 *    removed) input's
 			 */
 			bitcoin_txid(tx, &txid);
 			if (psbt_has_input(psbt, &txid, outnum))
@@ -1347,10 +1382,9 @@ static bool run_tx_interactive(struct state *state,
 					      outnum);
 
 			/*
-			 * BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2:
+			 * BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
 			 * The receiving node:
-			 *  - MUST add all received inputs to the funding
-			 *    transaction
+			 *  - MUST add all received inputs to the transaction
 			 */
 			struct wally_psbt_input *in =
 				psbt_append_input(psbt, &txid, outnum,
@@ -1386,7 +1420,6 @@ static bool run_tx_interactive(struct state *state,
 
 			psbt_input_set_serial_id(psbt, in, serial_id);
 
-			/* FIXME: what's in the tlv? */
 			break;
 		}
 		case WIRE_TX_REMOVE_INPUT: {
@@ -1399,28 +1432,25 @@ static bool run_tx_interactive(struct state *state,
 
 			check_channel_id(state, &cid, &state->channel_id);
 
-			/*
-			 * BOLT-544bda7144d91b3f51856189b8932610649f9e93 #2:
-			 * The receiving node:
-			 * - MUST fail the transaction collaboration if:
-			 *   - it receives more than 2^12 `tx_rm_input`
-			 *   messages */
-			if (++tx_state->tx_msg_count[TX_RM_INPUT] > MAX_TX_MSG_RCVD)
-				open_err_warn(state,
-					      "Too many `tx_rm_input`s"
-					      " received (%d)",
-					      MAX_TX_MSG_RCVD);
-
-			/* BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2
-			 * The sending node:
-			 *   - MUST NOT send a `tx_remove_input` for an
-			 *     input which is not theirs */
+			/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+			 * The receiving node:  ...
+			 *   - MUST fail the negotiation if: ...
+			 *   - the input or output identified by the
+			 *   `serial_id` was not added by the sender
+			 */
 			if (serial_id % 2 == our_role)
 				open_err_warn(state,
 					      "Invalid serial_id rcvd. %"PRIu64,
 					      serial_id);
 
+			/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+			 * The receiving node:  ...
+			 *   - MUST fail the negotiation if: ...
+			 *   - the `serial_id` does not correspond
+			 *     to a currently added input (or output)
+			 */
 			input_index = psbt_find_serial_input(psbt, serial_id);
+			/* We choose to error/fail negotiation */
 			if (input_index == -1)
 				open_err_warn(state,
 					      "No input added with serial_id"
@@ -1443,34 +1473,46 @@ static bool run_tx_interactive(struct state *state,
 			check_channel_id(state, &cid, &state->channel_id);
 
 			/*
-			 * BOLT-544bda7144d91b3f51856189b8932610649f9e93 #2:
-			 * The receiving node:
-			 * - MUST fail the transaction collaboration if:
-			 *   - it receives more than 2^12 `tx_add_output`
-			 *   messages */
+			 * BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+			 * The receiving node: ...
+			 * - MUST fail the negotiation if: ...
+			 *   - it has received 4096 `tx_add_output`
+			 *   messages during this negotiation
+			 */
 			if (++tx_state->tx_msg_count[TX_ADD_OUTPUT] > MAX_TX_MSG_RCVD)
 				open_err_warn(state,
 					      "Too many `tx_add_output`s"
 					      " received (%d)",
 					      MAX_TX_MSG_RCVD);
 
-			/* BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2
-			 * The receiving node:
-			 *  ...
-			 * - MUST fail the transaction collaboration if:
-			 *   ...
-			 *   - it receives a `serial_id` from the peer with the
-			 *      incorrect parity */
+			/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+			 * The receiving node: ...
+			 * - MUST fail the negotiation if: ...
+			 *   - the `serial_id` has the wrong parity
+			 */
 			if (serial_id % 2 == our_role)
 				open_err_warn(state,
 					      "Invalid serial_id rcvd. %"PRIu64,
 					      serial_id);
 
+			/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+			 * The receiving node: ...
+			 * - MUST fail the negotiation if: ...
+			 *   - the `serial_id` is already included
+			 *   in the transaction */
 			if (psbt_find_serial_output(psbt, serial_id) != -1)
 				open_err_warn(state,
 					      "Duplicate serial_id rcvd."
 					      " %"PRIu64, serial_id);
 			amt = amount_sat(value);
+
+			/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+			 * The receiving node: ...
+			 * - MAY fail the negotiation if `script`
+			 *   is non-standard */
+			if (!is_known_scripttype(scriptpubkey))
+				open_err_warn(state, "Script is not standard");
+
 			out = psbt_append_output(psbt, scriptpubkey, amt);
 			psbt_output_set_serial_id(psbt, out, serial_id);
 			break;
@@ -1485,27 +1527,23 @@ static bool run_tx_interactive(struct state *state,
 
 			check_channel_id(state, &cid, &state->channel_id);
 
-			/*
-			 * BOLT-544bda7144d91b3f51856189b8932610649f9e93 #2:
-			 * The receiving node:
-			 * - MUST fail the transaction collaboration if:
-			 *   - it receives more than 2^12 `tx_rm_output`
-			 *   messages */
-			if (++tx_state->tx_msg_count[TX_RM_OUTPUT] > MAX_TX_MSG_RCVD)
-				open_err_warn(state,
-					      "Too many `tx_rm_output`s"
-					      " received (%d)",
-					      MAX_TX_MSG_RCVD);
-
-			/* BOLT-fe0351ca2cea3105c4f2eb18c571afca9d21c85b #2
-			 * The sending node:
-			 *   - MUST NOT send a `tx_remove_ouput` for an
-			 *     input which is not theirs */
+			/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+			 * The receiving node: ...
+			 * - MUST fail the negotiation if: ...
+			 *   - the input or output identified by the
+			 *   `serial_id` was not added by the sender
+			 */
 			if (serial_id % 2 == our_role)
 				open_err_warn(state,
 					      "Invalid serial_id rcvd."
 					      " %"PRIu64, serial_id);
 
+			/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+			 * The receiving node: ...
+			 * - MUST fail the negotiation if: ...
+			 *   - the `serial_id` does not correspond to a
+			 *     currently added input (or output)
+			 */
 			output_index = psbt_find_serial_output(psbt, serial_id);
 			if (output_index == -1)
 				open_err_warn(state, false,
@@ -1548,7 +1586,6 @@ static bool run_tx_interactive(struct state *state,
 		case WIRE_ACCEPT_CHANNEL2:
 		case WIRE_INIT_RBF:
 		case WIRE_ACK_RBF:
-		case WIRE_BLACKLIST_PODLE:
 		case WIRE_CHANNEL_ANNOUNCEMENT:
 		case WIRE_CHANNEL_UPDATE:
 		case WIRE_NODE_ANNOUNCEMENT:
@@ -1843,27 +1880,23 @@ static void accepter_start(struct state *state, const u8 *oc2_msg)
 	struct bitcoin_blkid chain_hash;
 	struct tlv_opening_tlvs *open_tlv;
 	char *err_reason;
-	struct channel_id cid;
+	struct channel_id tmp_chan_id;
 	u8 *msg;
 	struct amount_sat total;
 	enum dualopend_wire msg_type;
-	u32 feerate_min, feerate_max, feerate_best;
 	struct tx_state *tx_state = state->tx_state;
 
 	state->our_role = TX_ACCEPTER;
 	open_tlv = tlv_opening_tlvs_new(tmpctx);
 
 	if (!fromwire_open_channel2(oc2_msg, &chain_hash,
-				    &state->channel_id,
-				    &state->opening_podle_h2,
-				    &feerate_max,
-				    &feerate_min,
-				    &feerate_best,
+				    &state->channel_id, /* Temporary! */
+				    &state->feerate_per_kw_funding,
+				    &state->feerate_per_kw_commitment,
 				    &tx_state->opener_funding,
 				    &tx_state->remoteconf.dust_limit,
 				    &tx_state->remoteconf.max_htlc_value_in_flight,
 				    &tx_state->remoteconf.htlc_minimum,
-				    &state->feerate_per_kw_commitment,
 				    &tx_state->remoteconf.to_self_delay,
 				    &tx_state->remoteconf.max_accepted_htlcs,
 				    &tx_state->tx_locktime,
@@ -1884,6 +1917,30 @@ static void accepter_start(struct state *state, const u8 *oc2_msg)
 	} else
 		state->upfront_shutdown_script[REMOTE] = NULL;
 
+	/* BOLT-* #2
+	 * If the peer's revocation basepoint is unknown (e.g.
+	 * `open_channel2`), a temporary `channel_id` should be found
+	 * by using a zeroed out basepoint for the unknown peer.
+	 */
+	derive_tmp_channel_id(&tmp_chan_id,
+			      &state->their_points.revocation);
+	if (!channel_id_eq(&state->channel_id, &tmp_chan_id))
+		negotiation_failed(state, "open_channel2 channel_id incorrect."
+				   " Expected %s, received %s",
+				   type_to_string(tmpctx, struct channel_id,
+						  &tmp_chan_id),
+				   type_to_string(tmpctx, struct channel_id,
+						  &state->channel_id));
+
+	/* Everything's ok. Let's figure out the actual channel_id now */
+	derive_channel_id_v2(&state->channel_id,
+			     &state->our_points.revocation,
+			     &state->their_points.revocation);
+
+
+	/* Save feerate on the tx_state as well */
+	tx_state->feerate_per_kw_funding = state->feerate_per_kw_funding;
+
 	/* BOLT #2:
 	 *
 	 * The receiving node MUST fail the channel if:
@@ -1916,21 +1973,13 @@ static void accepter_start(struct state *state, const u8 *oc2_msg)
 		return;
 	}
 
-	/* We can figure out the channel id now */
-	derive_channel_id_v2(&cid,
-			     &state->our_points.revocation,
-			     &state->their_points.revocation);
-
-	/* FIXME: pass the podle back also */
 	msg = towire_dualopend_got_offer(NULL,
-					 &cid,
+					 &state->channel_id,
 					 tx_state->opener_funding,
 					 tx_state->remoteconf.dust_limit,
 					 tx_state->remoteconf.max_htlc_value_in_flight,
 					 tx_state->remoteconf.htlc_minimum,
-					 feerate_max,
-					 feerate_min,
-					 feerate_best,
+					 state->feerate_per_kw_funding,
 					 state->feerate_per_kw_commitment,
 					 tx_state->remoteconf.to_self_delay,
 					 tx_state->remoteconf.max_accepted_htlcs,
@@ -1951,7 +2000,6 @@ static void accepter_start(struct state *state, const u8 *oc2_msg)
 
 	if (!fromwire_dualopend_got_offer_reply(state, msg,
 						&tx_state->accepter_funding,
-						&tx_state->feerate_per_kw_funding,
 						&tx_state->psbt,
 						&state->upfront_shutdown_script[LOCAL]))
 		master_badmsg(WIRE_DUALOPEND_GOT_OFFER_REPLY, msg);
@@ -1960,9 +2008,6 @@ static void accepter_start(struct state *state, const u8 *oc2_msg)
 	 * the original feerate we'll base any increases off of. */
 	state->feerate_per_kw_funding = tx_state->feerate_per_kw_funding;
 
-	/* Set the channel id now */
-	state->channel_id = cid;
-
 	if (!tx_state->psbt)
 		tx_state->psbt = create_psbt(tx_state, 0, 0,
 					     tx_state->tx_locktime);
@@ -2033,7 +2078,6 @@ static void accepter_start(struct state *state, const u8 *oc2_msg)
 
 	msg = towire_accept_channel2(tmpctx, &state->channel_id,
 				     tx_state->accepter_funding,
-				     tx_state->feerate_per_kw_funding,
 				     tx_state->localconf.dust_limit,
 				     tx_state->localconf.max_htlc_value_in_flight,
 				     tx_state->localconf.htlc_minimum,
@@ -2333,8 +2377,6 @@ static void opener_start(struct state *state, u8 *msg)
 	struct channel_id cid;
 	char *err_reason;
 	struct amount_sat total;
-	struct sha256 podle;
-	u32 feerate_min, feerate_max, feerate_best;
 	struct tx_state *tx_state = state->tx_state;
 
 	if (!fromwire_dualopend_opener_init(state, msg,
@@ -2342,41 +2384,22 @@ static void opener_start(struct state *state, u8 *msg)
 					    &tx_state->opener_funding,
 					    &state->upfront_shutdown_script[LOCAL],
 					    &state->feerate_per_kw_commitment,
-					    &tx_state->feerate_per_kw_funding,
+					    &state->feerate_per_kw_funding,
 					    &state->channel_flags))
 		master_badmsg(WIRE_DUALOPEND_OPENER_INIT, msg);
 
 	state->our_role = TX_INITIATOR;
 	tx_state->tx_locktime = tx_state->psbt->tx->locktime;
+	tx_state->feerate_per_kw_funding = state->feerate_per_kw_funding;
 	open_tlv = tlv_opening_tlvs_new(tmpctx);
 
-	/* Set the channel_id to a temporary id, we'll update
-	 * this as soon as we hear back from accept, but if they
-	 * send us an error in the meantime, we need to be able to
-	 * understand it */
-	temporary_channel_id(&state->channel_id);
-
-	feerate_min = state->min_feerate;
-	feerate_max = state->max_feerate;
-	if (tx_state->feerate_per_kw_funding > state->max_feerate) {
-		status_info("Selected funding feerate %d is greater than"
-			    " current suggested max %d, adjusing max upwards"
-			    " to match.",
-			    tx_state->feerate_per_kw_funding,
-			    state->max_feerate);
-
-		feerate_max = tx_state->feerate_per_kw_funding;
-	}
-	if (tx_state->feerate_per_kw_funding < state->min_feerate) {
-		status_info("Selected funding feerate %d is less than"
-			    " current suggested min %d, adjusing min downwards"
-			    " to match.",
-			    tx_state->feerate_per_kw_funding,
-			    state->min_feerate);
-
-		feerate_min = tx_state->feerate_per_kw_funding;
-	}
-	feerate_best = tx_state->feerate_per_kw_funding;
+	/* BOLT-* #2
+	 * If the peer's revocation basepoint is unknown (e.g.
+	 * `open_channel2`), a temporary `channel_id` should be found
+	 * by using a zeroed out basepoint for the unknown peer.
+	 */
+	derive_tmp_channel_id(&state->channel_id,
+			      &state->our_points.revocation);
 
 	if (!state->upfront_shutdown_script[LOCAL])
 		state->upfront_shutdown_script[LOCAL]
@@ -2392,20 +2415,15 @@ static void opener_start(struct state *state, u8 *msg)
 			state->upfront_shutdown_script[LOCAL];
 	}
 
-	/* FIXME: actually set the podle */
-	memset(&podle, 0, sizeof(podle));
 	msg = towire_open_channel2(NULL,
 				   &chainparams->genesis_blockhash,
 				   &state->channel_id,
-				   &podle, /* FIXME: podle H2! */
-				   feerate_max,
-				   feerate_min,
-				   feerate_best,
+				   state->feerate_per_kw_funding,
+				   state->feerate_per_kw_commitment,
 				   tx_state->opener_funding,
 				   tx_state->localconf.dust_limit,
 				   tx_state->localconf.max_htlc_value_in_flight,
 				   tx_state->localconf.htlc_minimum,
-				   state->feerate_per_kw_commitment,
 				   tx_state->localconf.to_self_delay,
 				   tx_state->localconf.max_accepted_htlcs,
 				   tx_state->tx_locktime,
@@ -2432,7 +2450,6 @@ static void opener_start(struct state *state, u8 *msg)
 	a_tlv = notleak(tlv_accept_tlvs_new(state));
 	if (!fromwire_accept_channel2(msg, &cid,
 				      &tx_state->accepter_funding,
-				      &tx_state->feerate_per_kw_funding,
 				      &tx_state->remoteconf.dust_limit,
 				      &tx_state->remoteconf.max_htlc_value_in_flight,
 				      &tx_state->remoteconf.htlc_minimum,
@@ -2457,11 +2474,7 @@ static void opener_start(struct state *state, u8 *msg)
 	} else
 		state->upfront_shutdown_script[REMOTE] = NULL;
 
-	/* Copy the feerate per kw into the state struct as well; this is
-	 * the original feerate we'll use to base RBF upgrades on */
-	state->feerate_per_kw_funding = tx_state->feerate_per_kw_funding;
-
-	/* Now we can set the 'real channel id' */
+	/* Now we know the 'real channel id' */
 	derive_channel_id_v2(&state->channel_id,
 			     &state->our_points.revocation,
 			     &state->their_points.revocation);
@@ -2474,20 +2487,6 @@ static void opener_start(struct state *state, u8 *msg)
 					       &state->channel_id),
 				type_to_string(msg, struct channel_id, &cid));
 
-	/* BOLT-5fcbda56901af9e3b1d057cc41d0c5cfa60a2b94 #2:
-	 * The receiving node:
-	 * - if the `feerate_funding` is less than the `feerate_funding_min`
-	 *   or above the `feerate_funding_max`
-	 *   - MUST error.
-	 */
-	if (feerate_min > tx_state->feerate_per_kw_funding
-	    || feerate_max < tx_state->feerate_per_kw_funding)
-		open_err_warn(state, "Invalid feerate %d chosen. Valid min %d,"
-			      " valid max %d",
-			      tx_state->feerate_per_kw_funding,
-			      feerate_min, feerate_max);
-
-
 	/* Check that total funding doesn't overflow */
 	if (!amount_sat_add(&total, tx_state->opener_funding,
 			    tx_state->accepter_funding))
@@ -2516,11 +2515,11 @@ static void opener_start(struct state *state, u8 *msg)
 		return;
 	}
 
-	/* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2:
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
 	 * The sending node:
-	 *  - if is the `opener`:
-	 *   - MUST send at least one `tx_add_output`,  the channel
-	 *     funding output.
+	 * - if is the *opener*:
+	 *   - MUST send at least one `tx_add_output`,  which
+	 *   contains the channel's funding output
 	 */
 	add_funding_output(tx_state, state, total);
 
@@ -2574,12 +2573,18 @@ static bool update_feerate(struct tx_state *tx_state,
 	u32 feerate = feerate_funding;
 
 	/*
-	 * BOLT-487dd4b46aad9b59f7f3480b7bdf15862b52d2f9b #2:
-	 * Each `fee_step` adds 1/4 (rounded down) to the initial
-	 * transaction feerate, i.e. if the initial `feerate_per_kw_funding`
-	 * was 512 satoshis per kiloweight, `fee_step` 1 is
-	 * 512 + 512 / 4 or 640 sat/kw, `fee_step` 2
-	 * is 640 + 640 / 4 or 800 sat/kw.
+	 * BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
+	 *
+	 * `fee_step` is an integer value, which specifies the
+	 * `feerate` for this funding transaction, as a rate of
+	 * increase above the `open_channel2`.  `funding_feerate_perkw`.
+	 *
+	 * The effective `funding_feerate_perkw` for this RBF attempt
+	 * if calculated as 1.25^`fee_step` * `funding_feerate_perkw`.
+	 * E.g. if `feerate_per_kw_funding` is 512 and the `fee_step` is 1,
+	 * the effective `feerate` for this RBF attempt is 512 + 512 / 4
+	 * or 640 sat/kw.  A `fee_step` 2 would be `1.25^2 * 512`
+	 * (or 640 + 640 / 4), 800 sat/kw.
 	 */
 	for (; fee_step > 0; fee_step--)
 		feerate += feerate / 4;
@@ -2616,12 +2621,11 @@ static void rbf_wrap_up(struct state *state,
 	char *err_reason;
 	u8 *msg;
 
-	/* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2:
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #2:
 	 * The sending node:
-	 *  - if is the `opener`:
-	 *   - MUST send at least one `tx_add_output`,  the channel
-	 *     funding output.
-	 */
+	 * - if is the *opener*:
+	 *   - MUST send at least one `tx_add_output`,  which contains the
+	 *   channel's funding output */
 	if (state->our_role == TX_INITIATOR)
 		add_funding_output(tx_state, state, total);
 	else
@@ -3357,7 +3361,6 @@ static u8 *handle_peer_in(struct state *state)
 	case WIRE_TX_REMOVE_OUTPUT:
 	case WIRE_TX_COMPLETE:
 	case WIRE_ACK_RBF:
-	case WIRE_BLACKLIST_PODLE:
 	case WIRE_CHANNEL_ANNOUNCEMENT:
 	case WIRE_CHANNEL_UPDATE:
 	case WIRE_NODE_ANNOUNCEMENT:
@@ -3439,8 +3442,6 @@ int main(int argc, char *argv[])
 				    &state->our_points,
 				    &state->our_funding_pubkey,
 				    &state->minimum_depth,
-				    &state->min_feerate,
-				    &state->max_feerate,
 				    &inner)) {
 		/*~ Initially we're not associated with a channel, but
 		 * handle_peer_gossip_or_error compares this. */
@@ -3475,8 +3476,6 @@ int main(int argc, char *argv[])
 					     &state->our_funding_pubkey,
 					     &state->their_funding_pubkey,
 					     &state->minimum_depth,
-					     &state->min_feerate,
-					     &state->max_feerate,
 					     &state->tx_state->funding_txid,
 					     &state->tx_state->funding_txout,
 					     &state->feerate_per_kw_funding,
diff --git a/openingd/dualopend_wire.csv b/openingd/dualopend_wire.csv
index baa766addc35..0608f57f60c8 100644
--- a/openingd/dualopend_wire.csv
+++ b/openingd/dualopend_wire.csv
@@ -26,8 +26,6 @@ msgdata,dualopend_init,our_basepoints,basepoints,
 msgdata,dualopend_init,our_funding_pubkey,pubkey,
 # Constraints in case the other end tries to open a channel.
 msgdata,dualopend_init,minimum_depth,u32,
-msgdata,dualopend_init,min_feerate,u32,
-msgdata,dualopend_init,max_feerate,u32,
 # Optional msg to send.
 msgdata,dualopend_init,len,u16,
 msgdata,dualopend_init,msg,u8,len
@@ -48,8 +46,6 @@ msgdata,dualopend_reinit,our_basepoints,basepoints,
 msgdata,dualopend_reinit,our_funding_pubkey,pubkey,
 msgdata,dualopend_reinit,their_funding_pubkey,pubkey,
 msgdata,dualopend_reinit,minimum_depth,u32,
-msgdata,dualopend_reinit,min_feerate,u32,
-msgdata,dualopend_reinit,max_feerate,u32,
 msgdata,dualopend_reinit,funding_txid,bitcoin_txid,
 msgdata,dualopend_reinit,funding_txout,u16,
 msgdata,dualopend_reinit,orignal_feerate_per_kw_funding,u32,
@@ -82,10 +78,8 @@ msgdata,dualopend_got_offer,opener_funding,amount_sat,
 msgdata,dualopend_got_offer,dust_limit_satoshis,amount_sat,
 msgdata,dualopend_got_offer,max_htlc_value_in_flight_msat,amount_msat,
 msgdata,dualopend_got_offer,htlc_minimum_msat,amount_msat,
-msgdata,dualopend_got_offer,feerate_funding_max,u32,
-msgdata,dualopend_got_offer,feerate_funding_min,u32,
-msgdata,dualopend_got_offer,feerate_funding_best,u32,
-msgdata,dualopend_got_offer,feerate_per_kw,u32,
+msgdata,dualopend_got_offer,feerate_per_kw_funding,u32,
+msgdata,dualopend_got_offer,feerate_per_kw_commitment,u32,
 msgdata,dualopend_got_offer,to_self_delay,u16,
 msgdata,dualopend_got_offer,max_accepted_htlcs,u16,
 msgdata,dualopend_got_offer,channel_flags,u8,
@@ -96,7 +90,6 @@ msgdata,dualopend_got_offer,shutdown_scriptpubkey,u8,shutdown_len
 # master->dualopend: reply back with our first funding info/contribs
 msgtype,dualopend_got_offer_reply,7105
 msgdata,dualopend_got_offer_reply,accepter_funding,amount_sat,
-msgdata,dualopend_got_offer_reply,feerate_funding,u32,
 msgdata,dualopend_got_offer_reply,psbt,wally_psbt,
 msgdata,dualopend_got_offer_reply,shutdown_len,u16,
 msgdata,dualopend_got_offer_reply,our_shutdown_scriptpubkey,?u8,shutdown_len
diff --git a/openingd/dualopend_wiregen.c b/openingd/dualopend_wiregen.c
index 52c29589b9aa..e354eca37b0c 100644
--- a/openingd/dualopend_wiregen.c
+++ b/openingd/dualopend_wiregen.c
@@ -91,7 +91,7 @@ bool dualopend_wire_is_defined(u16 type)
 
 
 /* WIRE: DUALOPEND_INIT */
-u8 *towire_dualopend_init(const tal_t *ctx, const struct chainparams *chainparams, const struct feature_set *our_feature_set, const u8 *their_init_features, const struct channel_config *our_config, u32 max_to_self_delay, struct amount_msat min_effective_htlc_capacity_msat, const struct per_peer_state *pps, const struct basepoints *our_basepoints, const struct pubkey *our_funding_pubkey, u32 minimum_depth, u32 min_feerate, u32 max_feerate, const u8 *msg)
+u8 *towire_dualopend_init(const tal_t *ctx, const struct chainparams *chainparams, const struct feature_set *our_feature_set, const u8 *their_init_features, const struct channel_config *our_config, u32 max_to_self_delay, struct amount_msat min_effective_htlc_capacity_msat, const struct per_peer_state *pps, const struct basepoints *our_basepoints, const struct pubkey *our_funding_pubkey, u32 minimum_depth, const u8 *msg)
 {
 	u16 their_init_features_len = tal_count(their_init_features);
 	u16 len = tal_count(msg);
@@ -113,15 +113,13 @@ u8 *towire_dualopend_init(const tal_t *ctx, const struct chainparams *chainparam
 	towire_pubkey(&p, our_funding_pubkey);
 	/* Constraints in case the other end tries to open a channel. */
 	towire_u32(&p, minimum_depth);
-	towire_u32(&p, min_feerate);
-	towire_u32(&p, max_feerate);
 	/* Optional msg to send. */
 	towire_u16(&p, len);
 	towire_u8_array(&p, msg, len);
 
 	return memcheck(p, tal_count(p));
 }
-bool fromwire_dualopend_init(const tal_t *ctx, const void *p, const struct chainparams **chainparams, struct feature_set **our_feature_set, u8 **their_init_features, struct channel_config *our_config, u32 *max_to_self_delay, struct amount_msat *min_effective_htlc_capacity_msat, struct per_peer_state **pps, struct basepoints *our_basepoints, struct pubkey *our_funding_pubkey, u32 *minimum_depth, u32 *min_feerate, u32 *max_feerate, u8 **msg)
+bool fromwire_dualopend_init(const tal_t *ctx, const void *p, const struct chainparams **chainparams, struct feature_set **our_feature_set, u8 **their_init_features, struct channel_config *our_config, u32 *max_to_self_delay, struct amount_msat *min_effective_htlc_capacity_msat, struct per_peer_state **pps, struct basepoints *our_basepoints, struct pubkey *our_funding_pubkey, u32 *minimum_depth, u8 **msg)
 {
 	u16 their_init_features_len;
 	u16 len;
@@ -148,8 +146,6 @@ bool fromwire_dualopend_init(const tal_t *ctx, const void *p, const struct chain
  	fromwire_pubkey(&cursor, &plen, our_funding_pubkey);
  	/* Constraints in case the other end tries to open a channel. */
 	*minimum_depth = fromwire_u32(&cursor, &plen);
- 	*min_feerate = fromwire_u32(&cursor, &plen);
- 	*max_feerate = fromwire_u32(&cursor, &plen);
  	/* Optional msg to send. */
 	len = fromwire_u16(&cursor, &plen);
  	// 2nd case msg
@@ -160,7 +156,7 @@ bool fromwire_dualopend_init(const tal_t *ctx, const void *p, const struct chain
 
 /* WIRE: DUALOPEND_REINIT */
 /* master-dualopend: peer has reconnected */
-u8 *towire_dualopend_reinit(const tal_t *ctx, const struct chainparams *chainparams, const struct feature_set *our_feature_set, const u8 *their_init_features, const struct channel_config *our_config, const struct channel_config *their_config, const struct channel_id *channel_id, u32 max_to_self_delay, struct amount_msat min_effective_htlc_capacity_msat, const struct per_peer_state *pps, const struct basepoints *our_basepoints, const struct pubkey *our_funding_pubkey, const struct pubkey *their_funding_pubkey, u32 minimum_depth, u32 min_feerate, u32 max_feerate, const struct bitcoin_txid *funding_txid, u16 funding_txout, u32 orignal_feerate_per_kw_funding, u32 most_recent_feerate_per_kw_funding, struct amount_sat funding_satoshi, struct amount_msat our_funding, const struct basepoints *their_basepoints, const struct pubkey *remote_per_commit, const struct wally_psbt *funding_psbt, enum side opener, bool local_funding_locked, bool remote_funding_locked, bool send_shutdown, bool remote_shutdown_received, const u8 *local_shutdown_scriptpubkey, const u8 *remote_shutdown_scriptpubkey, bool remote_funding_sigs_received, const struct fee_states *fee_states, u8 channel_flags, const u8 *msg)
+u8 *towire_dualopend_reinit(const tal_t *ctx, const struct chainparams *chainparams, const struct feature_set *our_feature_set, const u8 *their_init_features, const struct channel_config *our_config, const struct channel_config *their_config, const struct channel_id *channel_id, u32 max_to_self_delay, struct amount_msat min_effective_htlc_capacity_msat, const struct per_peer_state *pps, const struct basepoints *our_basepoints, const struct pubkey *our_funding_pubkey, const struct pubkey *their_funding_pubkey, u32 minimum_depth, const struct bitcoin_txid *funding_txid, u16 funding_txout, u32 orignal_feerate_per_kw_funding, u32 most_recent_feerate_per_kw_funding, struct amount_sat funding_satoshi, struct amount_msat our_funding, const struct basepoints *their_basepoints, const struct pubkey *remote_per_commit, const struct wally_psbt *funding_psbt, enum side opener, bool local_funding_locked, bool remote_funding_locked, bool send_shutdown, bool remote_shutdown_received, const u8 *local_shutdown_scriptpubkey, const u8 *remote_shutdown_scriptpubkey, bool remote_funding_sigs_received, const struct fee_states *fee_states, u8 channel_flags, const u8 *msg)
 {
 	u16 their_init_features_len = tal_count(their_init_features);
 	u16 local_shutdown_len = tal_count(local_shutdown_scriptpubkey);
@@ -183,8 +179,6 @@ u8 *towire_dualopend_reinit(const tal_t *ctx, const struct chainparams *chainpar
 	towire_pubkey(&p, our_funding_pubkey);
 	towire_pubkey(&p, their_funding_pubkey);
 	towire_u32(&p, minimum_depth);
-	towire_u32(&p, min_feerate);
-	towire_u32(&p, max_feerate);
 	towire_bitcoin_txid(&p, funding_txid);
 	towire_u16(&p, funding_txout);
 	towire_u32(&p, orignal_feerate_per_kw_funding);
@@ -212,7 +206,7 @@ u8 *towire_dualopend_reinit(const tal_t *ctx, const struct chainparams *chainpar
 
 	return memcheck(p, tal_count(p));
 }
-bool fromwire_dualopend_reinit(const tal_t *ctx, const void *p, const struct chainparams **chainparams, struct feature_set **our_feature_set, u8 **their_init_features, struct channel_config *our_config, struct channel_config *their_config, struct channel_id *channel_id, u32 *max_to_self_delay, struct amount_msat *min_effective_htlc_capacity_msat, struct per_peer_state **pps, struct basepoints *our_basepoints, struct pubkey *our_funding_pubkey, struct pubkey *their_funding_pubkey, u32 *minimum_depth, u32 *min_feerate, u32 *max_feerate, struct bitcoin_txid *funding_txid, u16 *funding_txout, u32 *orignal_feerate_per_kw_funding, u32 *most_recent_feerate_per_kw_funding, struct amount_sat *funding_satoshi, struct amount_msat *our_funding, struct basepoints *their_basepoints, struct pubkey *remote_per_commit, struct wally_psbt **funding_psbt, enum side *opener, bool *local_funding_locked, bool *remote_funding_locked, bool *send_shutdown, bool *remote_shutdown_received, u8 **local_shutdown_scriptpubkey, u8 **remote_shutdown_scriptpubkey, bool *remote_funding_sigs_received, struct fee_states **fee_states, u8 *channel_flags, u8 **msg)
+bool fromwire_dualopend_reinit(const tal_t *ctx, const void *p, const struct chainparams **chainparams, struct feature_set **our_feature_set, u8 **their_init_features, struct channel_config *our_config, struct channel_config *their_config, struct channel_id *channel_id, u32 *max_to_self_delay, struct amount_msat *min_effective_htlc_capacity_msat, struct per_peer_state **pps, struct basepoints *our_basepoints, struct pubkey *our_funding_pubkey, struct pubkey *their_funding_pubkey, u32 *minimum_depth, struct bitcoin_txid *funding_txid, u16 *funding_txout, u32 *orignal_feerate_per_kw_funding, u32 *most_recent_feerate_per_kw_funding, struct amount_sat *funding_satoshi, struct amount_msat *our_funding, struct basepoints *their_basepoints, struct pubkey *remote_per_commit, struct wally_psbt **funding_psbt, enum side *opener, bool *local_funding_locked, bool *remote_funding_locked, bool *send_shutdown, bool *remote_shutdown_received, u8 **local_shutdown_scriptpubkey, u8 **remote_shutdown_scriptpubkey, bool *remote_funding_sigs_received, struct fee_states **fee_states, u8 *channel_flags, u8 **msg)
 {
 	u16 their_init_features_len;
 	u16 local_shutdown_len;
@@ -240,8 +234,6 @@ bool fromwire_dualopend_reinit(const tal_t *ctx, const void *p, const struct cha
  	fromwire_pubkey(&cursor, &plen, our_funding_pubkey);
  	fromwire_pubkey(&cursor, &plen, their_funding_pubkey);
  	*minimum_depth = fromwire_u32(&cursor, &plen);
- 	*min_feerate = fromwire_u32(&cursor, &plen);
- 	*max_feerate = fromwire_u32(&cursor, &plen);
  	fromwire_bitcoin_txid(&cursor, &plen, funding_txid);
  	*funding_txout = fromwire_u16(&cursor, &plen);
  	*orignal_feerate_per_kw_funding = fromwire_u32(&cursor, &plen);
@@ -277,7 +269,7 @@ bool fromwire_dualopend_reinit(const tal_t *ctx, const void *p, const struct cha
 
 /* WIRE: DUALOPEND_GOT_OFFER */
 /* dualopend->master: they offered channel */
-u8 *towire_dualopend_got_offer(const tal_t *ctx, const struct channel_id *channel_id, struct amount_sat opener_funding, struct amount_sat dust_limit_satoshis, struct amount_msat max_htlc_value_in_flight_msat, struct amount_msat htlc_minimum_msat, u32 feerate_funding_max, u32 feerate_funding_min, u32 feerate_funding_best, u32 feerate_per_kw, u16 to_self_delay, u16 max_accepted_htlcs, u8 channel_flags, u32 locktime, const u8 *shutdown_scriptpubkey)
+u8 *towire_dualopend_got_offer(const tal_t *ctx, const struct channel_id *channel_id, struct amount_sat opener_funding, struct amount_sat dust_limit_satoshis, struct amount_msat max_htlc_value_in_flight_msat, struct amount_msat htlc_minimum_msat, u32 feerate_per_kw_funding, u32 feerate_per_kw_commitment, u16 to_self_delay, u16 max_accepted_htlcs, u8 channel_flags, u32 locktime, const u8 *shutdown_scriptpubkey)
 {
 	u16 shutdown_len = tal_count(shutdown_scriptpubkey);
 	u8 *p = tal_arr(ctx, u8, 0);
@@ -288,10 +280,8 @@ u8 *towire_dualopend_got_offer(const tal_t *ctx, const struct channel_id *channe
 	towire_amount_sat(&p, dust_limit_satoshis);
 	towire_amount_msat(&p, max_htlc_value_in_flight_msat);
 	towire_amount_msat(&p, htlc_minimum_msat);
-	towire_u32(&p, feerate_funding_max);
-	towire_u32(&p, feerate_funding_min);
-	towire_u32(&p, feerate_funding_best);
-	towire_u32(&p, feerate_per_kw);
+	towire_u32(&p, feerate_per_kw_funding);
+	towire_u32(&p, feerate_per_kw_commitment);
 	towire_u16(&p, to_self_delay);
 	towire_u16(&p, max_accepted_htlcs);
 	towire_u8(&p, channel_flags);
@@ -301,7 +291,7 @@ u8 *towire_dualopend_got_offer(const tal_t *ctx, const struct channel_id *channe
 
 	return memcheck(p, tal_count(p));
 }
-bool fromwire_dualopend_got_offer(const tal_t *ctx, const void *p, struct channel_id *channel_id, struct amount_sat *opener_funding, struct amount_sat *dust_limit_satoshis, struct amount_msat *max_htlc_value_in_flight_msat, struct amount_msat *htlc_minimum_msat, u32 *feerate_funding_max, u32 *feerate_funding_min, u32 *feerate_funding_best, u32 *feerate_per_kw, u16 *to_self_delay, u16 *max_accepted_htlcs, u8 *channel_flags, u32 *locktime, u8 **shutdown_scriptpubkey)
+bool fromwire_dualopend_got_offer(const tal_t *ctx, const void *p, struct channel_id *channel_id, struct amount_sat *opener_funding, struct amount_sat *dust_limit_satoshis, struct amount_msat *max_htlc_value_in_flight_msat, struct amount_msat *htlc_minimum_msat, u32 *feerate_per_kw_funding, u32 *feerate_per_kw_commitment, u16 *to_self_delay, u16 *max_accepted_htlcs, u8 *channel_flags, u32 *locktime, u8 **shutdown_scriptpubkey)
 {
 	u16 shutdown_len;
 
@@ -315,10 +305,8 @@ bool fromwire_dualopend_got_offer(const tal_t *ctx, const void *p, struct channe
  	*dust_limit_satoshis = fromwire_amount_sat(&cursor, &plen);
  	*max_htlc_value_in_flight_msat = fromwire_amount_msat(&cursor, &plen);
  	*htlc_minimum_msat = fromwire_amount_msat(&cursor, &plen);
- 	*feerate_funding_max = fromwire_u32(&cursor, &plen);
- 	*feerate_funding_min = fromwire_u32(&cursor, &plen);
- 	*feerate_funding_best = fromwire_u32(&cursor, &plen);
- 	*feerate_per_kw = fromwire_u32(&cursor, &plen);
+ 	*feerate_per_kw_funding = fromwire_u32(&cursor, &plen);
+ 	*feerate_per_kw_commitment = fromwire_u32(&cursor, &plen);
  	*to_self_delay = fromwire_u16(&cursor, &plen);
  	*max_accepted_htlcs = fromwire_u16(&cursor, &plen);
  	*channel_flags = fromwire_u8(&cursor, &plen);
@@ -332,21 +320,20 @@ bool fromwire_dualopend_got_offer(const tal_t *ctx, const void *p, struct channe
 
 /* WIRE: DUALOPEND_GOT_OFFER_REPLY */
 /* master->dualopend: reply back with our first funding info/contribs */
-u8 *towire_dualopend_got_offer_reply(const tal_t *ctx, struct amount_sat accepter_funding, u32 feerate_funding, const struct wally_psbt *psbt, const u8 *our_shutdown_scriptpubkey)
+u8 *towire_dualopend_got_offer_reply(const tal_t *ctx, struct amount_sat accepter_funding, const struct wally_psbt *psbt, const u8 *our_shutdown_scriptpubkey)
 {
 	u16 shutdown_len = tal_count(our_shutdown_scriptpubkey);
 	u8 *p = tal_arr(ctx, u8, 0);
 
 	towire_u16(&p, WIRE_DUALOPEND_GOT_OFFER_REPLY);
 	towire_amount_sat(&p, accepter_funding);
-	towire_u32(&p, feerate_funding);
 	towire_wally_psbt(&p, psbt);
 	towire_u16(&p, shutdown_len);
 	towire_u8_array(&p, our_shutdown_scriptpubkey, shutdown_len);
 
 	return memcheck(p, tal_count(p));
 }
-bool fromwire_dualopend_got_offer_reply(const tal_t *ctx, const void *p, struct amount_sat *accepter_funding, u32 *feerate_funding, struct wally_psbt **psbt, u8 **our_shutdown_scriptpubkey)
+bool fromwire_dualopend_got_offer_reply(const tal_t *ctx, const void *p, struct amount_sat *accepter_funding, struct wally_psbt **psbt, u8 **our_shutdown_scriptpubkey)
 {
 	u16 shutdown_len;
 
@@ -356,7 +343,6 @@ bool fromwire_dualopend_got_offer_reply(const tal_t *ctx, const void *p, struct
 	if (fromwire_u16(&cursor, &plen) != WIRE_DUALOPEND_GOT_OFFER_REPLY)
 		return false;
  	*accepter_funding = fromwire_amount_sat(&cursor, &plen);
- 	*feerate_funding = fromwire_u32(&cursor, &plen);
  	*psbt = fromwire_wally_psbt(ctx, &cursor, &plen);
  	shutdown_len = fromwire_u16(&cursor, &plen);
  	// 2nd case our_shutdown_scriptpubkey
@@ -946,4 +932,4 @@ bool fromwire_dualopend_dev_memleak_reply(const void *p, bool *leak)
  	*leak = fromwire_bool(&cursor, &plen);
 	return cursor != NULL;
 }
-// SHA256STAMP:407d42d23a8c3b4526b63fdbb572a1d8e75b4e7e390e13af018e289e5ac857cd
+// SHA256STAMP:b93c5d3aad8cc2f256ed1205341ff68ea34d5bfc4a0d05071a8fe28177186bc5
diff --git a/openingd/dualopend_wiregen.h b/openingd/dualopend_wiregen.h
index 0cfb1b2787f4..f1de1c45f48e 100644
--- a/openingd/dualopend_wiregen.h
+++ b/openingd/dualopend_wiregen.h
@@ -86,23 +86,23 @@ bool dualopend_wire_is_defined(u16 type);
 
 
 /* WIRE: DUALOPEND_INIT */
-u8 *towire_dualopend_init(const tal_t *ctx, const struct chainparams *chainparams, const struct feature_set *our_feature_set, const u8 *their_init_features, const struct channel_config *our_config, u32 max_to_self_delay, struct amount_msat min_effective_htlc_capacity_msat, const struct per_peer_state *pps, const struct basepoints *our_basepoints, const struct pubkey *our_funding_pubkey, u32 minimum_depth, u32 min_feerate, u32 max_feerate, const u8 *msg);
-bool fromwire_dualopend_init(const tal_t *ctx, const void *p, const struct chainparams **chainparams, struct feature_set **our_feature_set, u8 **their_init_features, struct channel_config *our_config, u32 *max_to_self_delay, struct amount_msat *min_effective_htlc_capacity_msat, struct per_peer_state **pps, struct basepoints *our_basepoints, struct pubkey *our_funding_pubkey, u32 *minimum_depth, u32 *min_feerate, u32 *max_feerate, u8 **msg);
+u8 *towire_dualopend_init(const tal_t *ctx, const struct chainparams *chainparams, const struct feature_set *our_feature_set, const u8 *their_init_features, const struct channel_config *our_config, u32 max_to_self_delay, struct amount_msat min_effective_htlc_capacity_msat, const struct per_peer_state *pps, const struct basepoints *our_basepoints, const struct pubkey *our_funding_pubkey, u32 minimum_depth, const u8 *msg);
+bool fromwire_dualopend_init(const tal_t *ctx, const void *p, const struct chainparams **chainparams, struct feature_set **our_feature_set, u8 **their_init_features, struct channel_config *our_config, u32 *max_to_self_delay, struct amount_msat *min_effective_htlc_capacity_msat, struct per_peer_state **pps, struct basepoints *our_basepoints, struct pubkey *our_funding_pubkey, u32 *minimum_depth, u8 **msg);
 
 /* WIRE: DUALOPEND_REINIT */
 /*  master-dualopend: peer has reconnected */
-u8 *towire_dualopend_reinit(const tal_t *ctx, const struct chainparams *chainparams, const struct feature_set *our_feature_set, const u8 *their_init_features, const struct channel_config *our_config, const struct channel_config *their_config, const struct channel_id *channel_id, u32 max_to_self_delay, struct amount_msat min_effective_htlc_capacity_msat, const struct per_peer_state *pps, const struct basepoints *our_basepoints, const struct pubkey *our_funding_pubkey, const struct pubkey *their_funding_pubkey, u32 minimum_depth, u32 min_feerate, u32 max_feerate, const struct bitcoin_txid *funding_txid, u16 funding_txout, u32 orignal_feerate_per_kw_funding, u32 most_recent_feerate_per_kw_funding, struct amount_sat funding_satoshi, struct amount_msat our_funding, const struct basepoints *their_basepoints, const struct pubkey *remote_per_commit, const struct wally_psbt *funding_psbt, enum side opener, bool local_funding_locked, bool remote_funding_locked, bool send_shutdown, bool remote_shutdown_received, const u8 *local_shutdown_scriptpubkey, const u8 *remote_shutdown_scriptpubkey, bool remote_funding_sigs_received, const struct fee_states *fee_states, u8 channel_flags, const u8 *msg);
-bool fromwire_dualopend_reinit(const tal_t *ctx, const void *p, const struct chainparams **chainparams, struct feature_set **our_feature_set, u8 **their_init_features, struct channel_config *our_config, struct channel_config *their_config, struct channel_id *channel_id, u32 *max_to_self_delay, struct amount_msat *min_effective_htlc_capacity_msat, struct per_peer_state **pps, struct basepoints *our_basepoints, struct pubkey *our_funding_pubkey, struct pubkey *their_funding_pubkey, u32 *minimum_depth, u32 *min_feerate, u32 *max_feerate, struct bitcoin_txid *funding_txid, u16 *funding_txout, u32 *orignal_feerate_per_kw_funding, u32 *most_recent_feerate_per_kw_funding, struct amount_sat *funding_satoshi, struct amount_msat *our_funding, struct basepoints *their_basepoints, struct pubkey *remote_per_commit, struct wally_psbt **funding_psbt, enum side *opener, bool *local_funding_locked, bool *remote_funding_locked, bool *send_shutdown, bool *remote_shutdown_received, u8 **local_shutdown_scriptpubkey, u8 **remote_shutdown_scriptpubkey, bool *remote_funding_sigs_received, struct fee_states **fee_states, u8 *channel_flags, u8 **msg);
+u8 *towire_dualopend_reinit(const tal_t *ctx, const struct chainparams *chainparams, const struct feature_set *our_feature_set, const u8 *their_init_features, const struct channel_config *our_config, const struct channel_config *their_config, const struct channel_id *channel_id, u32 max_to_self_delay, struct amount_msat min_effective_htlc_capacity_msat, const struct per_peer_state *pps, const struct basepoints *our_basepoints, const struct pubkey *our_funding_pubkey, const struct pubkey *their_funding_pubkey, u32 minimum_depth, const struct bitcoin_txid *funding_txid, u16 funding_txout, u32 orignal_feerate_per_kw_funding, u32 most_recent_feerate_per_kw_funding, struct amount_sat funding_satoshi, struct amount_msat our_funding, const struct basepoints *their_basepoints, const struct pubkey *remote_per_commit, const struct wally_psbt *funding_psbt, enum side opener, bool local_funding_locked, bool remote_funding_locked, bool send_shutdown, bool remote_shutdown_received, const u8 *local_shutdown_scriptpubkey, const u8 *remote_shutdown_scriptpubkey, bool remote_funding_sigs_received, const struct fee_states *fee_states, u8 channel_flags, const u8 *msg);
+bool fromwire_dualopend_reinit(const tal_t *ctx, const void *p, const struct chainparams **chainparams, struct feature_set **our_feature_set, u8 **their_init_features, struct channel_config *our_config, struct channel_config *their_config, struct channel_id *channel_id, u32 *max_to_self_delay, struct amount_msat *min_effective_htlc_capacity_msat, struct per_peer_state **pps, struct basepoints *our_basepoints, struct pubkey *our_funding_pubkey, struct pubkey *their_funding_pubkey, u32 *minimum_depth, struct bitcoin_txid *funding_txid, u16 *funding_txout, u32 *orignal_feerate_per_kw_funding, u32 *most_recent_feerate_per_kw_funding, struct amount_sat *funding_satoshi, struct amount_msat *our_funding, struct basepoints *their_basepoints, struct pubkey *remote_per_commit, struct wally_psbt **funding_psbt, enum side *opener, bool *local_funding_locked, bool *remote_funding_locked, bool *send_shutdown, bool *remote_shutdown_received, u8 **local_shutdown_scriptpubkey, u8 **remote_shutdown_scriptpubkey, bool *remote_funding_sigs_received, struct fee_states **fee_states, u8 *channel_flags, u8 **msg);
 
 /* WIRE: DUALOPEND_GOT_OFFER */
 /*  dualopend->master: they offered channel */
-u8 *towire_dualopend_got_offer(const tal_t *ctx, const struct channel_id *channel_id, struct amount_sat opener_funding, struct amount_sat dust_limit_satoshis, struct amount_msat max_htlc_value_in_flight_msat, struct amount_msat htlc_minimum_msat, u32 feerate_funding_max, u32 feerate_funding_min, u32 feerate_funding_best, u32 feerate_per_kw, u16 to_self_delay, u16 max_accepted_htlcs, u8 channel_flags, u32 locktime, const u8 *shutdown_scriptpubkey);
-bool fromwire_dualopend_got_offer(const tal_t *ctx, const void *p, struct channel_id *channel_id, struct amount_sat *opener_funding, struct amount_sat *dust_limit_satoshis, struct amount_msat *max_htlc_value_in_flight_msat, struct amount_msat *htlc_minimum_msat, u32 *feerate_funding_max, u32 *feerate_funding_min, u32 *feerate_funding_best, u32 *feerate_per_kw, u16 *to_self_delay, u16 *max_accepted_htlcs, u8 *channel_flags, u32 *locktime, u8 **shutdown_scriptpubkey);
+u8 *towire_dualopend_got_offer(const tal_t *ctx, const struct channel_id *channel_id, struct amount_sat opener_funding, struct amount_sat dust_limit_satoshis, struct amount_msat max_htlc_value_in_flight_msat, struct amount_msat htlc_minimum_msat, u32 feerate_per_kw_funding, u32 feerate_per_kw_commitment, u16 to_self_delay, u16 max_accepted_htlcs, u8 channel_flags, u32 locktime, const u8 *shutdown_scriptpubkey);
+bool fromwire_dualopend_got_offer(const tal_t *ctx, const void *p, struct channel_id *channel_id, struct amount_sat *opener_funding, struct amount_sat *dust_limit_satoshis, struct amount_msat *max_htlc_value_in_flight_msat, struct amount_msat *htlc_minimum_msat, u32 *feerate_per_kw_funding, u32 *feerate_per_kw_commitment, u16 *to_self_delay, u16 *max_accepted_htlcs, u8 *channel_flags, u32 *locktime, u8 **shutdown_scriptpubkey);
 
 /* WIRE: DUALOPEND_GOT_OFFER_REPLY */
 /*  master->dualopend: reply back with our first funding info/contribs */
-u8 *towire_dualopend_got_offer_reply(const tal_t *ctx, struct amount_sat accepter_funding, u32 feerate_funding, const struct wally_psbt *psbt, const u8 *our_shutdown_scriptpubkey);
-bool fromwire_dualopend_got_offer_reply(const tal_t *ctx, const void *p, struct amount_sat *accepter_funding, u32 *feerate_funding, struct wally_psbt **psbt, u8 **our_shutdown_scriptpubkey);
+u8 *towire_dualopend_got_offer_reply(const tal_t *ctx, struct amount_sat accepter_funding, const struct wally_psbt *psbt, const u8 *our_shutdown_scriptpubkey);
+bool fromwire_dualopend_got_offer_reply(const tal_t *ctx, const void *p, struct amount_sat *accepter_funding, struct wally_psbt **psbt, u8 **our_shutdown_scriptpubkey);
 
 /* WIRE: DUALOPEND_GOT_RBF_OFFER */
 /*  dualopend->master: they offered a RBF */
@@ -216,4 +216,4 @@ bool fromwire_dualopend_dev_memleak_reply(const void *p, bool *leak);
 
 
 #endif /* LIGHTNING_OPENINGD_DUALOPEND_WIREGEN_H */
-// SHA256STAMP:407d42d23a8c3b4526b63fdbb572a1d8e75b4e7e390e13af018e289e5ac857cd
+// SHA256STAMP:b93c5d3aad8cc2f256ed1205341ff68ea34d5bfc4a0d05071a8fe28177186bc5
diff --git a/plugins/spender/multifundchannel.c b/plugins/spender/multifundchannel.c
index 081a5f87b712..f354497f3b18 100644
--- a/plugins/spender/multifundchannel.c
+++ b/plugins/spender/multifundchannel.c
@@ -741,7 +741,7 @@ perform_fundpsbt(struct multifundchannel_command *mfc)
 	}
 
 	/* If we've got v2 opens, we need to use a min weight of 110. */
-	/* BOLT-78de9a79b491ae9fb84b1fdb4546bacf642dce87 #2
+	/* BOLT-f53ca2301232db780843e894f55d95d512f297f9 #3:
 	 * The minimum witness weight for an input is 110.
 	 */
 	if (dest_count(mfc, OPEN_CHANNEL) > 0) {
diff --git a/tests/plugins/df_accepter.py b/tests/plugins/df_accepter.py
index 5c708b4275f0..31b0ede6ced1 100755
--- a/tests/plugins/df_accepter.py
+++ b/tests/plugins/df_accepter.py
@@ -13,20 +13,6 @@
 plugin = Plugin()
 
 
-def find_feerate(best, their_min, their_max, our_min, our_max):
-    if best >= our_min and best <= our_max:
-        return best
-
-    if their_max < our_min or their_min > our_max:
-        return False
-
-    if best < our_min:
-        return our_min
-
-    # best > our_max:
-    return our_max
-
-
 def find_inputs(b64_psbt):
     serial_id_key = bytes.fromhex('fc096c696768746e696e6701')
     psbt = psbt_from_base64(b64_psbt)
@@ -106,20 +92,18 @@ def on_openchannel(openchannel2, plugin, **kwargs):
         return {'result': 'continue'}
 
     # ...unless they send us totally unacceptable feerates.
-    feerate = find_feerate(openchannel2['funding_feerate_best'],
-                           openchannel2['funding_feerate_min'],
-                           openchannel2['funding_feerate_max'],
-                           openchannel2['feerate_our_min'],
-                           openchannel2['feerate_our_max'])
+    proposed_feerate = openchannel2['funding_feerate_per_kw']
+    our_min = openchannel2['feerate_our_min']
+    our_max = openchannel2['feerate_our_max']
 
     # Their feerate range is out of bounds, we're not going to
     # participate.
-    if not feerate:
-        plugin.log("Declining to fund, no feerate found.")
+    if proposed_feerate > our_max or proposed_feerate < our_min:
+        plugin.log("Declining to fund, feerate unacceptable.")
         return {'result': 'continue'}
 
     funding = plugin.rpc.fundpsbt(int(amount.to_satoshi()),
-                                  '{}perkw'.format(feerate),
+                                  '{}perkw'.format(proposed_feerate),
                                   0,  # because we're the accepter!!
                                   reserve=True,
                                   locktime=locktime,
@@ -128,11 +112,10 @@ def on_openchannel(openchannel2, plugin, **kwargs):
                                   excess_as_change=True)
     add_inflight(plugin, openchannel2['id'],
                  openchannel2['channel_id'], funding['psbt'])
-    plugin.log("contributing {} at feerate {}".format(amount, feerate))
+    plugin.log("contributing {} at feerate {}".format(amount, proposed_feerate))
 
     return {'result': 'continue', 'psbt': funding['psbt'],
-            'accepter_funding_msat': amount,
-            'funding_feerate': feerate}
+            'accepter_funding_msat': amount}
 
 
 @plugin.hook('openchannel2_changed')
diff --git a/wire/extracted_peer_exp_dual_fund_more.patch b/wire/extracted_peer_exp_dual_fund_more.patch
deleted file mode 100644
index ba5b454c58e0..000000000000
--- a/wire/extracted_peer_exp_dual_fund_more.patch
+++ /dev/null
@@ -1,50 +0,0 @@
---- wire/peer_exp_wire.csv	2020-09-16 20:59:05.170975876 -0500
-+++ -	2020-10-22 16:56:33.413063210 -0500
-@@ -33,7 +33,7 @@
- tlvdata,n2,tlv2,cltv_expiry,tu32,
- msgtype,tx_add_input,66
- msgdata,tx_add_input,channel_id,channel_id,
--msgdata,tx_add_input,serial_id,u16,
-+msgdata,tx_add_input,serial_id,u64,
- msgdata,tx_add_input,prevtx_len,u16,
- msgdata,tx_add_input,prevtx,byte,prevtx_len
- msgdata,tx_add_input,prevtx_vout,u32,
-@@ -48,16 +48,16 @@
- tlvdata,tx_add_input_tlvs,podle_proof,sig,byte,32
- msgtype,tx_add_output,67
- msgdata,tx_add_output,channel_id,channel_id,
--msgdata,tx_add_output,serial_id,u16,
-+msgdata,tx_add_output,serial_id,u64,
- msgdata,tx_add_output,sats,u64,
- msgdata,tx_add_output,scriptlen,u16,
- msgdata,tx_add_output,script,byte,scriptlen
- msgtype,tx_remove_input,68
- msgdata,tx_remove_input,channel_id,channel_id,
--msgdata,tx_remove_input,serial_id,u16,
-+msgdata,tx_remove_input,serial_id,u64,
- msgtype,tx_remove_output,69
- msgdata,tx_remove_output,channel_id,channel_id,
--msgdata,tx_remove_output,serial_id,u16,
-+msgdata,tx_remove_output,serial_id,u64,
- msgtype,tx_complete,70
- msgdata,tx_complete,channel_id,channel_id,
- msgtype,tx_signatures,71
-@@ -125,7 +125,9 @@
- msgtype,open_channel2,64
- msgdata,open_channel2,chain_hash,chain_hash,
- msgdata,open_channel2,podle_h2,sha256,
--msgdata,open_channel2,feerate_per_kw_funding,u32,
-+msgdata,open_channel2,feerate_funding_max,u32,
-+msgdata,open_channel2,feerate_funding_min,u32,
-+msgdata,open_channel2,feerate_funding_best,u32,
- msgdata,open_channel2,funding_satoshis,u64,
- msgdata,open_channel2,dust_limit_satoshis,u64,
- msgdata,open_channel2,max_htlc_value_in_flight_msat,u64,
-@@ -148,6 +150,7 @@
- msgtype,accept_channel2,65
- msgdata,accept_channel2,channel_id,channel_id,
- msgdata,accept_channel2,funding_satoshis,u64,
-+msgdata,accept_channel2,feerate_funding,u32,
- msgdata,accept_channel2,dust_limit_satoshis,u64,
- msgdata,accept_channel2,max_htlc_value_in_flight_msat,u64,
- msgdata,accept_channel2,htlc_minimum_msat,u64,
diff --git a/wire/extracted_peer_exp_dual_fund.patch b/wire/extracted_peer_exp_openchannelv2.patch
similarity index 70%
rename from wire/extracted_peer_exp_dual_fund.patch
rename to wire/extracted_peer_exp_openchannelv2.patch
index 12c7aa1b52d5..3c233e3e682a 100644
--- a/wire/extracted_peer_exp_dual_fund.patch
+++ b/wire/extracted_peer_exp_openchannelv2.patch
@@ -1,36 +1,30 @@
---- wire/extracted_peer_wire_csv	2020-07-28 12:36:12.063168014 -0500
-+++ -	2020-08-31 21:00:40.856646471 -0500
-@@ -31,6 +31,46 @@
+--- wire/peer_exp_wire.csv	2021-03-03 15:46:56.845901075 -0600
++++ -	2021-03-03 15:48:50.342984083 -0600
+@@ -35,6 +31,40 @@
  tlvdata,n2,tlv1,amount_msat,tu64,
  tlvtype,n2,tlv2,11
  tlvdata,n2,tlv2,cltv_expiry,tu32,
 +msgtype,tx_add_input,66
 +msgdata,tx_add_input,channel_id,channel_id,
-+msgdata,tx_add_input,serial_id,u16,
++msgdata,tx_add_input,serial_id,u64,
 +msgdata,tx_add_input,prevtx_len,u16,
 +msgdata,tx_add_input,prevtx,byte,prevtx_len
 +msgdata,tx_add_input,prevtx_vout,u32,
 +msgdata,tx_add_input,sequence,u32,
-+msgdata,tx_add_input,redeemscript_len,u16,
-+msgdata,tx_add_input,script,byte,redeemscript_len
-+msgdata,tx_add_input,tlvs,tx_add_input_tlvs,
-+tlvtype,tx_add_input_tlvs,podle_proof,2
-+tlvdata,tx_add_input_tlvs,podle_proof,p,point,
-+tlvdata,tx_add_input_tlvs,podle_proof,p2,point,
-+tlvdata,tx_add_input_tlvs,podle_proof,e,sha256,
-+tlvdata,tx_add_input_tlvs,podle_proof,sig,byte,32
++msgdata,tx_add_input,script_sig_len,u16,
++msgdata,tx_add_input,script_sig,byte,script_sig_len
 +msgtype,tx_add_output,67
 +msgdata,tx_add_output,channel_id,channel_id,
-+msgdata,tx_add_output,serial_id,u16,
++msgdata,tx_add_output,serial_id,u64,
 +msgdata,tx_add_output,sats,u64,
 +msgdata,tx_add_output,scriptlen,u16,
 +msgdata,tx_add_output,script,byte,scriptlen
 +msgtype,tx_remove_input,68
 +msgdata,tx_remove_input,channel_id,channel_id,
-+msgdata,tx_remove_input,serial_id,u16,
++msgdata,tx_remove_input,serial_id,u64,
 +msgtype,tx_remove_output,69
 +msgdata,tx_remove_output,channel_id,channel_id,
-+msgdata,tx_remove_output,serial_id,u16,
++msgdata,tx_remove_output,serial_id,u64,
 +msgtype,tx_complete,70
 +msgdata,tx_complete,channel_id,channel_id,
 +msgtype,tx_signatures,71
@@ -47,19 +41,19 @@
  msgtype,open_channel,32
  msgdata,open_channel,chain_hash,chain_hash,
  msgdata,open_channel,temporary_channel_id,byte,32
-@@ -82,6 +122,54 @@
+@@ -86,6 +116,56 @@
  msgtype,funding_locked,36
  msgdata,funding_locked,channel_id,channel_id,
  msgdata,funding_locked,next_per_commitment_point,point,
 +msgtype,open_channel2,64
 +msgdata,open_channel2,chain_hash,chain_hash,
-+msgdata,open_channel2,podle_h2,sha256,
-+msgdata,open_channel2,feerate_per_kw_funding,u32,
++msgdata,open_channel2,channel_id,channel_id,
++msgdata,open_channel2,funding_feerate_perkw,u32,
++msgdata,open_channel2,commitment_feerate_perkw,u32,
 +msgdata,open_channel2,funding_satoshis,u64,
 +msgdata,open_channel2,dust_limit_satoshis,u64,
 +msgdata,open_channel2,max_htlc_value_in_flight_msat,u64,
 +msgdata,open_channel2,htlc_minimum_msat,u64,
-+msgdata,open_channel2,feerate_per_kw,u32,
 +msgdata,open_channel2,to_self_delay,u16,
 +msgdata,open_channel2,max_accepted_htlcs,u16,
 +msgdata,open_channel2,locktime,u32,
@@ -70,7 +64,7 @@
 +msgdata,open_channel2,htlc_basepoint,point,
 +msgdata,open_channel2,first_per_commitment_point,point,
 +msgdata,open_channel2,channel_flags,byte,
-+msgdata,open_channel2,opening_tlv,opening_tlvs,
++msgdata,open_channel2,tlvs,opening_tlvs,
 +tlvtype,opening_tlvs,option_upfront_shutdown_script,1
 +tlvdata,opening_tlvs,option_upfront_shutdown_script,shutdown_len,u16,
 +tlvdata,opening_tlvs,option_upfront_shutdown_script,shutdown_scriptpubkey,byte,shutdown_len
@@ -89,7 +83,7 @@
 +msgdata,accept_channel2,delayed_payment_basepoint,point,
 +msgdata,accept_channel2,htlc_basepoint,point,
 +msgdata,accept_channel2,first_per_commitment_point,point,
-+msgdata,accept_channel2,accept_tlv,accept_tlvs,
++msgdata,accept_channel2,tlvs,accept_tlvs,
 +tlvtype,accept_tlvs,option_upfront_shutdown_script,1
 +tlvdata,accept_tlvs,option_upfront_shutdown_script,shutdown_len,u16,
 +tlvdata,accept_tlvs,option_upfront_shutdown_script,shutdown_scriptpubkey,byte,shutdown_len
@@ -97,20 +91,10 @@
 +msgdata,init_rbf,channel_id,channel_id,
 +msgdata,init_rbf,funding_satoshis,u64,
 +msgdata,init_rbf,locktime,u32,
-+msgdata,init_rbf,feerate_per_kw,u32,
 +msgdata,init_rbf,fee_step,byte,
++msgtype,ack_rbf,73
++msgdata,ack_rbf,channel_id,channel_id,
++msgdata,ack_rbf,funding_satoshis,u64,
  msgtype,shutdown,38
  msgdata,shutdown,channel_id,channel_id,
  msgdata,shutdown,len,u16,
-@@ -169,6 +257,11 @@
- msgdata,channel_update,fee_base_msat,u32,
- msgdata,channel_update,fee_proportional_millionths,u32,
- msgdata,channel_update,htlc_maximum_msat,u64,,option_channel_htlc_max
-+msgtype,blacklist_podle,260
-+msgdata,blacklist_podle,signature,signature,
-+msgdata,blacklist_podle,node_id,point,
-+msgdata,blacklist_podle,podle_h2,byte,32
-+msgdata,blacklist_podle,timestamp,u32,
- msgtype,query_short_channel_ids,261,gossip_queries
- msgdata,query_short_channel_ids,chain_hash,chain_hash,
- msgdata,query_short_channel_ids,len,u16,
diff --git a/wire/extracted_peer_exp_tmp_chan_id.patch b/wire/extracted_peer_exp_tmp_chan_id.patch
deleted file mode 100644
index f691cddbc534..000000000000
--- a/wire/extracted_peer_exp_tmp_chan_id.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- wire/peer_exp_wire.csv	2020-11-19 17:11:03.375890549 -0600
-+++ -	2020-12-10 15:56:19.617197279 -0600
-@@ -124,6 +124,7 @@
- msgdata,funding_locked,next_per_commitment_point,point,
- msgtype,open_channel2,64
- msgdata,open_channel2,chain_hash,chain_hash,
-+msgdata,open_channel2,temporary_channel_id,byte,32
- msgdata,open_channel2,podle_h2,sha256,
- msgdata,open_channel2,feerate_funding_max,u32,
- msgdata,open_channel2,feerate_funding_min,u32,
diff --git a/wire/extracted_peer_experimental_dual_fund_more_more.patch b/wire/extracted_peer_experimental_dual_fund_more_more.patch
deleted file mode 100644
index 413870ecc634..000000000000
--- a/wire/extracted_peer_experimental_dual_fund_more_more.patch
+++ /dev/null
@@ -1,14 +0,0 @@
---- wire/peer_exp_wire.csv	2021-01-07 19:57:53.230947150 -0600
-+++ -	2021-01-08 15:17:40.600855619 -0600
-@@ -172,8 +172,10 @@
- msgdata,init_rbf,channel_id,channel_id,
- msgdata,init_rbf,funding_satoshis,u64,
- msgdata,init_rbf,locktime,u32,
--msgdata,init_rbf,feerate_per_kw,u32,
- msgdata,init_rbf,fee_step,byte,
-+msgtype,ack_rbf,73
-+msgdata,ack_rbf,channel_id,channel_id,
-+msgdata,ack_rbf,funding_satoshis,u64,
- msgtype,shutdown,38
- msgdata,shutdown,channel_id,channel_id,
- msgdata,shutdown,len,u16,
diff --git a/wire/peer_wire.c b/wire/peer_wire.c
index b8a9d6d68199..c2161021ccb5 100644
--- a/wire/peer_wire.c
+++ b/wire/peer_wire.c
@@ -45,7 +45,6 @@ static bool unknown_type(enum peer_wire t)
 	case WIRE_ACCEPT_CHANNEL2:
 	case WIRE_INIT_RBF:
 	case WIRE_ACK_RBF:
-	case WIRE_BLACKLIST_PODLE:
 #endif
 		return false;
 	}
@@ -97,7 +96,6 @@ bool is_msg_for_gossipd(const u8 *cursor)
 	case WIRE_ACCEPT_CHANNEL2:
 	case WIRE_INIT_RBF:
 	case WIRE_ACK_RBF:
-	case WIRE_BLACKLIST_PODLE:
 #endif
 		break;
 	}