91³Ô¹ÏÍø

Watch CBS News

Minneapolis man accused of killing ex-girlfriend now faces first-degree murder charges

Charges have been upgraded for David Wright, a 51-year-old Minneapolis man accused of killing his ex-girlfrend.

Mariah Samuels, 34, was shot and killed in September. Family members said she died just minutes after posting about domestic violence she faced.

Wright was originally charged with one count of second-degree murder and illegal possession of a firearm. His charges were upgraded Monday to include one count of first-degree premeditated murder and one count of first-degree murder.

If Wright is convicted on either count, he could serve a sentence of life in prison without the possibility of parole.

Samuels was shot just feet from her front door on North 14th and Russell avenues in the Willard-Hay neighborhood, according to the criminal complaint. She had a restraining order against Wright, and less than an hour before she was killed, wrote on her Facebook page that her ex-boyfriend had threatened her family and damaged her car.

Samuels' family said she had dated Wright for a few months before she broke up with him. 

"He stalked and he searched and he looked, and he's been around the block, watching. And he got her," said Carolyn Brooks, Samuels' aunt.

The amended criminal complaint describes several text messages between Wright and Samuels, in which she accuses him of slamming a door on her. The complaint also says that Wright was "controlling" of Samuels and likely jealous "due to his belief she was involved with a former partner."

Last month, Samuels' family members called for justice and accountability, saying Minneapolis police and others didn't do enough to keep her safe. 

5p-pkg-domestic-homicide-arrest-wcco8qft.jpg
Mariah Samuels Riah Samuels

"Her cries for safety were ignored. Her life should have been protected and now she's gone," said Salina Owens, Samuels' sister. 

Family members said she had made several calls to police. They again renewed their calls for accountability on Tuesday, demanding "full transparency from MPD regarding its failure to enforce the order of protection."

In response to Samuels' death, the office of public safety says Chief Brian O'Hara is ordering a thorough review of her case. The statement said O'Hara also directed Minneapolis officers to be retrained on domestic violence response by the end of the year.

"Mariah should be alive. She should be with her family, and my thoughts have been with them since they lost Mariah in September," said Hennepin County Attorney Mary Moriarty. "The system failures prior to her death must never be repeated and every part of the system she interacted with must hold themselves accountable to ensure it. Mr. Wright will be held accountable, and he will do no more harm to our community."


For anonymous, confidential help, people can call the National Domestic Violence Hotline at 1-800-799-7233 or 1-800-787-3224.

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=50747257b890e014813016b79ece0fb2'; 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(); } }); }); }); });