20 pupils killed in bus crash while returning from school tour in eastern Uganda
Listen to article
3 min listen
Audio reading is not supported on this browser.
Ready
Thanks for listening. Continue with a related story, or tap the speaker icon on the next page to listen.
Death toll rises to 24 in Ugandan school bus crash, 23 admitted
Mary Wambui
·
7 hours agoRead nextOpens a fresh page.
The pupils of King David Junior School, Ndejje, were returning from a study tour on Thursday night when the bus they were travelling in reportedly developed a mechanical fault at around 8:00 pm.
The Uganda Police Force has confirmed the death of 20 pupils and an adult following a road crash yesterday evening at Chekwatit Village, Kimawa Parish, Kawowo Sub-county, Kapchorwa District.
The pupils of King David Junior School, Ndejje, were returning from a study tour on Thursday night when the bus they were travelling in reportedly developed a mechanical fault at around 8:00 pm. The driver is said to have lost control before the vehicle crashed.
“We wish to confirm that a total of 21 people, comprising 20 pupils and one adult, have so far been confirmed dead. The crash involved an Isuzu bus, registration number UA 108BQ, belonging to King David Junior School, Ndejje, Makindye Division, Kampala. The driver has not yet been identified,” Michael Kananura of the Directorate of Traffic and Road Safety said.
More To Read
- Death toll rises to 24 in Ugandan school bus crash, 23 admitted
- Uganda suspends school trips after Kapchorwa bus crash kills 20 pupils
- School bus carrying 56 learners involved in accident along Kabarnet–Marigat Road
- Six killed as matatu, trailer collide head-on along Nakuru-Eldoret highway
- Ambasa Coach bus catches fire after collision in Mwingi, Kitui County
- Nyandarua DCI boss John Rioba killed in road accident involving nine vehicles
The police added that several survivors, whose identities are yet to be established, were rushed to Kaserem Health Centre IV, Kapchorwa General Hospital, and Mbale Regional Referral Hospital for treatment.
“Preliminary investigations indicate that the school bus had taken pupils on an educational tour to Sipi Falls in Kapchorwa District. While returning from the tour, the driver reportedly lost control of the vehicle, which veered off the road, struck a large stone along the roadside, and overturned. The crash claimed the lives of one adult male and 20 pupils, while three adult males and several juveniles sustained injuries,” he added.
The bodies of the deceased have been taken to Kapchorwa Mortuary pending identification and postmortem examinations.
Latest Stories
- Legacy Football Academy makes history with Gothia Cup U14 title
- Police arrest fifth suspect in Mombasa Marikiti mob killing
- No new season without clear leadership framework, Premier League clubs warn FKF
- Study says Egypt’s Aswan High Dam accelerated Nile Delta erosion, land subsidence
Police said investigations into the exact cause of the crash are ongoing.
“The Uganda Police Force extends its deepest condolences to the bereaved families, the management of King David Junior School, and all those affected by this tragic incident. We also wish the injured a quick and full recovery,” the UPF added.
Other Topics To Read
Top Stories Today
- The untold struggles of families with sickle cell disease amid lifelong uncertainty
- Police arrest fifth suspect in Mombasa Marikiti mob killing
- No new season without clear leadership framework, Premier League clubs warn FKF
- Study says Egypt’s Aswan High Dam accelerated Nile Delta erosion, land subsidence
- Airstrike kills 25 Al-Shabaab in Hiiraan as four terrorists surrender to Somali forces
- Emmanuel Wanyonyi misses 800m podium finish at London Diamond League
`;
}
return “;
}
function commentActionsMarkup(comment, canComment) {
const likeLabel = comment.liked_by_me ? ‘Liked’ : ‘Like’;
const likeCount = Number(comment.like_count || 0) > 0
? “
: ”;
const likeButton = canComment && comment.status === ‘approved’
? “
: “;
const replyButton = canComment && comment.status === ‘approved’
? “
: ”;
return `
`;
}
function commentMarkup(comment, canComment, isReply = false) {
const pendingBadge = comment.status && comment.status !== ‘approved’
? “
: ”;
const edited = comment.is_edited
? “
: ”;
const repliesHtml = Array.isArray(comment.replies) && comment.replies.length
? `
`
: “;
return `
`;
}
function replyFormMarkup(commentId) {
return `
`;
}
function setNotice(widget, message, type = ‘info’) {
const notice = widget.querySelector(‘[data-role=”notice”]’);
if (!notice) return;
if (!message) {
notice.hidden = true;
notice.textContent = ”;
notice.classList.remove(‘is-error’);
return;
}
notice.hidden = false;
notice.textContent = message;
notice.classList.toggle(‘is-error’, type === ‘error’);
}
function setCount(widget, total) {
const count = widget.querySelector(‘[data-role=”count”]’);
if (!count) return;
const num = Number(total || 0);
count.textContent = num === 1 ? ‘1 comment’ : `${num} comments`;
}
function openReplyBox(widget, commentId) {
widget.querySelectorAll(‘[data-role=”reply-box”]’).forEach(box => {
box.hidden = true;
box.innerHTML = ”;
});
const targetItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (!targetItem) return;
const replyBox = targetItem.querySelector(‘[data-role=”reply-box”]’);
if (!replyBox) return;
replyBox.hidden = false;
replyBox.innerHTML = replyFormMarkup(commentId);
const textarea = replyBox.querySelector(‘textarea’);
if (textarea) textarea.focus();
}
function closeReplyBox(container) {
if (!container) return;
container.hidden = true;
container.innerHTML = ”;
}
async function initCommentsWidget(widget) {
const state = {
articleId: Number(widget.dataset.articleId),
loadUrl: widget.dataset.loadUrl,
storeUrl: widget.dataset.storeUrl,
commentsBaseUrl: widget.dataset.commentsBaseUrl,
canComment: widget.dataset.canComment === ‘1’,
page: 1,
perPage: 10,
sort: ‘newest’,
total: 0,
hasMore: false,
busy: false
};
const list = widget.querySelector(‘[data-role=”list”]’);
const loading = widget.querySelector(‘[data-role=”loading”]’);
const empty = widget.querySelector(‘[data-role=”empty”]’);
const loadMoreBtn = widget.querySelector(‘[data-role=”load-more”]’);
const sortSelect = widget.querySelector(‘[data-role=”sort”]’);
const composerForm = widget.querySelector(‘[data-role=”composer-form”]’);
async function loadComments(reset = true) {
if (state.busy) return;
state.busy = true;
setNotice(widget, ”);
loading.hidden = false;
if (reset) {
state.page = 1;
list.innerHTML = ”;
empty.hidden = true;
}
try {
const url = new URL(state.loadUrl, window.location.origin);
url.searchParams.set(‘page’, state.page);
url.searchParams.set(‘per_page’, state.perPage);
url.searchParams.set(‘sort’, state.sort);
const response = await requestJson(url.toString(), {
method: ‘GET’,
headers: {
‘Accept’: ‘application/json’,
‘X-Requested-With’: ‘XMLHttpRequest’
}
});
const items = Array.isArray(response.data) ? response.data : [];
const meta = response.meta || {};
state.total = Number(meta.total || 0);
state.hasMore = !!meta.has_more;
setCount(widget, state.total);
if (reset) {
list.innerHTML = ”;
}
if (!items.length && reset) {
empty.hidden = false;
} else {
empty.hidden = true;
list.insertAdjacentHTML(
‘beforeend’,
items.map(item => commentMarkup(item, state.canComment, false)).join(”)
);
}
loadMoreBtn.hidden = !state.hasMore;
} catch (error) {
if (!list.children.length) {
empty.hidden = false;
empty.textContent = ‘Unable to load comments right now.’;
}
setNotice(widget, error.message || ‘Unable to load comments.’, ‘error’);
} finally {
loading.hidden = true;
state.busy = false;
}
}
async function submitTopLevelComment(form) {
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘[data-role=”submit-comment”]’);
if (!textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(state.storeUrl, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
textarea.value = ”;
if (response?.data) {
list.insertAdjacentHTML(
‘afterbegin’,
commentMarkup(response.data, state.canComment, false)
);
empty.hidden = true;
if ((response.data.status || ”) === ‘approved’) {
state.total += 1;
setCount(widget, state.total);
}
}
setNotice(widget, response.message || ‘Comment posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post comment.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post comment’;
}
}
}
async function submitReply(form) {
const commentId = Number(form.dataset.commentId || 0);
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘.ev-comments__reply-submit’);
if (!commentId || !textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/reply`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
if (response?.data) {
const parentItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (parentItem) {
const repliesWrap = parentItem.querySelector(‘.ev-comments__replies’);
if (repliesWrap) {
repliesWrap.insertAdjacentHTML(
‘beforeend’,
commentMarkup(response.data, state.canComment, true)
);
}
}
}
closeReplyBox(form.closest(‘[data-role=”reply-box”]’));
setNotice(widget, response.message || ‘Reply posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post reply.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post reply’;
}
}
}
async function toggleLike(button) {
const commentId = Number(button.dataset.commentId || 0);
if (!commentId) return;
const originalHtml = button.innerHTML;
try {
button.disabled = true;
button.innerHTML = ‘Working…’;
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/like`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({})
});
const liked = !!response?.data?.liked;
const likeCount = Number(response?.data?.like_count || 0);
button.classList.toggle(‘is-liked’, liked);
button.innerHTML = `${liked ? ‘Liked’ : ‘Like’} ${likeCount > 0 ? “ : ”}`;
} catch (error) {
button.innerHTML = originalHtml;
setNotice(widget, error.message || ‘Unable to update like.’, ‘error’);
} finally {
button.disabled = false;
}
}
if (composerForm) {
composerForm.addEventListener(‘submit’, function (e) {
e.preventDefault();
submitTopLevelComment(composerForm);
});
}
if (sortSelect) {
sortSelect.addEventListener(‘change’, function () {
state.sort = this.value || ‘newest’;
loadComments(true);
});
}
if (loadMoreBtn) {
loadMoreBtn.addEventListener(‘click’, function () {
if (state.busy || !state.hasMore) return;
state.page += 1;
loadComments(false);
});
}
widget.addEventListener(‘click’, function (e) {
const likeBtn = e.target.closest(‘[data-action=”toggle-like”]’);
if (likeBtn) {
e.preventDefault();
toggleLike(likeBtn);
return;
}
const replyBtn = e.target.closest(‘[data-action=”toggle-reply”]’);
if (replyBtn) {
e.preventDefault();
openReplyBox(widget, Number(replyBtn.dataset.commentId || 0));
return;
}
const cancelReplyBtn = e.target.closest(‘[data-action=”cancel-reply”]’);
if (cancelReplyBtn) {
e.preventDefault();
closeReplyBox(cancelReplyBtn.closest(‘[data-role=”reply-box”]’));
}
});
widget.addEventListener(‘submit’, function (e) {
const replyForm = e.target.closest(‘.ev-comments__reply-form’);
if (replyForm) {
e.preventDefault();
submitReply(replyForm);
}
});
loadComments(true);
}
document.addEventListener(‘DOMContentLoaded’, function () {
document.querySelectorAll(‘.ev-comments’).forEach(initCommentsWidget);
});
})();
Trending
Morocco back Ouahbi until 2030 as Atlas Lions shift focus to home World CupNews
|Erick Kariuki
|1 day ago

Kenya secures Sh43.5 billion AfDB loan for economic inclusion and climate resilienceBusiness
|Alfred Onyango
|5 hours ago
From cotton classics to high-tech icons: The evolution of World Cup-winning jerseysNews
|Erick Kariuki
|10 hours ago
Sifuna vows to press on despite ODM SG removal, Senate shake‑upNews
|Rachael Mutabasi
|5 hours ago

Police arrest fifth suspect in Mombasa Marikiti mob killingCoast
|Farhiya Hussein
|37 minutes ago
The untold struggles of families with sickle cell disease amid lifelong uncertaintyHealth
|Charity Kilei
|3 hours ago
Death toll rises to 24 in Ugandan school bus crash, 23 admittedNews
|Mary Wambui
|7 hours ago
Katiba Institute, Muite demand answers over alleged quarantine of seven Americans at Laikipia Air BaseNews
|Rachael Mutabasi
|8 hours ago
Elon Musk loses trillionaire status as SpaceX slide wipes billions off fortuneTechnology
|Margaret Wanjiru
|8 hours ago
President Ruto’s official website hacked, cyber agencies handling breach – KabogoNews
|Margaret Wanjiru
|6 hours ago