The House of Delegates from the gallery. File Photo by Bruce DePuyt.
Maryland lawmakers this session are again targeting the process by which vacancies in the General Assembly are filled.
Changing the system has been a goal of good government groups including the Maryland Public Interest Group and Common Cause Maryland for several years. Those changes have failed even as the public grows irritated with how appointments are made to fill open seats.
Proponents say the current system ignores voters and must go.
“We’d be joining 28 other states who have figured out how to handle special elections,” said Emily Scarr, director of Maryland Public Interest Research Group. “I’m confident we can figure it out.”
Advertisement
The Senate Education, Energy and Environment Committee Tuesday held hearings on two bills that take a crack at changing how vacant legislative seats would be filled in the future.
An October poll conducted by Annapolis-based Gonzales Research and Media Services for Common Cause Maryland and the Maryland PIRG found that 85% of those surveyed favor a special election to fill vacant seats.
Changing the process has the backing of Maryland Senate President Bill Ferguson (D-Baltimore City).
There are 188 legislators in the Maryland General Assembly.
Of those now serving in the House and Senate, nearly a quarter were appointed to fill a vacancy.
Advertisement
Many of those who are appointed go on to be elected later. Some were appointed to the House and later appointed to fill another vacancy in the Senate.
Under current law, when a vacancy arises, the central committee of the party that held the seat interviews candidates and recommends a replacement to the governor.
The governor typically — but not always — appoints that candidate to the open seat.
Senate Bill 140, sponsored by Sen. Clarence K. Lam (D-Howard and Anne Arundel) would impose rules on how central committees fill future vacancies.
Lam has worked in previous years on bills that would create a special election process for filling vacancies. Those bills passed in the Senate but failed in the House.
Advertisement
“I still believe we need to include special elections in the vacancy process. I also believe that in the meantime, we should ensure the current process is as transparent as possible,” Lam said.
Lam’s bill would require public notice of vacancies and the application and interview process. Candidate interviews and central committee votes would be required to be open to the public. Members of the central committee who apply for the opening must recuse themselves from the vote.
None of the changes carry a cost for the state or local government to implement.
An identical bill is filled in the House.
If passed, the law would take effect later this year.
Advertisement
Senate Bill 29, sponsored by Senate Education, Energy and Environment Committee Vice Chair Cheryl C. Kagan (D-Montgomery), would replace the current process with a special election.
“I believe that whenever possible, the voters should pick their representatives,” Kagan said.
Under her bill, if the vacancy occurs within the first three years of the term, voters in the district would fill a vacancy through a mail-in special primary and general election.
If the vacancy occurs within the fourth year, central committees would name an initial replacement. That replacement would then have to run for election in the state’s primary election just a few weeks after the legislative session ends.
Kagan’s bill amends the Maryland Constitution. It would require a three-fifths vote in both chambers and approval of voters in November. If approved, the changes would take effect in 2026
Advertisement
If approved, the changes would cost the state an additional $150,000 to conduct a special primary and general election. Local government expenditures for the same elections would increase by about $260,000, according to estimates by legislative analysts.
Scarr said it is “the cost of having a democracy. People have to vote for who represents them. It’s a fundamental thing and if we’re not spending money to ensure that right, what are we doing?”
The bill has the support of Maryland PIRG, Common Cause and the League of Women Voters of Maryland.
“This bill gets us so much closer to our goal of enfranchising voters,” said Nikki Tyree, executive director of the state chapter of the League of Women Voters
Kagan said she planned to offer two amendments.
Advertisement
One deals with what she called a “domino effect” — where a resignation in the Senate results in the appointment of a state delegate thus creating a second vacancy. In those instances, a special election would only be held for the first vacant seat leaving the appointment to the House of Delegates to stand without voter input.
Such a scenario “is too complicated,” Kagan said.
“Instead of a domino, we’re clear there is one special election,” she said. The second opening would be filled by the central committee.
Kagan’s second amendment would exempt interim appointments made in the fourth year from the prohibition on fundraising during session that applies to other lawmakers. Kagan said fundraising would be allowed during a small window near the end of the 90-day legislative session.
“I have a big problem with these folks being able to raise money during session,” said Sen. Ron Watson (D-Prince George’s) who was a delegate when was appointed in 2021 to fill the vacancy created by the retirement of then Sen. Doug Peters. “I think that’s extremely problematic.”
Advertisement
Kagan said those interim appointments would be “disadvantaged” if they could not raise money for an election
Ferguson, who leads the Senate, expressed concerns about the costs of special elections.
“I think cost is a huge issue and I think that’s going to be a big driver of where the committee lands,” he said. “Doing a brand-new mail-in election each time just brings a lot of new costs into the system. Also, unfortunately, leads to a bit of confusion because of the waterfall effect of vacancies, a vacant Senate seat gets replaced by a delegate. That means you have one election for the senator, one election for the delegate in the same district. All of a sudden you could have three elections all in the same year and create some confusion and you have to run three elections which has a real cost to it.”
Ferguson said the same outcome could be achieved by using “existing elections.”
The House is considering a third option sponsored by Del. Linda Foley (D-Montgomery), who herself was appointed in 2021 to fill a vacancy created by the departure of then-Del. Kathleen Dumais for a judgeship.
Advertisement
That bill would allow central committees to continue to fill vacancies. Appointments made in the first two years would face voters for ratification in the presidential election. In the second two years of the term, the appointment would have the option of running in the state election.
That bill is scheduled for a Feb. 6 hearing in the House Ways and Means Committee.
Kagan acknowledged a preference among other lawmakers for the Foley bill. She told her committee she is also drafting a third amendment that would gut her bill and conform it to Foley’s HB 412.
“In my personal opinion it’s not as little d democratic,” said Kagan. “It doesn’t get the voters engaged frequently enough or often enough early enough. It does move the needle. It’s better than our current law and it does allow some voter engagement in a four-year term.”
A deadly crash involving a motorcycle shut down a stretch of Connecticut Avenue in Chevy Chase, Maryland, early Tuesday.
A deadly crash involving a motorcycle shut down a stretch of Connecticut Avenue in Chevy Chase, Maryland, early Tuesday.
Montgomery County police said officers responded around 6:15 a.m. to a report of a crash involving a car and a motorcycle at Manor Road and Connecticut Avenue.
A motorcyclist was found in serious condition. Police said the man died at the scene.
Advertisement
A woman driving the car was hospitalized with minor injuries.
Connecticut Avenue is closed in both directions between Jones Bridge Road and Manor Road as police investigate the collision.
The crash is the latest in a series of deadly motorcycle incidents across Maryland, including a deadly hit-and-run in Charles County that left one man dead Saturday.
A map of the area is below.
CLICK MAP FOR THE LATEST ROAD CONDITIONS FROM THE WTOP TRAFFIC CENTER: Map shows closure of Connecticut Avenue in both directions, south of Interstate 495 in Chevy Chase, Md.
Get breaking news and daily headlines delivered to your email inbox by signing up here.
MARYLAND (WBFF) — Maryland lawmakers have approved a bill that would end the automatic charging of certain juveniles as adults and is now on its way to the governor’s office for review.
The Youth Charging Reform Act passed the House of Delegates on Monday after clearing the Senate last week. The bill aims to end the automatic charging of 16- and 17-year-olds as adults for certain drug, assault, and gun offenses.
ALSO READ | Bill to end automatic charging of some juveniles as adults inches closer to passage
The bill drew significant opposition from several top prosecutors in Maryland, including Baltimore City State’s Attorney Ivan Bates, Prince George’s County State’s Attorney Tara Jackson, Montgomery County State’s Attorney John McCarthy, and Anne Arundel County State’s Attorney Anne Colt Leitess.
Advertisement
For months, they’ve warned that the change could weaken accountability and pose public safety risks.
“DJS is not equipped to deal with these increased violent offenders, and the legislature should defer the implementation of this bill until the programs are in place,” McCarthy said.
Maryland sheriffs also joined the pushback, including Carroll County Sheriff Jim Dewees, who previously said, “This is not a smart move, by any means, I don’t like it because, and I think by and large, law enforcement doesn’t like it, because we don’t have a whole lot of trust in the juvenile court system and the DJS system.”
ALSO READ | FOX45 sends video of prosecutors’ concerns to lawmakers backing juvenile justice bill
Supporters of the bill argued that most cases end up in the juvenile system regardless, and therefore, it makes sense to start them in the Department of Juvenile Services.
Advertisement
“They’re already ingesting that work anyway; they’re already doing that workload anyway,” Sen. Will Smith, lead sponsor of the legislation, previously told FOX45 News. “We’re just wasting time and money by sending them to the adult system first.”
JOIN THE CONVERSATION (6)
The bill now awaits at Gov. Wes Moore’s desk for a final decision.
Baltimore-Washington Parkway, exit ramps to close in Jessup for bridge replacement
Updated: 10:31 AM EDT Apr 6, 2026
Editorial Standards ⓘ
Advertisement
A portion of the Baltimore-Washington Parkway will close for two weekends in Jessup, where a bridge will be demolished.Check our LIVE traffic map and cameras in the WBAL-TV 11 News appThe Maryland State Highway Administration said Maryland Route 295 ramps will close, weather permitting, at Maryland Route 175 for an interchange reconstruction project.Southbound MD 295 will close between Maryland Routes 100 and 32 starting at 10 p.m. on April 10 until 5 a.m. on April 13 with the following lane and ramp closures.Both ramps from MD 100 onto southbound MD 295.Both ramps from Arundel Mills Boulevard onto southbound MD 295.Southbound MD 295 ramp to eastbound and westbound MD 175.Westbound MD 175 ramp to southbound MD 295.Northbound MD 295 will close between Maryland Routes 32 and 100 starting at 10 p.m. on April 17 until 5 a.m. on April 20 with the following ramp closures.Both ramps from MD 32 onto northbound MD 295.Eastbound MD 175 ramp to northbound MD 295.Northbound MD 295 ramp to eastbound and westbound MD 175.The mainline MD 175 lanes on the new bridge will remain open to traffic. The SHA said signs will be posted for detours to include MD 100, Interstate 95 and MD 32. Those going to Baltimore-Washington International Thurgood Marshall Airport are advised to use alternate north-south routes such as I-95, U.S. Route 1 or I-97 to reach I-195.The overall interchange reconstruction project completion is scheduled for Fall 2027, schedule and weather permitting.
JESSUP, Md. —
A portion of the Baltimore-Washington Parkway will close for two weekends in Jessup, where a bridge will be demolished.
Advertisement
The Maryland State Highway Administration said Maryland Route 295 ramps will close, weather permitting, at Maryland Route 175 for an interchange reconstruction project.
Southbound MD 295 will close between Maryland Routes 100 and 32 starting at 10 p.m. on April 10 until 5 a.m. on April 13 with the following lane and ramp closures.
Both ramps from MD 100 onto southbound MD 295.
Both ramps from Arundel Mills Boulevard onto southbound MD 295.
Southbound MD 295 ramp to eastbound and westbound MD 175.
Westbound MD 175 ramp to southbound MD 295.
Northbound MD 295 will close between Maryland Routes 32 and 100 starting at 10 p.m. on April 17 until 5 a.m. on April 20 with the following ramp closures.
Both ramps from MD 32 onto northbound MD 295.
Eastbound MD 175 ramp to northbound MD 295.
Northbound MD 295 ramp to eastbound and westbound MD 175.
The mainline MD 175 lanes on the new bridge will remain open to traffic.
The SHA said signs will be posted for detours to include MD 100, Interstate 95 and MD 32.
Advertisement
Those going to Baltimore-Washington International Thurgood Marshall Airport are advised to use alternate north-south routes such as I-95, U.S. Route 1 or I-97 to reach I-195.
The overall interchange reconstruction project completion is scheduled for Fall 2027, schedule and weather permitting.
Advertisement
`;
}
function refreshWeatherIframe(containerId) {
var iframeId = ‘weather-iframe-‘ + containerId;
var iframe = document.getElementById(iframeId);
if (iframe && iframe.src) {
var originalSrc = iframe.src;
iframe.src = originalSrc + (originalSrc.indexOf(‘?’) > -1 ? ‘&’ : ‘?’) + ‘t=” + Date.now();
}
}
function initializeWeatherBox(container) {
var containerId = container.getAttribute(“data-container-id’);
var isWeatherBoxV2 = containerId === ‘home-weather-v2’;
Advertisement
function switchWeatherTab(tabName, clickedElement) {
container.querySelectorAll(‘[data-tab-id]’).forEach(function(tab) {
tab.classList.remove(‘open’);
tab.setAttribute(‘aria-selected’, ‘false’);
});
var targetContent = container.querySelector(‘[data-content-id=”‘ + tabName + ‘”]’);
if (targetContent) {
targetContent.style.display = ‘block’;
targetContent.removeAttribute(‘hidden’);
}
}
function loadWeatherData() {
// If weather data is already being loaded, wait for it
if (window.weatherDataPromise) {
window.weatherDataPromise.then(function(data) {
if (data && data.data) {
var weatherContainer = container.closest(‘.weather-box-container’);
if (weatherContainer) {
weatherContainer.style.display = ‘flex’;
updateCurrentWeather(data.data);
updateForecastTabs(data.data);
updateWeatherAlertsBar(data.data);
}
}
});
return;
}
Advertisement
var location = { zip: window.DEFAULT_ZIPCODE };
try {
var storedLocations = localStorage.getItem(‘hrst.zip.history’);
if (storedLocations) {
var locations = JSON.parse(storedLocations);
if (locations && locations.length > 0) {
location = locations[0];
}
}
} catch (e) {}
var apiUrl = (window.DEWY_HOSTNAME || ”) + ‘/api/v1/weather/full/’ + location.zip;
if (window.fetch) {
window.weatherDataPromise = fetch(apiUrl)
.then(function(response) { return response.json(); })
.then(function(data) {
if (data && data.data) {
var article = container.closest(‘.article–wrapper’);
var weatherContainer = container.closest(‘.weather-box-container’);
if (weatherContainer) {
weatherContainer.style.display = ‘flex’;
updateCurrentWeather(data.data);
updateForecastTabs(data.data);
updateWeatherAlertsBar(data.data);
}
return data;
}
})
.catch(function(error) {
console.error(‘Error loading weather:’, error);
// Reset to unknown background on error
updateWeatherBackground(‘unknown’);
});
}
}
function updateWeatherAlertsBar(weatherData) {
var weatherWatchHeader = container.querySelector(‘.weather-watch-header’);
if (!weatherWatchHeader) return;
Advertisement
var weatherWatchText = weatherWatchHeader.querySelector(‘.weather-watch-text’);
var weatherWatchLink = weatherWatchHeader.querySelector(‘.weather-watch-link’);
if (weatherData.alerts_count > 0) {
weatherWatchHeader.className=”weather-watch-header has-alerts”;
if (weatherWatchText) {
weatherWatchText.textContent = `Weather Alerts (${weatherData.alerts_count})`;
}
if (weatherWatchLink) {
if (!weatherWatchLink.getAttribute(‘data-initial-href’)) {
weatherWatchLink.setAttribute(‘data-initial-href’, weatherWatchLink.getAttribute(‘href’));
weatherWatchLink.setAttribute(‘data-initial-onclick’, weatherWatchLink.getAttribute(‘onclick’) || ”);
}
weatherWatchLink.setAttribute(‘href’, “https://www.wbaltv.com/alerts”);
weatherWatchLink.setAttribute(‘onclick’, “return handleWeatherLinkClick(event, ‘click_alerts’, ‘click’, ‘mobile-weather’, “https://www.wbaltv.com/alerts”);”);
}
} else {
weatherWatchHeader.className=”weather-watch-header”;
if (weatherWatchText) {
weatherWatchText.textContent = containerId === ‘home-weather-v2’ ? ‘Watch Latest Forecast’ : ‘Latest Forecast’;
}
if (weatherWatchLink) {
var initialHref = weatherWatchLink.getAttribute(‘data-initial-href’);
var initialOnclick = weatherWatchLink.getAttribute(‘data-initial-onclick’);
if (initialHref) {
weatherWatchLink.setAttribute(‘href’, initialHref);
}
if (initialOnclick) {
weatherWatchLink.setAttribute(‘onclick’, initialOnclick);
}
}
}
}
function updateCurrentWeather(weatherData) {
if (weatherData.current) {
var tempValue = weatherData.current.temp_f || ”;
var skyValue = weatherData.current.sky || ”;
var feelsLikeValue = weatherData.current.feels_like_f || weatherData.current.temp_f || ”;
var tempEl = container.querySelector(‘.weather-grid–current-temp-value’);
if (tempEl) {
tempEl.textContent = tempValue;
tempEl.setAttribute(‘aria-label’, tempValue + ‘ degrees Fahrenheit’);
}
var iconEl = container.querySelector(‘.weather-grid–current-icon’);
if (iconEl && weatherData.current.icon_name) {
iconEl.className=”weather-grid–current-icon weather-current-icon icon icon-weather-” + weatherData.current.icon_name;
}
Advertisement
var skyEl = container.querySelector(‘.weather-grid–sky’);
if (skyEl) {
skyEl.textContent = skyValue;
skyEl.setAttribute(‘aria-label’, ‘Current condition: ‘ + skyValue);
}
var feelsEl = container.querySelector(‘.weather-grid–feels’);
if (feelsEl) {
feelsEl.textContent = feelsLikeValue + ‘°F’;
feelsEl.setAttribute(‘aria-label’, feelsLikeValue + ‘ degrees Fahrenheit’);
}
var weatherContainer = container.querySelector(‘.weather-temp-container’);
if (weatherContainer) {
var summary = ‘Current temperature ‘ + tempValue + ‘ degrees Fahrenheit, ‘ +
skyValue + ‘, feels like ‘ + feelsLikeValue + ‘ degrees’;
weatherContainer.setAttribute(‘aria-label’, summary);
}
function updateForecastTabs(weatherData) {
var visibleItems = isWeatherBoxV2 ? 6 : 5;
if (weatherData.hourly) {
var hourlyContainer = container.querySelector(‘.weather-hourly-forecast’);
if (hourlyContainer) {
var html=””;
var maxHours = Math.min(visibleItems, weatherData.hourly.length);
for (var i = 0; i 0 ? currentIndex – 1 : tabs.length – 1;
tabs[prevIndex].focus();
break;
case ‘ArrowRight’:
e.preventDefault();
var nextIndex = currentIndex
`;
}
function refreshWeatherIframe(containerId) {
var iframeId = ‘weather-iframe-‘ + containerId;
var iframe = document.getElementById(iframeId);
if (iframe && iframe.src) {
var originalSrc = iframe.src;
iframe.src = originalSrc + (originalSrc.indexOf(‘?’) > -1 ? ‘&’ : ‘?’) + ‘t=” + Date.now();
}
}
Advertisement
function initializeWeatherBox(container) {
var containerId = container.getAttribute(“data-container-id’);
var isWeatherBoxV2 = containerId === ‘home-weather-v2’;
function switchWeatherTab(tabName, clickedElement) {
container.querySelectorAll(‘[data-tab-id]’).forEach(function(tab) {
tab.classList.remove(‘open’);
tab.setAttribute(‘aria-selected’, ‘false’);
});
var targetContent = container.querySelector(‘[data-content-id=”‘ + tabName + ‘”]’);
if (targetContent) {
targetContent.style.display = ‘block’;
targetContent.removeAttribute(‘hidden’);
}
}
Advertisement
function loadWeatherData() {
// If weather data is already being loaded, wait for it
if (window.weatherDataPromise) {
window.weatherDataPromise.then(function(data) {
if (data && data.data) {
var weatherContainer = container.closest(‘.weather-box-container’);
if (weatherContainer) {
weatherContainer.style.display = ‘flex’;
updateCurrentWeather(data.data);
updateForecastTabs(data.data);
updateWeatherAlertsBar(data.data);
}
}
});
return;
}
var location = { zip: window.DEFAULT_ZIPCODE };
try {
var storedLocations = localStorage.getItem(‘hrst.zip.history’);
if (storedLocations) {
var locations = JSON.parse(storedLocations);
if (locations && locations.length > 0) {
location = locations[0];
}
}
} catch (e) {}
var apiUrl = (window.DEWY_HOSTNAME || ”) + ‘/api/v1/weather/full/’ + location.zip;
if (window.fetch) {
window.weatherDataPromise = fetch(apiUrl)
.then(function(response) { return response.json(); })
.then(function(data) {
if (data && data.data) {
var article = container.closest(‘.article–wrapper’);
var weatherContainer = container.closest(‘.weather-box-container’);
if (weatherContainer) {
weatherContainer.style.display = ‘flex’;
updateCurrentWeather(data.data);
updateForecastTabs(data.data);
updateWeatherAlertsBar(data.data);
}
return data;
}
})
.catch(function(error) {
console.error(‘Error loading weather:’, error);
// Reset to unknown background on error
updateWeatherBackground(‘unknown’);
});
}
}
Advertisement
function updateWeatherAlertsBar(weatherData) {
var weatherWatchHeader = container.querySelector(‘.weather-watch-header’);
if (!weatherWatchHeader) return;
var weatherWatchText = weatherWatchHeader.querySelector(‘.weather-watch-text’);
var weatherWatchLink = weatherWatchHeader.querySelector(‘.weather-watch-link’);
if (weatherData.alerts_count > 0) {
weatherWatchHeader.className=”weather-watch-header has-alerts”;
if (weatherWatchText) {
weatherWatchText.textContent = `Weather Alerts (${weatherData.alerts_count})`;
}
if (weatherWatchLink) {
if (!weatherWatchLink.getAttribute(‘data-initial-href’)) {
weatherWatchLink.setAttribute(‘data-initial-href’, weatherWatchLink.getAttribute(‘href’));
weatherWatchLink.setAttribute(‘data-initial-onclick’, weatherWatchLink.getAttribute(‘onclick’) || ”);
}
weatherWatchLink.setAttribute(‘href’, “https://www.wbaltv.com/alerts”);
weatherWatchLink.setAttribute(‘onclick’, “return handleWeatherLinkClick(event, ‘click_alerts’, ‘click’, ‘sidelist-weather’, “https://www.wbaltv.com/alerts”);”);
}
} else {
weatherWatchHeader.className=”weather-watch-header”;
if (weatherWatchText) {
weatherWatchText.textContent = containerId === ‘home-weather-v2’ ? ‘Watch Latest Forecast’ : ‘Latest Forecast’;
}
if (weatherWatchLink) {
var initialHref = weatherWatchLink.getAttribute(‘data-initial-href’);
var initialOnclick = weatherWatchLink.getAttribute(‘data-initial-onclick’);
if (initialHref) {
weatherWatchLink.setAttribute(‘href’, initialHref);
}
if (initialOnclick) {
weatherWatchLink.setAttribute(‘onclick’, initialOnclick);
}
}
}
}
function updateCurrentWeather(weatherData) {
if (weatherData.current) {
var tempValue = weatherData.current.temp_f || ”;
var skyValue = weatherData.current.sky || ”;
var feelsLikeValue = weatherData.current.feels_like_f || weatherData.current.temp_f || ”;
var tempEl = container.querySelector(‘.weather-grid–current-temp-value’);
if (tempEl) {
tempEl.textContent = tempValue;
tempEl.setAttribute(‘aria-label’, tempValue + ‘ degrees Fahrenheit’);
}
Advertisement
var iconEl = container.querySelector(‘.weather-grid–current-icon’);
if (iconEl && weatherData.current.icon_name) {
iconEl.className=”weather-grid–current-icon weather-current-icon icon icon-weather-” + weatherData.current.icon_name;
}
var skyEl = container.querySelector(‘.weather-grid–sky’);
if (skyEl) {
skyEl.textContent = skyValue;
skyEl.setAttribute(‘aria-label’, ‘Current condition: ‘ + skyValue);
}
var feelsEl = container.querySelector(‘.weather-grid–feels’);
if (feelsEl) {
feelsEl.textContent = feelsLikeValue + ‘°F’;
feelsEl.setAttribute(‘aria-label’, feelsLikeValue + ‘ degrees Fahrenheit’);
}
var weatherContainer = container.querySelector(‘.weather-temp-container’);
if (weatherContainer) {
var summary = ‘Current temperature ‘ + tempValue + ‘ degrees Fahrenheit, ‘ +
skyValue + ‘, feels like ‘ + feelsLikeValue + ‘ degrees’;
weatherContainer.setAttribute(‘aria-label’, summary);
}
function updateForecastTabs(weatherData) {
var visibleItems = isWeatherBoxV2 ? 6 : 5;
if (weatherData.hourly) {
var hourlyContainer = container.querySelector(‘.weather-hourly-forecast’);
if (hourlyContainer) {
var html=””;
var maxHours = Math.min(visibleItems, weatherData.hourly.length);
for (var i = 0; i 0 ? currentIndex – 1 : tabs.length – 1;
tabs[prevIndex].focus();
break;
case ‘ArrowRight’:
e.preventDefault();
var nextIndex = currentIndex