diff --git a/application/modules/courses/controllers/PublicViewController.php b/application/modules/courses/controllers/PublicViewController.php
index b42d3bebd0c8ac4039d6966e751802b6ea6faaf8..f5fe310c17a11acd509b55f1c7d36f5bbeb80e90 100644
--- a/application/modules/courses/controllers/PublicViewController.php
+++ b/application/modules/courses/controllers/PublicViewController.php
@@ -14,9 +14,143 @@ class Courses_PublicViewController extends App_Controller_Action {
 	 */
 	public function allCoursesAction()
     {
-		$layout = Zend_Layout::getMvcInstance();
-		$layout->disableLayout();
-        $this->getFrontController()->setParam('noViewRenderer', true);
+    	$this->_disableLayoutAndView();
+    	$courses = Courses_CourseModel::findAllActive();
+    	$courses->orderBy('getCourseCode');
+    	$dom = new DOMDocument('1.0', 'UTF-8');
+    	$dom->formatOutput = true;
+    	$root = $dom->createElement('courses');
+    	$dom->appendChild($root);
+    	
+    	foreach ($courses as $course) {
+    		$courseNode = $dom->createElement('course');
+    		
+    		$courseNode->appendChild($dom->createElement('title', htmlspecialchars($course->getTitle())));
+    		
+    		$crosslistings = $course->getCrosslistings();
+    		if (count($crosslistings) > 0) {
+	    		$courseCodesNode = $dom->createElement('courseCodes');
+	    		$courseNode->appendChild($courseCodesNode);
+	    		foreach ($crosslistings as $crosslisting) {
+	    			$courseCodeNode = $dom->createElement('courseCode');
+	    			$courseCodesNode->appendChild($courseCodeNode);
+	    			$courseCodeNode->setAttribute('type', $crosslisting['type']);
+	                $courseCodeNode->appendChild($dom->createElement('subject', $crosslisting['subject']));
+	                $courseCodeNode->appendChild($dom->createElement('courseNumber', $crosslisting['courseNumber']));
+	                if ($crosslisting['courseLetter']) {
+	                    $courseCodeNode->appendChild($dom->createElement('courseLetter', $crosslisting['courseLetter']));
+	                }
+	    		}
+    		} else {
+    			continue;
+    		}
+    		
+            $courseNode->appendChild($dom->createElement('gradingType', htmlspecialchars($course->getGradingType(), null, 'UTF-8')));
+            $courseNode->appendChild($dom->createElement('dfRemoval', htmlspecialchars($course->getDfRemoval(), null, 'UTF-8')));
+            $courseNode->appendChild($dom->createElement('effectiveSemester', htmlspecialchars($course->getEffectiveSemester(), null, 'UTF-8')));
+    	
+            if ($node = $this->_getNodeFromHtmlFragment($dom, 'prerequisite', $course->getPrerequisite())) {
+                $courseNode->appendChild($node);
+            }
+            if ($node = $this->_getNodeFromHtmlFragment($dom, 'notes', $course->getNotes())) {
+                $courseNode->appendChild($node);
+            }
+            if ($node = $this->_getNodeFromHtmlFragment($dom, 'description', $course->getDescription())) {
+                $courseNode->appendChild($node);
+            }
+            
+            if (count($course->getCampuses()) > 0) {
+                $campusesNode = $dom->createElement('campuses');
+                $courseNode->appendChild($campusesNode);
+                foreach ($course->getCampuses() as $campus) {
+                    $campusesNode->appendChild($dom->createElement('campus', $campus));
+                }
+            }
+            
+            if (count($course->getDeliveryMethods()) > 0) {
+                $deliveryMethodsNode = $dom->createElement('deliveryMethods');
+                $courseNode->appendChild($deliveryMethodsNode);
+                foreach ($course->getDeliveryMethods() as $deliveryMethod) {
+                    $deliveryMethodsNode->appendChild($dom->createElement('deliveryMethod', $deliveryMethod));
+                }
+            }
+            
+            if (count($course->getTermsOffered()) > 0) {
+                $termsOfferedNode = $dom->createElement('termsOffered');
+                $courseNode->appendChild($termsOfferedNode);
+                foreach ($course->getTermsOffered() as $term) {
+                    $termsOfferedNode->appendChild($dom->createElement('term', $term));
+                }
+            }
+    		
+    		$activities = $course->getActivities();
+    		if (count($crosslistings) > 0) {
+    			$activitiesNode = $dom->createElement('activities');
+    			$courseNode->appendChild($activitiesNode);
+	    		foreach ($activities as $activity) {
+	    			$activityNode = $dom->createElement('activity');
+	    			$activitiesNode->appendChild($activityNode);
+                    $activityNode->appendChild($dom->createElement('type', $activity['type']));
+                    if ($activity['hours']) {
+                        $activityNode->appendChild($dom->createElement('hours', $activity['hours']));
+                    }
+	    		}
+    		}
+    		
+    		$credits = $course->getCredits();
+    		if (count($credits) > 0) {
+    			$creditsNode = $dom->createElement('credits');
+    			$courseNode->appendChild($creditsNode);
+    			foreach ($credits as $credit) {
+    				$creditNode = $dom->createElement('credit', $credit['hours']);
+    				$creditsNode->appendChild($creditNode);
+    				$creditNode->setAttribute('type', $credit['description']);
+    			}
+    		}
+    	
+    		$gradTieIn = $course->getGradTieIn();
+            if ($gradTieIn['credits']) {
+                $courseNode->appendChild($dom->createElement('gradCredits', htmlspecialchars($gradTieIn['credits'], null, 'UTF-8')));
+            }
+            if ($node = $this->_getNodeFromHtmlFragment($dom, 'gradNotes', $gradTieIn['notes'])) {
+                $courseNode->appendChild($node);
+            }
+            if ($node = $this->_getNodeFromHtmlFragment($dom, 'gradPrerequisites', $gradTieIn['prerequisites'])) {
+                $courseNode->appendChild($node);
+            }
+    		
+            
+            $root->appendChild($courseNode);
+    	}
+    	
+    	header('Content-type: text/xml');
+    	$dom->normalize();
+    	echo $dom->saveXML();
+	}
+	
+	protected function _getNodeFromHtmlFragment($dom, $nodeName, $fragment)
+	{
+		$fragment = trim($fragment);
+        if (!$fragment) {
+        	return null;
+        }
+        
+        $node = new DOMDocument('1.0', 'UTF-8');
+        $fragment = '<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head><body>' . $fragment . '</body>';
+        $node = DOMDocument::loadHTML(strtr($fragment, array('&' => '&amp;')));
+        if (!$node->documentElement) {
+        	return null;
+        }
+        
+        $node = $dom->importNode($node->documentElement, true);
+        $realNode = $node->childNodes->item(1);
+        
+        $newNode = $dom->createElement($nodeName);
+        while ($realNode->hasChildNodes()) {
+        	$newNode->appendChild($realNode->childNodes->item(0));
+        }
+       
+        return $newNode;
 	}
 	
 	/**
@@ -25,10 +159,8 @@ class Courses_PublicViewController extends App_Controller_Action {
 	 */
 	public function testAction()
 	{
-        $layout = Zend_Layout::getMvcInstance();
-        $layout->disableLayout();
-        $this->getFrontController()->setParam('noViewRenderer', true);
-        header('Content-type: text/plain');
+		$this->_disableLayoutAndView();
+        //header('Content-type: text/plain');
 
         
 		$db = Zend_Registry::get('db');
diff --git a/application/modules/courses/models/CourseModel.php b/application/modules/courses/models/CourseModel.php
index d0cdbf0b3c4450303a59d11ab7904c10a7a4bd2f..4e68721620ded662ea480f88248ac985018239c6 100644
--- a/application/modules/courses/models/CourseModel.php
+++ b/application/modules/courses/models/CourseModel.php
@@ -127,6 +127,7 @@ class Courses_CourseModel extends Unl_Model
         // Credits
         $select = new Zend_Db_Select($db);
         $select->from(array('c' => 'creqCourseCredits'));
+        $select->join(array('t' => 'creqCreditTypes'), 'c.type = t.creditTypeId', array('description'));
         $select->where('c.generation IN(?)', $courseIds);
 
         $records = $select->query()->fetchAll();
@@ -358,7 +359,7 @@ class Courses_CourseModel extends Unl_Model
         }
 	}
 
