diff --git a/bigbluebutton-web/web-app/demo/bbb_api.jsp b/bigbluebutton-web/web-app/demo/bbb_api.jsp
index e65e1f1ded2990001399e4d10abec63e0f2f837f..702b03ca814506af36b8d296dc592e2f90445f62 100755
--- a/bigbluebutton-web/web-app/demo/bbb_api.jsp
+++ b/bigbluebutton-web/web-app/demo/bbb_api.jsp
@@ -201,6 +201,8 @@ public String getJoinURLViewer(String username, String meetingID) {
 	return base_url_join + join_parameters + "&checksum=" + checksum("join" + join_parameters + salt);
 }
 
+
+
 //
 // checksum() -- create a hash based on the shared salt (located in bbb_api_conf.jsp)
 //
@@ -380,6 +382,39 @@ public String getMeetings() {
 	}
 }
 
+//
+public String endMeeting(String meetingID, String moderatorPassword) {
+	
+	String base_main = "meetingID=" + urlEncode(meetingID) + "&password=" + urlEncode(moderatorPassword);
+	String base_url = BigBlueButtonURL + "api/end?";
+	String checksum ="";
+	
+	try {
+		checksum = DigestUtils.shaHex("end" + base_main + salt);
+	} catch (Exception e) {
+		// TODO Auto-generated catch block
+		e.printStackTrace();
+	}
+
+	String xml = getURL(base_url + base_main + "&checksum=" + checksum);
+
+	Document doc = null;
+	try {
+		doc = parseXml(xml);
+	} catch (Exception e) {
+		e.printStackTrace();
+	}
+	
+	if (doc.getElementsByTagName("returncode").item(0).getTextContent()
+			.trim().equals("SUCCESS")) {
+		return "true";
+	}
+	
+	return  "Error " + doc.getElementsByTagName("messageKey").item(0).getTextContent().trim() 
+	+ ": " + doc.getElementsByTagName("message").item(0).getTextContent().trim();
+	
+}
+
 //
 // parseXml() -- return a DOM of the XML
 //
diff --git a/bigbluebutton-web/web-app/demo/demo4.js b/bigbluebutton-web/web-app/demo/demo4.js
index ef3f55aac4b2a43cd99a02aee84bd26b199052b5..b674123a85a119db8fa999dad86a365f80790047 100755
--- a/bigbluebutton-web/web-app/demo/demo4.js
+++ b/bigbluebutton-web/web-app/demo/demo4.js
@@ -102,7 +102,20 @@ function getMeetingsInfoURL(meetingID, password, checksum) {
 }
 
 function createMeetingTable(meeting) {	
-	var tableContent = '<table name="' + meeting.meetingID + '" class="hor-minimalist-b" cellspacing="0" summary="The current participants in a meeting"><caption>' + meeting.meetingID + '</caption><tr><th scope="col" abbr="Participants">Participants</th><th scope="col" abbr="Name">Name</th><th scope="col" abbr="Role">Role</th></tr>';
+	
+	var form = '<th><FORM NAME="form1" METHOD="GET"><input type="hidden" name="meetingID" value="' + meeting.meetingID + '"/>';
+	form += '<input type="hidden" name="moderatorPW" value="' + meeting.moderatorPW + '"/>';
+	form += '<INPUT TYPE=hidden NAME=action VALUE="end">';
+	form += '<input type="submit" value="End"/></FORM>';
+	form += '</th>';
+	
+	var tableContent = '<table name="' + meeting.meetingID + '" class="hor-minimalist-b" cellspacing="0" summary="The current participants in a meeting"><caption>' + meeting.meetingID + '<caption><tr><th scope="col" abbr="Participants">Participants</th><th scope="col" abbr="Name">Name</th><th scope="col" abbr="Role">Role</th>';
+	
+	//uncomment below to add the ability to end meetings in the activity monitor
+	//tableContent += form;
+	
+	tableContent += '</tr>';
+	
 	var encodedMeetingID = encode(meeting.meetingID);
 	var tableRowId;
 	var newRows = new Array();
@@ -112,7 +125,7 @@ function createMeetingTable(meeting) {
 		for (var i in meeting.attendees.attendee) {
 			var attendee = (meeting.attendees.attendee[i].userID != null) ? meeting.attendees.attendee[i] : meeting.attendees.attendee;
 			tableRowId = encodedMeetingID + '_' + attendee.userID;
-			tableContent += '<tr id="' + tableRowId + '"><td>' + attendee.userID + '<td>' + attendee.fullName + '</td><td>' + attendee.role + '</td></tr>'
+			tableContent += '<tr id="' + tableRowId + '"><td>' + attendee.userID + '<td>' + attendee.fullName + '</td><td>' + attendee.role + '</td></tr>';
 
 			// if there is a new row to be added, then add to the new rows array to display it with a flash effect.
 			if ($("#" + tableRowId).length == 0) {
diff --git a/bigbluebutton-web/web-app/demo/demo4.jsp b/bigbluebutton-web/web-app/demo/demo4.jsp
index 8c7925f68c82eed118b1f47f74ef108d3603cbd9..edee4c1e9b8f2465bab232799863635390fe69a1 100755
--- a/bigbluebutton-web/web-app/demo/demo4.jsp
+++ b/bigbluebutton-web/web-app/demo/demo4.jsp
@@ -51,13 +51,56 @@ Author: Islam El-Ashi <ielashi@gmail.com>
 
 <%@ include file="demo_header.jsp"%>
 
+
+<%
+if (request.getParameterMap().isEmpty()) {
+%>
+
 <h2>Demo #4: Activity Monitor</h2>
 
 <p id="no_meetings"></p>
 
 <div id="meetings"></div>
+
+
+<% 
+} else if (request.getParameter("action").equals("end")) {
+	 
+	String mp = request.getParameter("moderatorPW");
+	String meetingID = request.getParameter("meetingID");
+	
+	String result = endMeeting(meetingID, mp);
+	
+	if ( result.equals("true") ){
+
+%>
+
+<h2>Demo #4: Activity Monitor</h2>
+
+<%=meetingID%> has been terminated.
+
+<p id="no_meetings"></p>
+
+<div id="meetings"></div>
+
+<% } else { %>
+
+<h2>Demo #4: Activity Monitor</h2>
+
+
+Unable to end meeting: <%=meetingID%>
+
+<%=result%>
+
+
+
+
+<% 		}
+	}%>
+	
  <%@ include file="demo_footer.jsp"%>
 </body>
 </html>
 
+