91³Ô¹ÏÍø

Watch CBS News

Michigan's 29th tornado in 2025 confirmed in Macomb County

The National Weather Service confirmed that an EF-0 tornado touched down in Macomb County during severe weather on Wednesday. It is Michigan's 29th confirmed tornado in 2025.

Officials say the tornado landed near 14 Mile Road. 

NWS says the tornado started north of Masonic Boulevard and east of Utica Road and Garfield Road near General Street before moving north, crossing 14 Mile and affecting 15 to 20 homes, causing shingles to be blown off roofs. Officials say most of the damage was contained in this neighborhood, with a lot of tree damage and one house losing a section of its roof. 

The tornado continued north, crossing 15 Mile Road, causing additional tree damage before dissipating south of Metro Parkway. NWS says the tornado was 400 yards wide and 2.36 miles in length, lasting roughly eight minutes. 

In Fraser, police say the storm caused "a significant amount of downed trees and branches, as well as downed power and communication lines, and moderate flooding." 

"The Fraser Department of Public Safety, Department of Public Works, and DTE are actively working to mitigate the damage and restore the area back to normal. There is no reported injuries during this event," police . "The Fraser DPS along with the Fraser DPW thanks all Fraser residents and business owners who have volunteered their help during this emergency. Please show patience during this time as DTE is actively working to restore power in the area."

Residents in Fraser say they are now evaluating the damage.

"I mean it was huge around and it started sucking in leaves and branches and it was like slow motion. It was so scary I started screaming like get the dogs, like phones, let's go to the basement now," said Katrina Irwin. "Branches and trees down on houses and powerlines, I mean it's horrible over there."

"Told the kids yeah we don't have to worry about that, we're in Michigan, we don't really have tornadoes and all that, and ya know now it hits our street so now I can't really tell them that anymore," said Cody Potyczka.

This year's number of confirmed tornadoes is now the sixth-highest, tied with the 29 tornadoes confirmed in 1991. So far, 1974 holds the top spot with 39 confirmed tornadoes, followed by 2001 with 35 confirmed tornadoes, according to CBS News Detroit's NEXT Weather team. 

A tornado warning was issued in parts of Macomb County at 1:12 p.m. Wednesday It was lifted about 12 minutes later. Officials detected a severe thunderstorm over Royal Oak, near Troy, and it moved northeast. A flash flood warning was also issued in the county until 4:45 p.m. 

The West Bloomfield Township police reported flooding on northbound Orchard Lake at Pontiac Trail. Chesterfield Township Police Department reported that the Macomb County Road Commission closed Gratiot Avenue from 23 Mile Road north to the Home Depot entrance because of flooding.

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=fd53910ecf4604072044ab7c46d9b028'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });