Adam22 and Jason Luv will put their outlandish web beef behind them tonight in Miami as they step into the ring for a fight three years within the making.
Fans were made to attend because the 7pm Eastern start time for tonight’s Brand Risk Promotions event in Miami was pushed back to 8pm by the organizers.
Who’s going to win; Adam22 or Jason Luv?
Tell us your thoughts on the farcical fight between two of the strangest guys on the web
The lore behind this bizarre celebrity boxing match goes back to 2023, when Jason Luv became the primary male talent to film a scene with Adam22’s wife Lena The Plug. All three involved are adult film stars, and as much as that time Adam had been the one man who filmed along with his spouse.
After social media blew up when the video was teased, Adam claims that the trio pocketed an sum of money so substantial from the one video that it created ‘generational wealth’. Lena and Luv then filmed a sequel two years later, but Adam insists that they won’t film again.
Brand Risk Promotions has now given the pair the prospect to complete their story within the only way that is smart; a heavyweight boxing match. And promoter Adin Ross has stacked the undercard with star names in addition to legitimate skilled bouts.
Rapper YK Osiris will rematch streamer Scam Likely within the co-main event, with Anderson Silva’s son Gabriel also in motion. Rampage Jackson is in attendance to corner against a person coached by Shannon Briggs, and other influencers make up a stacked event.
We’ll be keeping you updated throughout the night on the Bloody Elbow live blog. Be certain to hitch the conversation on Talking Points which will be found above.
Anderson Silva’s son in motion next
Gabriel Silva takes on AP The Fighter, who missed weight by just a few kilos.
Sneako isn’t being let into the event
He apparently told Adin Ross he wouldn’t be coming to the show, they usually are at capability so he isn’t getting in.
Ethan Stern brutalizes General Zach in Unanimous Decision win
A vicious three-round beatdown from Stable Ronaldo’s fighter, he defeats XQC’s guy handily.
General Zach vs Ethan Stern is next
XQC’s General Zach takes on Stable Ronaldo’s proxy Ethan Stern. Battle of the streamers!
Confusion as Zafer Aljajea beats Caleb Montaniel by UD
Each guys raise their hands, Montaniel wearing blue shorts but Aljajea within the blue corner wins the bout, 30-27 from one judge 29-28 from the opposite two. Decent little fight, they will’t all be KOs. Rampage Jackson gets the sting on Shannon Briggs.
Zafer Aljajea vs Caleb Montaniel up next
Charleston White has arrived to commentate while Rampage heads off to corner. Or so we thought, he stays on commentary.
ANTONIO WILLIAMS KNOCKS OUT EDGAR GARCIA DE LEON IN ROUND TWO
WOW! Massive left hand on the buzzer, right as Teofimo Lopez arrives to support him. Bang by name, bang by nature! Two knockouts in a row, that was absolutely brutal!
Adin Ross declares his next event will probably be free
Next card will probably be in Miami, he’s been forced by town of Miami to place an event in a venue but he insists it’s going to be free for fans to attend.
Adin Ross gives his production team instructions again
He’s relaying the messages from the chat to the truck, pleading with them to point out higher highlights. Now he’s demaning the ring announcement goes quicker.
OJ ROSE KNOCKS OUT ANDY SAVAGE IN ROUND 3!
Just seconds after Rampage Jackson branded these two ‘pillow hands’, OJ Rose catches Andy Savage with a wonderful hook that sends him to the deck. He continues the pressure and the referee steps in to stop it shortly later. Adult film stars 0-1 to start out the night…
Adin Ross speaks to the production live
Among the best things about Brand Risk is the comical nature of it. Adin just speaks to the truck survive the air, Rampage is dropping crude terms, it’s old skool influencer boxing!
Andy Savage vs OJ Rose kicks off
Adult film stars throughout this card as Savage makes the walk first. OJ Rose wearing his Misfits Boxing gear – dangerous when Adinjust said he needs a win to be invited back.
Finally the event is underway
After over an hour waiting, the printed has begun. Adin Ross joined by Ramage Jackson on commentary!
Lena The Plug will probably be within the ring tonight!
Adam22’s wife will probably be within the ring during Jason Luv grudge fight in bizarre latest twist

