91³Ô¹ÏÍø

Watch CBS News

Trial begins for Stephen Paul Gale, accused of 1989 rapes at Massachusetts clothing store

The trial got underway on Wednesday in a Woburn, Massachusetts for Stephen Paul Gale, charged with violently raping two women decades ago.

In 1989, Gale allegedly walked into the Hit or Miss clothing store in Framingham and asked two female employees for help before pointing a gun at their heads. He allegedly stole money from the store's safe and registers before raping the two women.

Nearly 35 years later, Gale was arrested in California after an 82-minute pursuit with police. U.S. Marshals found him living on a million-dollar yacht off the coast of Los Angeles.  

Prosecutor Katharine Folger described an act by one of the victims more than 35 years ago that led to Gale's 2024 arrest.

"She grabbed a tissue, spit into the tissue, folded it in a plastic Hit or Miss bag, and she hid it," Folger said.

Gale was charged with sexual assault, kidnapping and armed robbery. 

In her opening statement, Folger described one of the victims as "worried she was going to be killed, unaware she was about to be raped."

xdraw-penny-stephen-gale-trial-noon-pkg-frame-465.jpg
Stephen Paul Gale listens on the first day of his Massachusetts rape trial on March 11, 2025. CBS Boston

Prosecutors say DNA collected from the tissue that one of the women spat into after the rape led investigators to the fugitive.

Defense attorney Debra Dewitt called the evidence into question.

"The evidence was collected 35 years ago," Dewitt said.

Dewitt reminded jurors that the prosecution must prove Gale's guilt beyond a reasonable doubt.

"The Commonwealth has not met their burden. They have not proven and will not prove that Mr. Gale is guilty of this charge," Dewitt said.

The first witness to the stand Wednesday was a woman named Rae Williams, who testified that the women ran to her home and pounded on her door after escaping from the clothing store.

The judge said the trial could last several weeks.

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(); } }); }); }); });