AFCON U20: Kenya, Tanzania clash again in CECAFA Zonal qualifiers final
AFCON U20: Kenya, Tanzania clash again in CECAFA Zonal qualifiers final
Read this story aloud
Listen to the clean text version of this article
Ready
4 min listen
Audio reading is not supported on this browser.
Kenya is set to face hosts Tanzania in the final of the CAF U-20 Africa Cup of Nations (AFCON) CECAFA qualifiers at the KMC Stadium in Dar es Salaam. Both teams have already booked their spots for the 2025 AFCON U-20 tournament but are determined to lift the regional title
Kenya will aim to conclude their remarkable campaign in the CAF U-20 Africa Cup of Nations (AFCON) CECAFA qualifiers with a win against hosts Tanzania in the final at KMC Stadium, Dar es Salaam this afternoon.
The highly anticipated final is a rematch of their Group A clash from just over a week ago. Kenya emerged victorious in that encounter and now hopes to remain unbeaten in the tournament, while Tanzania is keen to avoid another loss on home soil.
Both teams have already secured their spots in the 2025 AFCON U-20 tournament by reaching the final of the CECAFA regional qualifiers, according to competition rules.
More To Read
- 𝐄𝐚𝐬𝐭𝐥𝐞𝐢𝐠𝐡 𝐕𝐨𝐢𝐜𝐞 𝐚𝐭 𝐍𝐢𝐧𝐞 – 8 Utumishi Girls students charged with murder as court shields identities
- Infotrak survey: Kenyans rank delivery of promises as top measure of leaders’ performance
- Kenya and Morocco deepen defence cooperation with joint focus on air power and military training
- Kenya pushes for common AI rules across COMESA to boost trade and cybersecurity
- Somalia’s Deputy Prime Minister breaks silence after Kenya deportation, denies arming militias
- 𝐄𝐚𝐬𝐭𝐥𝐞𝐢𝐠𝐡 𝐕𝐨𝐢𝐜𝐞 𝐚𝐭 𝐍𝐢𝐧𝐞 – Meru miraa farmers push back against new licensing law, demand review
Kenya’s road to the final saw them beat Tanzania 2-1 in the group stage before overpowering Burundi 4-0 in the semi-finals. Apart from a goalless draw with Rwanda in the group stage, Kenya has won all their matches.
Rising Stars head coach, Salim Babu, is aware of the challenge posed by Tanzania but remains confident in his team’s readiness. “Tanzania will want revenge, which makes the final tougher, but we’ve prepared well, and the players are determined to win,” said Babu, who also manages Kenya Police in the FKF Premier League.
Tanzania has bounced back from their group stage defeat to Kenya by winning their next four matches, including a 2-1 victory over Uganda in the semi-finals. Head coach Charles Boniface Mkwasa is optimistic about their chances after learning from their previous meeting with Kenya. “We are happy to have qualified for AFCON U-20, but now we’re focused on winning the title,” Mkwasa told Cecafaonline.com.
Latest Stories
- Machakos Mitumba Market traders suffer heavy losses after midnight fire
- Kenyans urged to join Saba Saba march to honour victims of alleged abductions, killings
- Quiet revolution behind foldable smartphones and why they’re making a comeback
- Invisible peacebuilders: How ‘diplomacy works’ to prevent conflict
Tanzania will also welcome back star striker Valentino Kusengama, who returns from suspension. Kusengama has scored four goals in the tournament, while Sabri Kondo leads the team with five.
For Kenya, key forwards Kelvin Wangaya and Aldrine Kibet, both with four goals, along with midfielders Andres Omondi and Hassan Beja, will be crucial to their chances of securing the title.
Besides the championship, individual awards will be presented for the tournament’s top scorer, best player, best goalkeeper, and the Fair Play Award. The tournament also serves as a qualifier for the 2025 FIFA U-20 World Cup, to be held in Chile.
CAF will announce the host nation for the 2025 AFCON U-20 on October 22 during its General Assembly in Addis Ababa.
Earlier today, Uganda will face Burundi in the third-place play-off at the same venue.
Today’s Matches (KMC Stadium)
Other Topics To Read
Top Stories Today
- Three arrested after Linda Mwananchi convoy attacked in Kisii as police hunt for more suspects
- Machakos Mitumba Market traders suffer heavy losses after midnight fire
- Kenyans urged to join Saba Saba march to honour victims of alleged abductions, killings
- Quiet revolution behind foldable smartphones and why they’re making a comeback
- Invisible peacebuilders: How ‘diplomacy works’ to prevent conflict
- State extends security operation in Marsabit, declares multiple areas dangerous for 30 more days
`;
}
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
Messi is old, short and slow: How is he still dominating at the World Cup?Sports
|The Conversation
|23 hours ago
Government extends security operation in Marsabit, declares multiple areas dangerous for 30 more daysNorthern Kenya
|Lucy Mumbi
|2 hours ago
Iran begins six-day funeral for late Supreme Leader Ali KhameneiWorld
|DW News
|1 day ago
Serena Williams withdraws from Wimbledon doubles after knee injury, ending Venus reunion plansSports
|Bashir Mbuthia
|11 hours ago
Pope Leo XIV shines spotlight on Mediterranean migration crisisWorld
|Mary Wambui
|15 hours ago
Egypt end 92-year wait to reach World Cup last 16News
|Erick Kariuki
|1 day ago
Three arrested after Linda Mwananchi convoy attacked in Kisii as police hunt for more suspectsNews
|Lucy Mumbi
|2 hours ago
Mbappé fires France past Paraguay into World Cup quarter-finalsSports
|Erick Kariuki
|3 hours ago
Kenya reaffirms ties with Rwanda as it marks Liberation Day celebrationsRegional
|Bashir Mbuthia
|11 hours ago
What the World Cup hydration breaks reveal about who governs men’s footballSports
|The Conversation
|18 hours ago