Lena The Plug will play a key role at the following Brand Risk Promotions show. The adult film star’s husband, Adam22, will fight within the…
Rampage Jackson and Shannon Briggs do battle by proxy tonight
At some point, these two will fight.
Card delayed
We were resulting from kick off at 7pm Eastern, Adin Ross’ channel has yet to go live. First fight will probably be OJ Rose vs Andy Savage.
Brand Risk Promotions 12 – Full card survive Adin Ross’ Kick
This fight is free to look at over on Adin Ross’ Kick stream, no sign up obligatory!
Aaron The Plumber vs KMAC is NOT HAPPENING resulting from an Aaron injury.
Join the conversation on Talking Points
Be certain to enroll above to Talking Points and join over 10,000 of our readers in discussing the fights!
Welcome to the Brand Risk Promotions: Adam22 vs Jason Luv live blog
Good evening and welcome to the Bloody Elbow live blog. My name is Donagh Corby and I will probably be keeping you up so far with all the things happening tonight as Brand Risk Promotions returns with some of the anticipated celebrity boxing matches of all time.
const postId = 287454;
let modifiedDate = “2026-01-24T02:37:31+00:00”;
// creates a timestamp cachebuster rounded to nearest 30 seconds threshold
function getLiveBlogCacheBusterTimestamp() {
const now = latest Date();
// Get current UTC time components
const minutes = now.getUTCMinutes();
const seconds = now.getUTCSeconds();
// Round as much as the closest 30 seconds
const roundedSeconds = Math.ceil(seconds / 30) * 30;
// Adjust minutes and seconds
let roundedDate = latest Date(Date.UTC(
now.getUTCFullYear(),
now.getUTCMonth(),
now.getUTCDate(),
now.getUTCHours(),
minutes,
roundedSeconds
));
// Convert to Unix timestamp
return Math.floor(roundedDate.getTime() / 1000);
}
function getPollingEndpointUrl(postId) {
const baseUrl = “/wp-json/grv-live-blog/v1/post-modified-date”;
const cacheBuster = getLiveBlogCacheBusterTimestamp();
return `${baseUrl}?post_id=${postId}&t=${encodeURIComponent(cacheBuster)}`;
}
function getUpdatedEventEndpointUrl(postId) {
const baseUrl = “/wp-json/grv-live-blog/v1/get-updated-events”;
const cacheBuster = getLiveBlogCacheBusterTimestamp();
return `${baseUrl}?post_id=${postId}&t=${encodeURIComponent(cacheBuster)}`;
}
function showRefreshButton() {
const refresh_btn = document.getElementById(“glb-btn”);
refresh_btn.style.display = “block”;
}
function hideRefreshButton() {
const refresh_btn = document.getElementById(“glb-btn”);
refresh_btn.style.display = “none”;
}
function jumpToLatestEvent() {
hideRefreshButton();
const element = document.querySelector(“.wp-block-grvmedia-grv-live-blog”);
// Scroll to the element
if (element) {
element.scrollIntoView({ behavior: “smooth”, block: “start” });
}
}
function createPointItem(item) {
// Create the
const li = document.createElement(“li”);
li.appendChild(document.createTextNode(item.headline));
const a = document.createElement(“a”);
a.href = `#${item.anchorId}`; // Set the href attribute
a.innerHTML = `View post
`; // Set the text content
li.appendChild(a);
return li;
}
function addScriptSrcToHead(src) {
let s = document.createElement(“script”);
// expectation is that that is the primary script element in the top
let insertion = document.getElementsByTagName(“script”)[0];
s.async = true;
s.src = src;
insertion.parentNode.insertBefore(s, insertion);
}
function refreshScripts( fragment ) {
let scripts = fragment.querySelectorAll(“script”);
for ( let script of scripts ) {
let freshScript = document.createElement(“script”);
// copy attributes
let attrs = script.attributes;
for ( let attr of attrs ) {
freshScript.setAttribute( attr.name, attr.value );
}
// copy inner script code. #718, #782
freshScript.innerHTML = script.innerHTML;
script.parentNode.replaceChild( freshScript, script );
}
}
function reverseEvents(updated_events){
const events = Object.entries(updated_events);
// Reverse the order of the entries
events.reverse();
// Convert the reversed entries back to an object
return Object.fromEntries(events);
}
function fetchUpdatedEvents() {
const apiUrl = getUpdatedEventEndpointUrl(postId);
fetch(apiUrl)
.then(response => response.json())
.then(updatedEvents => {
// Find the events container
let key_points = document.querySelector(“.grv-live-blog-key-points”);
// if we had no key points to start out with but have some now we’d like to create the div and ul
// for it to populate
if(updatedEvents.key_points.length > 0) {
if (!key_points) {
// Element doesn’t exist, create it
key_points = document.createElement(“div”);
key_points.className = “grv-live-blog-key-points”;
// Create and append
to the brand new element
const heading = document.createElement(“h5”);
heading.textContent = “Key points”;
key_points.appendChild(heading);
// Create and append
- to the brand new element
const ul = document.createElement(“ul”);
ul.className = “grv-live-blog-key-points-list”;
key_points.appendChild(ul);
const glb_wrapper = document.getElementById(“glb-wrapper”);
if (glb_wrapper) {
// Insert the brand new element before the wrapper
glb_wrapper.parentNode.insertBefore(key_points, glb_wrapper);
}
}
const key_points_list = document.querySelector(“.grv-live-blog-key-points-list”);
key_points_list.innerHTML = “”;
// Update the important thing points
updatedEvents.key_points.forEach(point => {
const point_item = createPointItem(point);
key_points_list.appendChild(point_item);
});
// else now we have no key points so lets remove the list
}else{
if (key_points) {
key_points.remove();
}
}
// now take care of the events themselves…
const events_container = document.querySelector(“.wp-block-grvmedia-grv-live-blog”);
// get a map of the present events keyed by id
const existingEvents = Array.from(events_container.querySelectorAll(“.wp-block-grvmedia-grv-live-blog-event”))
.reduce((map, event) => {
map[event.id] = event;
return map;
}, {});
// get the present and updated keys so we are able to compare
const existingKeys = Object.keys(existingEvents);
const updatedKeys = Object.keys(updatedEvents.updated_blocks);
// find events which might be in existing but not in updated
const keysToRemove = existingKeys.filter(key => !updatedKeys.includes(key));
// remove any events which were deleted
keysToRemove.forEach(key => {
// Find the element with the corresponding id
const element = document.getElementById(key);
// Remove the element if it exists
if (element) {
element.remove();
}
});
// reverse the events in order that they are in the suitable order if we add multiple…
updatedEvents.updated_blocks = reverseEvents(updatedEvents.updated_blocks);
// loop through each updated event
Object.values(updatedEvents.updated_blocks).forEach(updatedEvent => {
// create temp elem so we are able to hydrate it from our rendered event after which access the id etc
const parser = latest DOMParser();
const tempEvent = parser.parseFromString(updatedEvent,”text/html”);
// Select the event from our temp container
const eventElement = tempEvent.querySelector(“.wp-block-grvmedia-grv-live-blog-event”);
// Extract the id
const eventId = eventElement ? eventElement.id : null;
// Using a fraction allows us to refresh scripts before attaching to dom
let frag = document.createDocumentFragment();
if (existingEvents[eventId]) {
frag.append( …eventElement.childNodes );
} else {
frag.append( eventElement );
}
refreshScripts( frag );
// if its an existing event replace the content of the event so we dont cause a jump
if (existingEvents[eventId]) {
// get the present event
const event = document.getElementById(eventId);
event.style.minHeight = event.offsetHeight + “px”;
// update its innerHTML and sophistication incase now we have modified to featured or breaking etc
event.className = eventElement.className;
event.replaceChildren(…frag.childNodes);
const seeMore = event.querySelector(“.see-more-wrapper.lazy”);
let seeMoreSrc = seeMore?.getAttribute(“data-src”);
if (seeMoreSrc) {
if ( seeMoreSrc.indexOf(‘instagram’) != -1 && window.instgrm ) {
window.instgrm.Embeds?.process();
} else {
addScriptSrcToHead(seeMoreSrc);
}
}
// if its a brand new event add to the highest – TODO: sort order if multiple latest events
} else {
// Create a brand new event
events_container.insertBefore(frag, events_container.firstChild);
}
});
})
.catch(error => {
console.error(“Error fetching updated blocks:”, error);
});
}
document.addEventListener(“DOMContentLoaded”, function() {
function startPolling(postId) {
function fetchPostModifiedDate() {
const url = getPollingEndpointUrl(postId);
fetch(url)
.then(response => response.json())
.then(data => {
// if our post modified date has modified now we have an update
if(modifiedDate != data.modified_date) {
// update the modified time to be the brand new modified time
modifiedDate = data.modified_date;
// show the button so a user can refresh
fetchUpdatedEvents();
showRefreshButton();
}
})
.catch(error => {
console.error(“Error fetching post modified date:”, error);
});
}
// Set interval to fetch every 30 seconds
setInterval(fetchPostModifiedDate, 30000); // 30 seconds
}
// Start polling
startPolling(postId);
const refreshButton = document.getElementById(“glb-btn”);
refreshButton.addEventListener(“click”, jumpToLatestEvent);
});


Join the talk; share your insight. Use the comment button on the underside left to have your say