-	static public function findByCourseCode($subject, $courseNumber, $courseLetter = null)
+	static public function findByCourseCode($subject, $courseNumber, $courseLetter = '')
 	{
 		$db = Zend_Registry::get('db');
 
@@ -370,10 +371,8 @@ class Courses_CourseModel extends Unl_Model
 		$select->where('g.removed = "no"');
 		$select->where('c.subject = ?', $subject);
 		$select->where('c.courseNumber = ?', $courseNumber);
-		if ($courseLetter) {
-			$select->where('c.courseLetter = ?', $courseLetter);
-		}
-
+        $select->where('c.courseLetter = ?', $courseLetter);
+        
 		$records = $select->query()->fetchAll();
 		if (count($records) == 0) {
 			return null;
@@ -407,6 +406,23 @@ class Courses_CourseModel extends Unl_Model
         $requests = Requests_RequestModel::find($requestIds);
         return $requests;
 	}
+	
+	static public function findAllActive()
+	{
+        $db = Zend_Registry::get('db');
+
+        $select = new Zend_Db_Select($db);
+        $select->from(array('g' => 'creqCourseGenerations'), array('courseGenerationId'));
+        $select->join(array('p' => 'creqCourses'), 'g.courseGenerationId = p.currentGeneration', array());
+        $select->where('g.removed = "no"');
+        
+        $records = $select->query()->fetchAll();
+        $generationIds = array();
+        foreach ($records as $row) {
+            $generationIds[] = $row['courseGenerationId'];
+        }
+        return self::find($generationIds);
+	}
 
     static public function save($models)
     {