diff --git a/packages/bootstrap.bld b/packages/bootstrap.bld
index 7839de5..ac9b5be 100644
--- a/packages/bootstrap.bld
+++ b/packages/bootstrap.bld
@@ -1,5 +1,5 @@
 /*
- *  ======== bootstrap.cfg ========
+ *  ======== bootstrap.bld ========
  *  This script is run prior to all build scripts.  It is only used for
  *  the bootstrap build of xdc.
  */
diff --git a/packages/xdc/bld/BuildEnvironment.xs b/packages/xdc/bld/BuildEnvironment.xs
index 083c436..1744cc0 100644
--- a/packages/xdc/bld/BuildEnvironment.xs
+++ b/packages/xdc/bld/BuildEnvironment.xs
@@ -193,7 +193,7 @@
         for (var i = 0; i < this.bld.targets.length - 1; i++) {
             for (var j = i + 1; j < this.bld.targets.length; j++) {
                 if (this.bld.targets[i].$name == this.bld.targets[j].$name) {
-                    throw new Packages.xdc.services.global.XDCException(
+                    throw xdc.$$XDCException(
                         "xdc.bld.DUPLICATE_TARGET_ERROR",
                         "The target '" + this.bld.targets[i].$name + "' is "
                         + "found twice in Build.targets.");
@@ -205,7 +205,7 @@
         for (var i = 0; i < this.bld.targets.length; i++) {
             var targ = this.bld.targets[i];
             if (targ == undefined) {
-                throw new Packages.xdc.services.global.XDCException(
+                throw xdc.$$XDCException(
                 "xdc.bld.TARGET_CONFIG_ERROR",
                 "Undefined target found in Build.targets. "
                     + this.bld.printBuildTargets());
@@ -226,10 +226,10 @@
                     targ.rootDir = targ.base.rootDir;
                 }
                 if (targ.rootDir == null) {
-                    throw new Packages.xdc.services.global.XDCException(
+                    throw xdc.$$XDCException(
                         "xdc.bld.ROOTDIR_NOT_SET",
                         "'rootDir' has not been set for the target "
-                        + targ.name + "; define 'rootDir' in "
+                        + targ.$name + "; define 'rootDir' in "
                         + java.lang.System.getenv("XDCBUILDCFG"));
                 }
 
@@ -292,7 +292,7 @@
 function usePlatform(platformName)
 {
     if (!(typeof platformName == "string")) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.bld.PARAMETER_MISMATCH",
             "Parameter must be a string: was passed " + platformName);
     }
@@ -365,7 +365,7 @@
     var xname = xdc.getPackageBase(pname) + "/package/package.bld.xml";
     var xfile = new java.io.File(xname);
     if (!xfile.exists()) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.bld.PACKAGE_NOT_BUILT",
             "The package " + pname
             + " has not been built.  Try re-building the package");
@@ -374,7 +374,7 @@
     /* parse the XML file */
     var doc = Packages.xdc.services.global.XML.parse(xname);
     if (doc == null) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.bld.INVALID_PACKAGE",
             "the package " + pname
             + " has an invalid package.bld.xml file (" + xname
diff --git a/packages/xdc/bld/ITarget.xdc b/packages/xdc/bld/ITarget.xdc
index 3c4c06f..1e6f31e 100644
--- a/packages/xdc/bld/ITarget.xdc
+++ b/packages/xdc/bld/ITarget.xdc
@@ -69,12 +69,20 @@
      *                          - `undefined`
      *                              unspecified
      *                      @p
+     *
+     *  @field(`shortEnums`) this flag specifies if a target fits the values
+     *                      of an enumeration into the smallest integer type
+     *                      that can accept all values. If that is the case,
+     *                      this flag must be set to `true`. If all values are
+     *                      the size of an Int, this flag can be either set
+     *                      to `false` or left unspecified.
      * @see #model
      */
     struct Model {
         String endian;      /*! endian-ness of this target */
         String codeModel;   /*! target-specific code model */
         String dataModel;   /*! target-specific data model */
+        Bool   shortEnums;  /*! if true, enums are packed into smallest integral type */
     }
 
     /*!
diff --git a/packages/xdc/bld/PackageContents.xs b/packages/xdc/bld/PackageContents.xs
index b947734..cff8389 100644
--- a/packages/xdc/bld/PackageContents.xs
+++ b/packages/xdc/bld/PackageContents.xs
@@ -52,7 +52,7 @@
     /* ensure that the library name is unique */
     if (this.$private.libraries[priv.name] != null
         || this.$private.dlls[priv.name] != null) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.bld.LIBRARY_EXISTS",
 	    "Library '" + priv.name + "' already exists.");
     }
@@ -210,7 +210,7 @@
     
     /* ensure executable name is unique and add to the list of executables */
     if (this.$private.exeNames[priv.name] != null) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
 	    "xdc.bld.EXECUTABLE_EXISTS",
             "Executable '" + priv.name + "' already exists in package '" 
 	        + this.name + "'.");
@@ -286,7 +286,7 @@
         var aname = this.release.attrs.prefix + this.release.$private.name;
 
         if ((new java.io.File(aname)).isAbsolute()) {
-            throw new Packages.xdc.services.global.XDCException(
+            throw xdc.$$XDCException(
 	        "xdc.bld.INVALID_RELEASE_NAME",
                 "the release name '" + aname
 		    + "' must be relative to package '"
@@ -310,7 +310,7 @@
     if (releaseAttrs.prefix != null
         && releaseAttrs.prefix != ""
         && (new java.io.File(releaseAttrs.prefix)).isAbsolute()) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
 	    "xdc.bld.INVALID_RELEASE_PREFIX",
             "the release prefix '" + releaseAttrs.prefix
                 + "' must be a relative path");
@@ -330,7 +330,7 @@
     
     /* ensure release name is unique and add to the list of releases */
     if (this.$private.releases[name] != null) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
 	    "xdc.bld.RELEASE_EXISTS",
             "Release '" + name + "' already exists.");
     }
@@ -371,7 +371,7 @@
     
     /* ensure repository name is unique and add to the list of repositories */
     if (this.$private.repositories[name] != null) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
 	    "xdc.bld.REPOSITORY_EXISTS",
             "Repository '" + name + "' already exists.");
     }
@@ -424,7 +424,7 @@
     
     /* ensure that the script name is unique */
     if (this.$private.scripts[priv.name] != null) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
 	    "xdc.bld.SCRIPT_EXISTS",
             "Script '" + priv.name + "' already exists.");
     }
@@ -452,7 +452,7 @@
 
         /* validate package name */
         if ((pkg.$private.dotcnt = Packages.xdc.services.global.Path.validate(pkg.name)) == -1) {
-             throw new Packages.xdc.services.global.XDCException(
+             throw xdc.$$XDCException(
 	         "xdc.bld.INCORRECT_PACKAGE_NAME",
 		 "Package name '" + pkg.name 
 		     + "' does not match directory name " 
@@ -479,19 +479,19 @@
         /* create cfgDir and libDir, if necessary */
         var dir = new java.io.File(pkg.cfgDir);
         if (!(dir.exists() && dir.isDirectory()) && !dir.mkdirs()) {
-            throw new Packages.xdc.services.global.XDCException(
+            throw xdc.$$XDCException(
 	        "xdc.bld.CREATE_DIR_ERROR",
                 "can't create configuration directory " + pkg.cfgDir);
         }
         dir = new java.io.File(pkg.libDir);
         if (!(dir.exists() && dir.isDirectory()) && !dir.mkdirs()) {
-            throw new Packages.xdc.services.global.XDCException(
+            throw xdc.$$XDCException(
 	        "xdc.bld.CREATE_DIR_ERROR",
                 "can't create library directory " + pkg.libDir);
         }
         dir = new java.io.File(pkg.relDir);
         if (!(dir.exists() && dir.isDirectory()) && !dir.mkdirs()) {
-            throw new Packages.xdc.services.global.XDCException(
+            throw xdc.$$XDCException(
 	        "xdc.bld.CREATE_DIR_ERROR",
                 "can't create release directory " + pkg.relDir);
         }
diff --git a/packages/xdc/bld/_gen.xs b/packages/xdc/bld/_gen.xs
index c861712..cbebdb9 100644
--- a/packages/xdc/bld/_gen.xs
+++ b/packages/xdc/bld/_gen.xs
@@ -860,6 +860,11 @@
     
     if (profileOpts != null && profileOpts.compileOpts != null) {
         result = new xdc.om['xdc.bld.ITarget'].CompileOptions(profileOpts.compileOpts);
+        /* cfgcopts also need to have 'profileOpts.compileOpts.copts', in
+         * case we are compiling the generated C config file, and the user
+         * requested to use 'cfgcopts'.
+         */
+        result.cfgcopts = profileOpts.compileOpts.copts;
     }
     else {
         result = new xdc.om['xdc.bld.ITarget'].CompileOptions;
diff --git a/packages/xdc/bld/bin/config.bld b/packages/xdc/bld/bin/config.bld
index ca13dc1..394a130 100644
--- a/packages/xdc/bld/bin/config.bld
+++ b/packages/xdc/bld/bin/config.bld
@@ -1,8 +1,7 @@
 /* load the config.bld located one up from this package's repository */
 
 /* This points to config.bld of the old XDC tree. */
-//xdc.loadCapsule(xdc.getPackageRepository(Pkg.name) + "/../config.bld");
-xdc.loadCapsule("../../../../config.bld");
+xdc.loadCapsule(xdc.getPackageRepository(Pkg.name) + "/../config.bld");
 
 /* fixup the host targets for this package */
 var Sparc = xdc.module("gnu.targets.Sparc");
diff --git a/packages/xdc/bld/cfg.xdt b/packages/xdc/bld/cfg.xdt
index 10f75d1..0c9f52b 100644
--- a/packages/xdc/bld/cfg.xdt
+++ b/packages/xdc/bld/cfg.xdt
@@ -34,7 +34,7 @@
     if (_pstat.instMod == null) {
         if (prog.platform == "" || prog.platform == null
             || prog.platform == undefined) {
-            throw new Packages.xdc.services.global.XDCException(
+            throw xdc.$$XDCException(
                 "xdc.bld.PLATFORM_NOT_SET", "Platform is not defined for "
                 + "target '" + build.target.$name + "'");    
         }
diff --git a/packages/xdc/bld/xdc_top.mak b/packages/xdc/bld/xdc_top.mak
index 6b13098..c7d4cb4 100644
--- a/packages/xdc/bld/xdc_top.mak
+++ b/packages/xdc/bld/xdc_top.mak
@@ -33,6 +33,21 @@
 export HOSTOS ?= $(if $(findstring :,$(WINDIR)$(windir)$(COMSPEC)$(comspec)),Windows,Solaris)
 
 #
+#  Solaris's /bin/sh is useless; we need a more modern shell that has
+#  string substitution capabilities; e.g., dir=${file%/*}
+#
+ifeq (Solaris,$(HOSTOS))
+    SHELL := /usr/bin/ksh
+endif
+
+#
+#  ditto for Windows.  In this case, we use cygwin's ash.exe.
+#
+ifeq (Windows,$(HOSTOS))
+    SHELL := $(XDCROOT)/bin/sh.exe
+endif
+
+#
 #  ======== command definitions ========
 #  The following commands are used in this make file.  We define 
 #  macros for these commands because we want the makefiles to be
@@ -44,7 +59,7 @@
 #  ECHO  = echo arguments
 #
 ifeq (Windows,$(HOSTOS))
-    STDERR := $(subst \,/,$(XDCROOT)/bin/stderr)
+    STDERR := $(subst \,/,"$(XDCROOT)"/bin/stderr)
     ECHO = $(STDERR) echo
     DATE = $(if $(TFLAG),$(STDERR) echo,$(STDERR) date)
 else
diff --git a/packages/xdc/cfg/Main.xs b/packages/xdc/cfg/Main.xs
index 238bd3e..907c688 100644
--- a/packages/xdc/cfg/Main.xs
+++ b/packages/xdc/cfg/Main.xs
@@ -40,7 +40,7 @@
     progGen.gen(prefix, executable, xdc.om, Program, true);
 
     if (config.hasReportedError) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.cfg.CONFIG_ERROR", "Error in configuration");
     }
 
@@ -58,7 +58,7 @@
     }
 
     if (config.hasReportedError) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.cfg.CONFIG_ERROR", "Error in configuration");
     }
 
@@ -66,7 +66,9 @@
     genXML(prefix + ".cfg.xml");
     genDot(prefix + ".cfg.dot");
     genRov(prefix + ".rov.xs");
-    genRta(prefix + ".rta.xml");
+    
+    var Rta = xdc.module('xdc.runtime.Rta');
+    Rta.genRta(prefix + ".rta.xml");
 
     var genDebug = Program.gen.debuggerFiles;
     if (genDebug == null) {
@@ -196,7 +198,7 @@
 
     this.$private.$$cfgCapsule._userscript(this.$private.$$legacy, script);
     try {
-        $trace("package closing phase: $$phase - >3", 1, ["xdccore"]);
+        _myTrace("package closing phase: $$phase - >3", 1, ["xdccore"]);
         xdc.om.$$bind('$$phase', 3);
         closePackages();
 	sealConfig();
@@ -1195,138 +1197,6 @@
 }
 
 /*
- *  ======== genRta ========
- */
-function genRta(outputFileName)
-{
-    var file = new java.io.File(outputFileName);
-    file["delete"]();
-    var out = new java.io.FileWriter(outputFileName);
-    out = new java.io.BufferedWriter(out);
-
-    var rts = xdc.om['xdc.runtime'];
-
-    var data = new rts.Types.RtaDecoderData;
-    data.targetName = Program.build.target.$name;
-    data.binaryParser = Program.build.target.binaryParser;
-
-    /* 
-     * Add all instances of modules which implement ILogger to the meta data.
-     * This list is primarily used for supporting control commands.
-     */
-    var ILogger = xdc.module('xdc.runtime.ILogger');
-    for (var i = 0; i < xdc.om.$modules.length; i++) {
-        var mod = xdc.om.$modules[i];
-        
-        /* If this module implements the ILogger interface. */
-        if (mod instanceof ILogger.Module) {
-            /* Add each of the module's instances. */
-            for (var j = 0; j < mod.$instances.length; j++) {
-                addLoggerInst(data, mod, mod.$instances[j].$orig, j);
-        }
-
-            /* get emebdded loggers too */
-            for (var j = 0; j < mod.$objects.length; j++) {
-                addLoggerInst(data, mod, mod.$objects[j].$orig, j);
-    }
-        }
-    }
-    
-    /*
-     * For each module, store the logger associated with it and its initial
-     * diags configuration.
-     */
-    var targetModules = Program.targetModules();
-    for (var i = 0; i < targetModules.length; i++) {
-        var mod = targetModules[i];
-        if (!mod.PROXY$) {
-
-            var loggerInst = "";
-            if (mod.common$.logger == null) {
-                loggerInst = "null";
-            }
-            else if (mod.common$.logger.$orig.instance.name) {
-                loggerInst = mod.common$.logger.$orig.instance.name;
-            }
-            else {
-                loggerInst = String(mod.common$.logger.$orig);
-            }
-
-            data.modMap[mod.$name] = {
-                id: mod.Module__id,
-                logger: loggerInst,
-                /*
-                 * Mask has the form EXLIA00012345678, with 3 unused bits
-                 * between Assert and User1
-                 */
-                diagsMask: String(Number(mod.common$.diags_ENTRY)) +
-                       String(Number(mod.common$.diags_EXIT)) +
-                       String(Number(mod.common$.diags_LIFECYCLE)) +
-                       String(Number(mod.common$.diags_INTERNAL)) +
-                       String(Number(mod.common$.diags_ASSERT)) +
-                       "000" +
-                       String(Number(mod.common$.diags_USER1)) +
-                       String(Number(mod.common$.diags_USER2)) +
-                       String(Number(mod.common$.diags_USER3)) +
-                       String(Number(mod.common$.diags_USER4)) +
-                       String(Number(mod.common$.diags_USER5)) +
-                       String(Number(mod.common$.diags_USER6)) +
-                       String(Number(mod.common$.diags_USER7)) +
-                       String(Number(mod.common$.diags_USER8))
-            };
-        }
-    }
-
-    /* Create the event map */
-    for (var id in rts.Log.idToInfo) {
-        var info = rts.Log.idToInfo[id].split('::');
-        data.evtMap[info[0]] = {
-            id: Number(id.substring(1)),
-            msg: java.net.URLEncoder.encode(info[1], 'UTF-8')
-        };
-    }
-
-    /* Target specific constants. */
-    data.eventSize = rts.Log.EventRec.$sizeof();
-    data.argSize = Program.build.target.stdTypes.t_IArg.size;
-
-    data.bitsPerChar = Program.build.target.bitsPerChar;
-    data.endian = Program.build.target.model.endian;
-
-    out.write(String(data.$xml()));
-    out.write('\n');
-
-    out.close();
-}
-/*
- *  ======== addLoggerInst ========
- */
-function addLoggerInst(data, mod, inst, index)
-{
-    data.loggers.length++;
-    
-    var logger = {};
-    
-    /* Store the instance name if one was given. */
-    if (inst.instance.name) {
-        logger.name = inst.instance.name;
-    }
-    else {
-        logger.name = String(inst);
-    }
-        
-    /* Store the type of the logger instance. */
-    logger.type = String(mod);
-
-    /* Store the meta data provided for this logger instance. */
-    var metaArgs = mod.getMetaArgs(inst, index);
-    logger.metaArgs = metaArgs;
-    
-    /* Add the logger to the list */
-    data.loggers[data.loggers.length - 1] = logger;
-}
-
-/*
  *  ======== genXML ========
  *  Generate XML file that contains information about the configuration.
  */
diff --git a/packages/xdc/om2.xs b/packages/xdc/om2.xs
index 3ad2db4..07b0c25 100644
--- a/packages/xdc/om2.xs
+++ b/packages/xdc/om2.xs
@@ -202,8 +202,9 @@
     return stype.$$sz;
 };
 
-
-/* This function references the object Program, which means that the function
+/*
+ *  ======== $$computeSizes ========
+ *  This function references the object Program, which means that it
  * can be invoked only within the configuration object model.
  */
 xdc.global.$$computeSizes = function(stype)
@@ -219,10 +220,13 @@
     var a0 = 0, n = 1, sz = 0;
     var ms = 0, ma = 0;
 
+    var target = Program.build.target;
+    
     for (var i = 0; i < sizes.length; i++) {
         var fld = sizes[i][0];
         var ts = sizes[i][1];
 
+        /* compute total number of element in an array and each elem's type */
         while (ts[0] == 'A') {
             var k = ts.indexOf(';');
             n *= Number(eval(ts.substring(1, k)));
@@ -231,24 +235,31 @@
 
         switch (ts[0]) {
         case 'S':
+                /* structure aggregate: <scope>;<name> */
             var sn = ts.substring(1).split(';');
             var st = xdc.om[sn[0]][sn[1]];
             a = $$alignof(st);
             s = $$sizeof(st);
             break;
+
         case 'E':
+                /* @Encoded type, get size and alignment from module */
             var en = ts.substring(1).split(";");
             a = $om[en[0] + '$$capsule'][en[1] + '$alignof']();
             s = $om[en[0] + '$$capsule'][en[1] + '$sizeof']();
             break;
+
         case 'N':
-            t = Program.build.target.stdTypes.t_Int;
+                /* enumerated type */
+                t = $$getEnumType(ts, target);
             a = t.align;
             s = t.size;
             break;
+
         case 'T':
         case 'U':
-            t = Program.build.target.stdTypes['t_' + ts.substring(1)];
+                /* "U": unsigned std type, "T": signed std type */
+                t = target.stdTypes['t_' + ts.substring(1)];
             a = t.align;
             s = t.size;
             break;
@@ -285,6 +296,56 @@
     stype.$$bind('$$al', uflg ? ma : a0);
 };
 
+/*
+ *  ======== $$getEnumType ========
+ *  Convert enum encoding into a Target stdType
+ */
+xdc.global.$$getEnumType = function (ts, target)
+{
+    var k = ts.indexOf(';');
+    if (k < 0) {
+        return (target.stdTypes.t_Int);
+    }
+    
+    var suffix = ts.substr(k + 1);
+    var name = ts.substr(1, k);
+    
+    var sa = suffix.split(';');
+    var refType = sa.shift();
+	    
+    if (refType != "") {
+        /* refType[0] == 'T' or 'U' */
+        return (target.stdTypes['t_' + refType.substring(1)]);
+    }
+
+    if (("shortEnums" in target.model) && target.model.shortEnums) {
+        /* this is where we have to compute smallest container */
+        var min = 0;
+        var max = sa.length - 1;
+        for (var i = 0; i < sa.length; i++) {
+            if (sa[i] != "") {
+                var tmp = eval(sa[i]);
+                if (tmp > max) {
+                    max = tmp;
+                }
+                if (tmp < min) {
+                    min = tmp;
+                }
+                sa[i] = tmp;
+            }
+        }
+        if ((min >= 0 && max <= 255) || (min >= -128 && max <= 127)) {
+            return (target.stdTypes.t_Int8);
+        }
+        if ((min >= 0 && max <= 65535) || (min >= -32768 && max <= 32767)) {
+            return (target.stdTypes.t_Int16);
+        }
+        return (target.stdTypes.t_Int32);
+    }
+    
+    return (target.stdTypes.t_Int);
+};
+
 xdc.om = $$VObj('$om').$$init($$PObj().$$init('$$OM', null), '$om', $$DEFAULT, false);
 xdc.om.$$bind('$$d', {});
 xdc.om.$$bind('$name', undefined);
diff --git a/packages/xdc/platform/generic/Platform.xs b/packages/xdc/platform/generic/Platform.xs
index d583877..45c525f 100644
--- a/packages/xdc/platform/generic/Platform.xs
+++ b/packages/xdc/platform/generic/Platform.xs
@@ -111,7 +111,7 @@
         return ("ti/targets/linkcmd.xdt");
     }
     else {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             this.$package.$name + ".LINK_TEMPLATE_ERROR",
             "Target package " + tpkg + " does not contain linker command "
             + "template 'linkcmd.xdt'.");
diff --git a/packages/xdc/productview/ProductView.xdc b/packages/xdc/productview/ProductView.xdc
index 18e6822..2317fcd 100644
--- a/packages/xdc/productview/ProductView.xdc
+++ b/packages/xdc/productview/ProductView.xdc
@@ -47,6 +47,7 @@
     config ProductElemDesc xdc_runtime_Diags;
     config ProductElemDesc xdc_runtime_Error;
     config ProductElemDesc xdc_runtime_Timestamp;
+    config ProductElemDesc xdc_runtime_Text;
 
 /* Memory Management modules */
 
@@ -81,5 +82,4 @@
 /* product */
 
     config ProductElemDesc xdctoolsProduct;
-
 }
diff --git a/packages/xdc/productview/ProductView.xs b/packages/xdc/productview/ProductView.xs
index 804a7ee..9bd3a5b 100644
--- a/packages/xdc/productview/ProductView.xs
+++ b/packages/xdc/productview/ProductView.xs
@@ -66,7 +66,7 @@
     
     this.xdc_runtime_Assert.elemName = "Assert";
     this.xdc_runtime_Assert.moduleName = "xdc.runtime.Assert";
-    this.xdc_runtime_Assert.iconFileName = "icons/hwi.ico";
+    this.xdc_runtime_Assert.iconFileName = "icons/err.ico";
 
     this.xdc_runtime_Diags.elemName = "Diags";
     this.xdc_runtime_Diags.moduleName = "xdc.runtime.Diags";
@@ -74,12 +74,16 @@
 
     this.xdc_runtime_Error.elemName = "Error";
     this.xdc_runtime_Error.moduleName = "xdc.runtime.Error";
-    this.xdc_runtime_Error.iconFileName = "icons/hwi.ico";
+    this.xdc_runtime_Error.iconFileName = "icons/err.ico";
 
     this.xdc_runtime_Timestamp.elemName = "Timestamp";
     this.xdc_runtime_Timestamp.moduleName = "xdc.runtime.Timestamp";
     this.xdc_runtime_Timestamp.iconFileName = "icons/rtc.ico";
 
+    this.xdc_runtime_Text.elemName = "Text";
+    this.xdc_runtime_Text.moduleName = "xdc.runtime.Text";
+    this.xdc_runtime_Text.iconFileName = "icons/txt.ico";
+
 /* Timestamp Providers Sub Group Modules */
 
     this.xdc_runtime_TimestampNull.elemName = "TimestampNull";
@@ -189,6 +193,7 @@
         this.xdc_runtime_Diags,
         this.xdc_runtime_Assert,
         this.xdc_runtime_Error,
+        this.xdc_runtime_Text,
         this.xdc_runtime_Timestamp,
 	this.timestampProvidersGroup
     ];
@@ -213,7 +218,7 @@
 
     this.xdctoolsProduct.elemName = "XDCtools";
     this.xdctoolsProduct.moduleName = null;
-    this.xdctoolsProduct.iconFileName = "icons/bios.gif";
+    this.xdctoolsProduct.iconFileName = "icons/xdc.gif";
     this.xdctoolsProduct.elemArray = [
         this.systemGroup,
         this.diagnosticsGroup,
diff --git a/packages/xdc/productview/icons/hwi.ico b/packages/xdc/productview/icons/err.ico
similarity index 100%
rename from packages/xdc/productview/icons/hwi.ico
rename to packages/xdc/productview/icons/err.ico
Binary files differ
diff --git a/packages/xdc/productview/icons/rtc_fldr.ico b/packages/xdc/productview/icons/rtc_fldr.ico
index 2080462..ad73051 100644
--- a/packages/xdc/productview/icons/rtc_fldr.ico
+++ b/packages/xdc/productview/icons/rtc_fldr.ico
Binary files differ
diff --git a/packages/xdc/productview/icons/txt.ico b/packages/xdc/productview/icons/txt.ico
new file mode 100644
index 0000000..cf98450
--- /dev/null
+++ b/packages/xdc/productview/icons/txt.ico
Binary files differ
diff --git a/packages/xdc/productview/icons/bios.gif b/packages/xdc/productview/icons/xdc.gif
similarity index 100%
rename from packages/xdc/productview/icons/bios.gif
rename to packages/xdc/productview/icons/xdc.gif
Binary files differ
diff --git a/packages/xdc/rov/Model.xs b/packages/xdc/rov/Model.xs
index f0f2217..c48640d 100644
--- a/packages/xdc/rov/Model.xs
+++ b/packages/xdc/rov/Model.xs
@@ -30,17 +30,12 @@
                          this.xmlVers + ", client version " + xmlVers + "."));
     }
     
+    /* Store off the objects passed in */
     this.$private.sym = sym;
     this.$private.mem = mem;
     this.$private.callBack = callBack;
-    
-    callBack.updateStartupProgress(60, "Loading ROV recap file ...");
-    
     this.$private.recap = recap;
     
-    /* Create and initialize the object file reader. */
-    var ofReader = initOFReader(executable);
-       
     xdc.useModule('xdc.rov.support.ScalarStructs');
     
     /* Store off the list of all modules in the recap file */
@@ -61,6 +56,7 @@
         
     Program.$$bind('$modules', this.$private.recap.$modules);
     
+    /* Notify the CallBack that we are about to start loading the packages. */
     callBack.updateStartupProgress(120, "Loading packages ...");
     
     /* Indicates whether getModuleDesc has been called on all modules. */
@@ -105,8 +101,18 @@
     */
     
     Program.debugPrint("bitsPerChar = " + this.$private.recap.build.target.bitsPerChar);
+
+    /* 
+     * Create the StringReader for reading dynamic strings. Create this first
+     * in case the OFReader needs to fall back on it.
+     */
+    var strReader = initStringReader();
     
-    /* Bind the OFReader to Program for looking up strings. */
+    /* Create and initialize the object file reader. */
+    var ofReader = initOFReader(executable);  
+    
+    /* Bind the OFReader and StringReader to Program for looking up strings. */
+    Program.$$bind('strReader', strReader);
     Program.$$bind('ofReader', ofReader);
     
     /* 
@@ -150,18 +156,49 @@
 }
 
 /*
+ *  ======== initStringReader ========
+ *  Creates a StringReader instance and saves it to the Model's $private
+ *  object.
+ */
+function initStringReader()
+{
+    var Model = xdc.useModule('xdc.rov.Model');
+    xdc.loadPackage('xdc.rov');
+
+    /* Retrieve the MemoryImage java object. */
+    var memReader = Model.getMemoryImageInst();
+    
+    /* Create a StringReader instance using the memory reader instance. */
+    var strReader = new xdc.jre.xdc.rov.StringReader(memReader);
+    
+    /* Store the StringReader in the Model's $private object. */
+    Model.$private.strReader = strReader;
+    
+    return (strReader);
+}
+
+/*
  *  ======== initOFReader ========
+ *  Creates and initializes the object file reader. 
+ *
+ *  The StringReader should be initialized first; if anything goes wrong
+ *  creating the object file reader, we fall back on the string reader.
  */
 function initOFReader(executable)
 {
     var Model = xdc.useModule('xdc.rov.Model');
-    
+
     /* Retrieve the class name of the binary parser to use */
     var binaryParser = Model.$private.recap.build.target.binaryParser;
-
+   
+    var ofReader;
+    
+    /* Make sure the target defines a binary parser. */
+    if (binaryParser != undefined) {
+        try {
     /* Parse the package name from the class name so we can load it. */
-    var parserPackage = binaryParser.substring(0, 
-                                               binaryParser.lastIndexOf('.'));
+            var parserPackage = 
+                binaryParser.substring(0, binaryParser.lastIndexOf('.'));
     
     /* Load the parser's package */
     xdc.loadPackage(parserPackage);
@@ -170,11 +207,32 @@
     var binaryParserClass = Packages[binaryParser];
 
     /* Create an instance of the ofReader */
-    var ofReader = new binaryParserClass();
+            ofReader = new binaryParserClass();
     
     /* Initialize the OFReader */
     ofReader.parse(executable);
-    
+        }
+        /* 
+         * If there was a problem creating the OFReader, use the 
+         * StringReader instead. 
+         */
+        catch (e) {
+            print("Caught an exception while initializing the object " +
+                  "file reader:\n" + e);
+            ofReader = Model.$private.strReader;
+        }
+    }
+    /* 
+     * If the target doesn't define an object file reader, use the
+     * string reader. 
+     */
+    else {
+        print("The target does not specify an object file reader; using the " +
+              "dynamic string reader instead.");
+        ofReader = Model.$private.strReader;
+    }
+
+    /* Store the object file reader in the Model. */
     Model.$private.ofReader = ofReader;
     
     /* Initialize the formatter's OFReader */
@@ -183,31 +241,6 @@
     return (ofReader);
 }
  
-function initStringReader()
-{
-    var Model = xdc.useModule('xdc.rov.Model');
-    
-    var memReader = Model.getIOFReaderInst();
-    
-    xdc.loadPackage('xdc.rov');
-    xdc.loadPackage('xdc.rta'); // Need RTA for IOFReader interface    
-    // TODO - This API should work, 
-    //var javaMemReader = memReader.getJavaImp();
-    
-    var javaMemReader = new xdc.jre.xdc.rov.IMemoryImage(
-        {
-            readMaus: function readMaus(addr, count, addrCheck) {
-                return (memReader.readMaus(addr, count, addrCheck));
-            },
-            readBytes: function readBytes(addr, count, addrCheck) {
-                return (memReader.readBytes(addr, count, addrCheck));
-            }
-        });
-    
-    var strReader = new xdc.jre.xdc.rov.StringReader(javaMemReader);
-    Model.$private.strReader = strReader;
-}
-
 /*
  *  ======== reset ========
  */
diff --git a/packages/xdc/rov/Program.xdc b/packages/xdc/rov/Program.xdc
index b9277c7..b52dc6b 100644
--- a/packages/xdc/rov/Program.xdc
+++ b/packages/xdc/rov/Program.xdc
@@ -210,6 +210,21 @@
     String fetchString(Ptr addr, Bool addrCheck = true);
     
     /*!
+     *  ======== fetchStaticString ========
+     *  Retrieves a static string from the executable.
+     *
+     *  This API makes use of an object file reader to improve the string
+     *  reading performance--it reads the string from the file rather than
+     *  performing a target memory read. For this reason, it should only be
+     *  used on static strings and not dynamic ones.
+     *
+     *  @param(addr)  Address of the string.
+     *
+     *  @a(Returns)  Requested string.
+     */
+    String fetchStaticString(Ptr addr);
+    
+    /*!
      *  ======== getModuleConfig ========
      *  Get a module's configuration state
      *
diff --git a/packages/xdc/rov/Program.xs b/packages/xdc/rov/Program.xs
index a611f6d..a274dc6 100644
--- a/packages/xdc/rov/Program.xs
+++ b/packages/xdc/rov/Program.xs
@@ -739,11 +739,19 @@
  */
 function fetchString(addr, addrCheck)
 {
-    // TODO - What to do about addrCheck?
-    return (Program.ofReader.findString(Number(addr)));
+    return (Program.strReader.findString(Number(addr), addrCheck));
 }
 
 /*
+ *  ======== fetchStaticString ========
+ *  Retrieves the string at the specified address using an object file reader.
+ */
+function fetchStaticString(addr)
+{
+    return (Program.ofReader.findString(Number(addr)));
+}
+ 
+/*
  *  ======== getPrivateData ========
  */
 function getPrivateData(modName) {
diff --git a/packages/xdc/rov/StateReader.xs b/packages/xdc/rov/StateReader.xs
index b6bae7d..06c45fa 100644
--- a/packages/xdc/rov/StateReader.xs
+++ b/packages/xdc/rov/StateReader.xs
@@ -35,7 +35,7 @@
     }
     
     /* Look up the Module state structure and fetch it. */
-    mod.addr = $addr(symTable.getSymbolValue('_' + mod.name.replace(/\./g, '_') + 
+    mod.addr = $addr(symTable.getSymbolValue(mod.name.replace(/\./g, '_') + 
                                        '_Module__state__V'));
     var modState = strDec.fetchStruct(mod.useMod.Module_State,
                                       Number(mod.addr), true);
@@ -85,9 +85,8 @@
     var Types = xdc.module('xdc.runtime.Types');
     
     /* Retrieve the module header, which points to all of the intstances. */
-    var modHdrSym = '_' + mod.name.replace(/\./g, '_') + '_Module__root__V';
-    var modHdrAddr = symTable.getSymbolValue('_' + mod.name.replace(/\./g, '_')
-                                         + '_Module__root__V');
+    var modHdrSym = mod.name.replace(/\./g, '_') + '_Module__root__V';
+    var modHdrAddr = symTable.getSymbolValue(modHdrSym);
     var modHdr = strDec.fetchStruct(Types.ModHdr, Number(modHdrAddr), true);
 
     /* Create an array of the addresses of all of the static instances. */
diff --git a/packages/xdc/rov/StringReader.java b/packages/xdc/rov/StringReader.java
index 75ac5df..8bd48b9 100644
--- a/packages/xdc/rov/StringReader.java
+++ b/packages/xdc/rov/StringReader.java
@@ -34,8 +34,8 @@
 	 *  implementation does not support this--it would need to handle the case
 	 *  where a string is at the end of a data section, and the read goes past the
 	 *  end of the data section due to nChar.
-	 */
-	public String findString(long addr) {
+	 */    
+	public String findString(long addr, boolean addrCheck) {
 	    /* String to return. */
 	    String res = "";
 	    
@@ -49,7 +49,7 @@
 	    	
 	    	/* Read nChars */
 	        try {
-	        	buf = memReader.readMaus(a, nChars, true);
+	        	buf = memReader.readMaus(a, nChars, addrCheck);
 	        }
 	        catch (Exception e) {
 	        	return (res);
@@ -69,6 +69,16 @@
 	}
 
 	/*
+     *  ======== findString ========
+     *  findString API to satisfy the IOFReader interface.
+     *  This API simply calls findString with 'false' for the address check.
+     */
+    public String findString(long addr)
+    {
+        return (findString(addr, false));
+    }
+    
+	/*
 	 * ======== parse ========
 	 * (non-Javadoc)
 	 * @see xdc.rta.IOFReader#parse(java.lang.String)
diff --git a/packages/xdc/rov/StructureDecoder.xs b/packages/xdc/rov/StructureDecoder.xs
index 5d1cfa2..8c1f490 100644
--- a/packages/xdc/rov/StructureDecoder.xs
+++ b/packages/xdc/rov/StructureDecoder.xs
@@ -311,16 +311,34 @@
             type.isEnum = fieldType[0] == 'N';
             type.isEncoded = fieldType[0] == 'E';
 
-            /* Handle enums and encoded types specially */
-            if (type.isEnum || type.isEncoded) {
-                tname = 't_Int';
+            /* Determine the size and alignment of the type. */
+            
+            /* 
+             * The type of an enum is not always an int. A type can be 
+             * specified by the user. Or, on some targets, the compiler may
+             * 'pack' the enum and choose the smallest possible type to hold
+             * the values.
+             */
+            if (type.isEnum) {
+                var stdType = $$getEnumType(fieldType, 
+                                            this.$private.targConfig);
+                type.size = stdType.size;
+                type.align = stdType.align;
             }
+            /*
+             * TODO - An encoded type is not necessarily always an int.
+             */
+            else if (type.isEncoded) {
+                tname = 't_Int';
+                type.size = this.$private.targConfig.stdTypes[tname].size;
+                type.align = this.$private.targConfig.stdTypes[tname].align;
+            }
+            /* For all other scalars, the type is specified by the string. */
             else {
                 tname = 't_' + fieldType.substring(1);
-            }            
-                    
             type.size = this.$private.targConfig.stdTypes[tname].size;
             type.align = this.$private.targConfig.stdTypes[tname].align;
+            }            
             
             /* Pointer types are all presented as addresses */
             type.isAddr = (tname == 't_Ptr' || tname == 't_Fxn' ||
@@ -332,8 +350,8 @@
         }
         
         default: {
-            throw (new Error("Unknown type code '" + fieldType
-                + "'; can't decode value"));
+            throw (new Error("Unknown type code '" + fieldType +
+                             "'; can't decode value"));
         }
     }
 }
@@ -447,7 +465,19 @@
     
     /* For Enums, return an Enum object. */
     if (type.isEnum) {
-        return ($$Enum(xdc.om[type.fldType.substring(1)], null, val));
+        /* 
+         * First, parse the type string for the name of the enum. 
+         */
+        var index = type.fldType.indexOf(';');
+        var enumName;
+        if (index == -1) {
+            enumName = type.fldType.substring(1);
+    }
+        else {
+            enumName = type.fldType.substring(1, index);
+        }
+        
+        return ($$Enum(xdc.om[enumName], null, val));
     }
 
     return (val);
diff --git a/packages/xdc/rov/server/Main.xs b/packages/xdc/rov/server/Main.xs
index 6d3be13..70f9e84 100644
--- a/packages/xdc/rov/server/Main.xs
+++ b/packages/xdc/rov/server/Main.xs
@@ -56,10 +56,18 @@
     var SymbolTable = xdc.useModule('xdc.rov.server.DSSymbolReader');
     var symInst = SymbolTable.create(controllerIndex);
 
+    /* Create the call back */
+    Program.debugPrint('Creating ICallBack Instance');
+    var CallBack = xdc.useModule('xdc.rov.server.DSCallBack');
+    var callBack = CallBack.create(controllerIndex);
+    
+    /* Notify the CallBack that we are loading the recap file. */
+    callBack.updateStartupProgress(60, "Loading ROV recap file ...");
+    
     /* Locate the Recap file */
-    var recapFile = "";
+    var recap;
     try {
-        recapFile = findRecap(executable, symInst);
+        recap = getRecap(executable, symInst);
     }
     catch (e) {
         var msg = e.message;
@@ -78,8 +86,37 @@
         return;
     }
    
-    /* Load the recap capsule */
-    var recap = xdc.loadCapsule(recapFile);
+    /*
+     * Ensure that the stdTypes array includes the t_Size type.
+     * This is done to preserve compatibility with applications built with
+     * older tools.
+     * This code can be removed when XDC tools no longer supports applications
+     * built with:
+     *   - XDCtools older than 3.15.04.70
+     *   - BIOS 5 older than 5.41.00.06
+     */
+    if (recap.build.target.stdTypes['t_Size'] === undefined) {
+        var mapTo;
+    
+        var targName = recap.build.target.name;
+        
+        /* For these named targets, t_Size maps to t_Int32. */
+        if ((targName == "C28") ||
+            (targName == "C28_large") ||
+            (targName == "C28_float") ||
+            (targName == "C55_huge")) {
+            mapTo = "t_Int32";
+        }
+        /* For all other targets, it maps to t_Int. */
+        else {
+            mapTo = "t_Int";
+        }
+        
+        recap.build.target.stdTypes['t_Size'] = {
+            size: recap.build.target.stdTypes[mapTo].size,
+            align: recap.build.target.stdTypes[mapTo].align
+        };
+    }
     
     /* Get a handle to the ROV Controller */
     controller = xdc.jre.com.ti.dvt.server4.ControllerMap.getController(controllerIndex);
@@ -100,11 +137,6 @@
     /* Create the MemoryImage instance */
     var memInst = new Packages.xdc.rov.MemoryImage(iMemInst, endian, 
                                                    bitsPerChar);
-
-    /* Create the call back */
-    Program.debugPrint('Creating ICallBack Instance');
-    var CallBack = xdc.useModule('xdc.rov.server.DSCallBack');
-    var callBack = CallBack.create(controllerIndex);
        
     Program.debugPrint('Starting ROV Model');
     var Model = xdc.useModule('xdc.rov.Model');    
@@ -693,17 +725,15 @@
 }
 
 /*
- *  ======== findRecap ========
+ *  ======== getRecap ========
  *  This API does not catch any exceptions, so it should be called from a 
  *  try / catch block in 'run'.
  */
-function findRecap(executable, symInst)
+function getRecap(executable, symInst)
 {
     var Program = xdc.useModule('xdc.rov.Program');
     
-    Program.debugPrint('Retrieving Recap File');
-    
-    var recapFile = "";
+    Program.debugPrint('Retrieving Recap File');  
     
     /* First check if this is a BIOS 5 executable */
     if (symInst.getSymbolValue("BIOS_start") != -1) {
@@ -721,15 +751,23 @@
          * the LOG view.
          */
         xdc.loadPackage('ti.bios.rta');
+        
+        /* Load the recap */
+        var recap = xdc.loadCapsule(recapFile);
+        
+        return (recap);
     }
+    
     /* Otherwise, check if it is a RTSC app */
-    else {
+    
         /* Use the xdc.rta.Recap class to find the recap file. */
         xdc.loadPackage('xdc.rta');
         recapFile = Packages.xdc.rta.Recap.locateRecap(executable, ".rov.xs");
         
         Program.debugPrint("Found RTSC recap file: " + recapFile);
-    }
     
-    return (recapFile);
+    /* Load the recap */
+    var recap = xdc.loadCapsule(recapFile);
+    
+    return (recap);
 }
\ No newline at end of file
diff --git a/packages/xdc/rta/Decoder.java b/packages/xdc/rta/Decoder.java
index f7f0e01..d2787dc 100644
--- a/packages/xdc/rta/Decoder.java
+++ b/packages/xdc/rta/Decoder.java
@@ -23,6 +23,14 @@
 
 /*
  *  ======== Decoder ========
+ *  This class decodes xdc.runtime.Log.Event records from raw target bytes.
+ *  The records are decoded into HostEvent objects from which the event message
+ *  can be retrieved.
+ *  
+ *  The Decoder requires a MetaData object to provide information about the
+ *  target used for decoding the raw bytes, as well as for retrieving the
+ *  mapping of event ids to messages. See xdc.rta.MetaData.
+ *  
  */
 public class Decoder
 {   
@@ -33,6 +41,8 @@
     
     /*
      *  ======== Decoder ========
+     *  If the Decoder is constructed with a MetaData instance, then it is
+     *  initialized and ready to go.
      */
     public Decoder(MetaData meta)
     {
@@ -49,17 +59,20 @@
     public Decoder()
     {
     }
-    
+
     /*
      *  ======== init ========
-     *  Initializes the decoder for use.
+     *  Initializes the decoder for use. The Decoder can be initialized by
+     *  either passing a MetaData instance to the constructor or by using one
+     *  of the parse APIs. This API contains the common initialization code.
      */
     private void init(MetaData meta)
     {
         this.meta = meta;
         
         /* 
-         * Create the underlying target decoder and encoder.
+         * Create the underlying target decoder and encoder for working with
+         * target bytes. 
          */
         targDecoder = new TargetDecoder(meta.getEndianess(), meta.getBitsPerChar());
         targEncoder = new TargetEncoder(meta.getEndianess(), meta.getBitsPerChar());
@@ -67,6 +80,7 @@
     
     /*
      *  ======== getXMLFromExec ========
+     *  Retrieves the path to a given application's RTA XML file.
      */
     public static String getXMLFromExec(String executable) throws Exception
     {
@@ -84,6 +98,7 @@
 
     /*
      *   ======== parseFromExec ========
+     *   Initializes the Decoder for the given executable.
      */
     public String parseFromExec(String executable) throws Exception
     {
@@ -100,6 +115,8 @@
     
     /*
      *  ======== parse ========
+     *  Initializes the Decoder for 'executable' given the path
+     *  to the RTA XML file.
      */
     public String parse(String xmlFile, String executable)
         throws java.lang.InstantiationException,
@@ -119,13 +136,18 @@
     
     /*
      *  ======== apply ========
-     *  Decodes the raw target bytes into a HostEvent.
+     *  Decodes the raw target bytes of a single event record into a HostEvent.
      */
     public HostEvent apply(byte targetEventRec[])
     {
         return (apply(targetEventRec, 0));
     }
     
+    /*
+     *  ======== apply ========
+     *  Decodes the raw target bytes of a single event record at the given
+     *  offset. Returns a HostEvent object.
+     */
     public HostEvent apply(byte targetEventRec[], int offset)
     {
     	/* Create a host event object to store the decoded event. */
@@ -224,14 +246,19 @@
     
     /*
      *  ======== decodeBytes ========
+     *  This is a convenience method which exposes the TargetDecoder's
+     *  'decodeBytes' API.
      */
-    public long decodeBytes(byte buffer[], int offset, int size, boolean signed)
+    public long decodeBytes(byte buffer[], int offset, int size, 
+                            boolean signed)
     {
         return (this.targDecoder.decodeBytes(buffer, offset, size, signed));
     }
     
     /*
      *  ======== encodeArg ========
+     *  This is a convenience method which exposes the TargetEncoder's
+     *  'encodeBytes' API.
      */
     public void encodeArg(byte buf[], int offset, long arg, int size) 
     {
@@ -240,7 +267,7 @@
     
     /*
      *  ======== encode ========
-     *  Encodes a HostEvent into target bytes.
+     *  Encodes a HostEvent back into target bytes.
      */
     public void encode(HostEvent evt, byte[] buf, int offset)
     {
diff --git a/packages/xdc/rta/HostEvent.java b/packages/xdc/rta/HostEvent.java
index 687e5ba..d408186 100644
--- a/packages/xdc/rta/HostEvent.java
+++ b/packages/xdc/rta/HostEvent.java
@@ -14,11 +14,21 @@
  */
 package xdc.rta;
 
+import java.util.Arrays;
 import java.util.Comparator;
-import java.util.regex.*;
 
 /*
  *  ======== HostEvent ========
+ *  This class is a host representation of a target event record.
+ *  
+ *  The HostEvent is intended as a generic representation of an XDC log event. 
+ *  Different ILogger implementations may have different record formats on the
+ *  target, but all XDC log decoders should return a HostEvent object.
+ *  
+ *  The HostEvent class is responsible for decoding a record's module ID into
+ *  a module name, and the record's event ID into its message. To do this, the
+ *  HostEvent requires a handle to an implementation of the IEventMetaData
+ *  interface. See xdc.rta.IEventMetaData.
  */
 public class HostEvent
 {
@@ -30,13 +40,18 @@
     public long sequenceNum;    /* 32-bit sequence number */
     public long timestamp;      /* 64-bit timestamp */
     
+    /* Address of the format string for Log_print records. */
     public long formatAddr;
     
     private IEventMetaData meta;
+    
+    /* Object file reader for retrieving strings for Log_print records. */
     private IOFReader ofReader = null;
     
     /*
      *  ======== HostEvent ========
+     *  The HostEvent requires an IEventMetaData implementation to decode
+     *  the record's event message.
      */
     public HostEvent(IEventMetaData meta)
     {
@@ -53,6 +68,11 @@
     
     /*
      *  ======== getFormatStr ========
+     *  Retrieves the unformatted message for this event.
+     *  
+     *  If this is a Log_print record, the message is retrieved using an object
+     *  file reader. Otherwise, the message is retrieved from the 
+     *  IEventMetaData.
      */
     public String getFormatStr()
     {
@@ -70,26 +90,48 @@
     
     /*
      *  ======== getEventMsg ========
+     *  Retrieves the formatted message for this event.
      */
     public String getEventMsg()
     {
       	String fmt = getFormatStr();
         
-        /* For non-Log_prints */
-    	if (this.eventId != 0) {
+      	/* 
+      	 * If the format string cannot be found, display the record's raw data.
+      	 */
             if (fmt == null) {
-                String result = "Log_write(eventId: " + this.eventId;
-                for (int i = 0; i < this.args.length; i++) {
+      	    String result = "";
+      	    int i = 0;
+      	    
+      	    /* If the record is a Log_print... */
+      	    if (this.eventId == 0) {
+      	        result += "Log_print(0x" + Long.toHexString(this.formatAddr);
+      	        
+      	        /* Arg 0 is the format address, so start with arg 1. */
+      	        i = 1;
+      	    }
+      	    /* If the record is a Log_write... */
+      	    else {
+      	        result += "Log_write(eventId: " + this.eventId;
+      	    }
+
+      	    /* Add the arguments */
+      	    for (; i < this.args.length; i++) {
                     result += ", 0x" + Integer.toHexString(this.args[i]);
                 }
+      	    
                 return (result + ")");
             }
+        
+      	/* If we do have the format string... */
+      	
+        /* If this record is an event, not a Log_print... */
+    	if (this.eventId != 0) {
+    	    /* Format the message and return. */
             return (Formatter.doPrint(fmt, this.args, meta.getTargetArgSize()));
         }
-        
-        /* For Log_prints... */
-        /* If we have an of reader and can find the format ... */
-        if (fmt != null) {
+    	/* If this record is a Log_print... */
+    	else {
             /* 
              * Arg0 is the format string address, so create a new args
              * array that shifts all of the args to the left by one.
@@ -99,20 +141,16 @@
                 formatArgs[i - 1] = this.args[i];
             }
             
-            return (Formatter.doPrint(fmt, formatArgs));
+            /* Format the message and return. */
+            return (Formatter.doPrint(fmt, formatArgs, meta.getTargetArgSize()));
         }
-
-        /* otherwise, display the raw data as a last resort */
-        String result = "Log_print(0x"
-            + Long.toHexString(this.formatAddr);
-        for (int i = 1; i < this.args.length; i++) {
-            result += ", 0x" + Integer.toHexString(this.args[i]);
         }
-        return (result + ")");
-    }
 
     /*
      *  ======== getEventName ========
+     *  Returns this record's event name.
+     *  
+     *  For Log_print records, this returns "xdc.runtime.Log_print".
      */
     public String getEventName()
     {
@@ -130,6 +168,7 @@
 
     /*
      *  ======== getModuleName ========
+     *  Returns the name of the module that this record was logged from.
      */
     public String getModuleName()
     {
@@ -138,6 +177,8 @@
 
     /*
      *  ======== toString ========
+     *  Returns a string representation of the record.
+     *    moduleName: eventName: event message
      */
     public String toString()
     {
@@ -165,12 +206,24 @@
     
     /*
      *  ======== getRecordSize ========
+     *  Returns the target size of this record.
      */
     public int getRecordSize()
     {
         return (meta.getTargetEventRecSize());
     }
     
+    /*
+     *  ======== sort ========
+     *  Sorts an array of HostEvent records in place by sequence number.
+     */
+    public void sort(HostEvent[] evtArr)
+    {
+        if (evtArr.length != 0) {
+            Arrays.sort(evtArr, evtArr[0].new CompareRecs());
+        }
+    }
+    
     /* 
      *  ======== Comparator ========
      *  Comparator for sorting records based on sequence number.
diff --git a/packages/xdc/rta/IEventMetaData.java b/packages/xdc/rta/IEventMetaData.java
index 5cac188..cb39436 100644
--- a/packages/xdc/rta/IEventMetaData.java
+++ b/packages/xdc/rta/IEventMetaData.java
@@ -1,55 +1,60 @@
 package xdc.rta;
 
-import org.w3c.dom.Node;
-
 /*
  *  ======== IEventMetaData ========
  *  This interface is used by a HostEvent to retrieve what it needs to decode
- *  itself. 
+ *  the record that it represents.
+ *  
+ *  The interface provides the following information:
+ *    - Object file reader for looking Log_print format strings
+ *    - Event id to event name and event message mapping
+ *    - Module id to module name mapping
+ *    - Target IArg size (for formatting)
+ *    - Target record size (to support HostEvent.getRecordSize)
+ *  
  *  An interface has been defined here to allow for multiple implementations.
  *  In RTA, the interface is implemented by the xdc.rta.MetaData class which
- *  wraps the RTA XML file.
- *  In ROV, the interface is implemented by xdc.runtime.Log APIs which 
- *  reference the ROV recap file.
+ *  wraps the RTA XML file. In ROV, the interface is implemented by 
+ *  xdc.runtime.Log APIs which reference the ROV recap file. This allows the
+ *  HostEvent class to be shared between RTA and any ROV views which deal with
+ *  XDC log records.
  */
 public interface IEventMetaData {
     
     /*
      *  ======== getOFReader ========
+     *  Returns an object file reader instance to use for retrieving Log_print
+     *  format strings.
      */
     public IOFReader getOFReader();
 	
     /*
      *  ======== lookupEventMessage ========
-     *  Returns the format string for the message with the given name.
+     *  Returns the unformatted event message for the specified event.
      */
     public String lookupEventMessage(int eventId);
 
     /*
      *  ======== getTargetArgSize ========
-     *  Returns the target size of a record argument in bytes (not MAUs).
+     *  Returns the target size of the IArg type in bytes (not MAUs).
      */
     public int getTargetArgSize();
 		
     /*
      *  ======== lookupEventName ========
+     *  Retrieve the name of the event with the specified id.
      */
     public String lookupEventName(int eventId);
 
     /*
      *  ======== lookupModuleName ========
+     *  Retrieve the name of the module with the specified id.
      */
     public String lookupModuleName(int modId);
 
     /*
      *  ======== getTargetEventRecSize ========
-     *  Returns the record size in bytes (not MAUs).
+     *  Returns the size of a record on the target in bytes (not MAUs).
      */
     public int getTargetEventRecSize();
-	
-    /*
-     *  ======== getLoggerMetaArgs ========
-     *  Returns the meta data associated with the specified logger instance.
-     */
-    public Node getLoggerMetaArgs(int loggerId);
 }
diff --git a/packages/xdc/rta/MetaData.java b/packages/xdc/rta/MetaData.java
index 800b9d1..1c388cd 100644
--- a/packages/xdc/rta/MetaData.java
+++ b/packages/xdc/rta/MetaData.java
@@ -25,33 +25,46 @@
 
 /*
  *  ======== MetaData ========
+ *  Wrapper for the RTA XML file generated for every RTSC application.
+ *  
+ *  The RTA XML file contains information about the application's target,
+ *  loggers, modules, and events. The MetaData class provides APIs for
+ *  accessing this information.
+ *  
+ *  The MetaData object must be initialized using one of the parse APIs.
  */
 public class MetaData implements IEventMetaData
 {
-    private HashMap<String, Integer> modNameToId = null;
-    private HashMap<String, Integer> evtNameToId = null;
-    public int argSize = -1; // Target arg size in bytes
+    /* Target information */
+    private int argSize = -1; // Target arg size in bytes
     private int bitsPerChar = -1;
     private int eventSize = -1;
     private String targetName = "";
     private TargetType.Endianess endian;
-    
-    HashMap<Integer, String> modIdToName = null;
-    HashMap<Integer, String> evtIdToName = null;
-    HashMap<Integer, String> evtIdToMsg = null;
 
+    /* Modules */
+    private HashMap<Integer, String> modIdToName = null;
+    private HashMap<String, Integer> modNameToId = null;
     private HashMap<String, DiagConfig> modNameToDiags = null;
     private HashMap<String, String> modNameToLogger = null;
-    private HashMap<String, Integer> loggerToId = null;
-    
+
+    /* Events */
+    private HashMap<Integer, String> evtIdToName = null;
+    private HashMap<String, Integer> evtNameToId = null;
+    private HashMap<Integer, String> evtIdToMsg = null;
+
+    /* Loggers */
     private String[] loggerNames = null;
+    private HashMap<String, Integer> loggerToId = null;
     private Vector<Logger> loggers = null;
 
     /* Object file reader for looking up Log_print strings */
-    public IOFReader ofReader = null;
+    private String binaryParserClass = "";
+    private IOFReader ofReader = null;
         
     /*
      *  ======== getXMLFromExec ========
+     *  Retrieves the path to a given application's RTA XML file.
      */
     public static String getXMLFromExec(String executable) throws Exception
     {
@@ -60,6 +73,8 @@
     
     /*
      *   ======== parseFromExec ========
+     *   Retrieves the RTA XML file for the given executable and uses it to
+     *   initialize the MetaData object.
      */
     public String parseFromExec(String executable) throws Exception
     {
@@ -103,6 +118,8 @@
     
     /*
      *  ======== parse ========
+     *  Initialize the MetaData instance with the given paths to the RTA XML
+     *  file and executable.
      */
     public String parse(String xmlFile, String executable)
         throws java.lang.InstantiationException,
@@ -126,6 +143,7 @@
         
         Document doc = null;
         
+        /* Parse the XML file into a Document object. */
         try {
             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
             DocumentBuilder builder = factory.newDocumentBuilder();
@@ -151,61 +169,34 @@
         parseLoggers(doc);
         
         /* Retrieve the mapping of modules to ids and the module properties. */
-        res = parseModules(doc, xmlFile);
-        if (res != "") {
-            return (res);
-        }
+        parseModules(doc, xmlFile);
         
         /* Retrieve the event information. */
         res = parseEventMap(doc, xmlFile);
         if (res != "") {
             return (res);
         }
-        
-        if (executable != null) {
-            try {
-                /* Use Coff reader by default */
-                /* TODO - Read XML file for the object file parser to use. */
-                Class c = Class.forName("ti.targets.omf.cof.Coff");
-                ofReader = (IOFReader) c.newInstance();
-            
-                String err = ofReader.parse(executable);
-                if (err != "") {
-                    System.err.println("Failed to parse " + executable
-                        + ": " + err);
-                    ofReader = null;
-                }
-                else {
-                    /* Close the file. Reader will re-open it automatically to
-                     * read strings.
-                     */
-                    ofReader.close();
-                }
-            }
-            catch (IOException e) {
-                System.err.println("Failed to parse object file.");
-                e.printStackTrace();
-            }
-            
-            /* 
-             * Set the Formatter's OFReader so that it can perform String
-             * lookups (%s) when formatting printf strings.
-             */
-            Formatter.setOFReader(ofReader);
-        }        
 
+        /* Initialize the object file reader. */
+        initOfReader(executable);
+        
         return ("");
     }
     
     /*!
      *  ======== parseTargetProps ========
+     *  Helper function to retrieve all of the target properties from the
+     *  RTA XML file.
      */
     private String parseTargetProps(Document doc) 
     {
-        this.targetName = doc.getElementsByTagName("targetName").item(0).getFirstChild().getNodeValue();
+        /* Name of the target. */
+        this.targetName = getProperty(doc, "targetName");
             
         /* Get the target endianess. */
-        String endianStr = doc.getElementsByTagName("endian").item(0).getFirstChild().getNodeValue();
+        String endianStr = getProperty(doc, "endian");
+        
+        /* Convert the endianess to its enum form. */
         try {
             this.endian = TargetType.strToEndianess(endianStr);       
         }
@@ -213,19 +204,47 @@
             return (e.toString());
         }
         
-        this.bitsPerChar = Integer.parseInt(doc.getElementsByTagName("bitsPerChar").item(0).getFirstChild().getNodeValue());
-        this.argSize = Integer.parseInt(
-                    doc.getElementsByTagName("argSize").item(0).getFirstChild().getNodeValue());
-        this.eventSize = Integer.parseInt(
-                    doc.getElementsByTagName("eventSize").item(0).getFirstChild().getNodeValue());
+        /* Get the target's MAU size. */
+        this.bitsPerChar = Integer.parseInt(getProperty(doc, "bitsPerChar"));
         
-        /* Convert sizes from MAUs to bytes */
+        /* Get the MAU size of the IArg type, convert it to bytes. */
+        this.argSize = Integer.parseInt(getProperty(doc, "argSize"));
         this.argSize = this.argSize * (this.bitsPerChar / 8);
-        this.eventSize = this.eventSize * (this.bitsPerChar / 8);
+        
+        /* Get the MAU size of an event record, convert it to bytes. */
+        this.eventSize = Integer.parseInt(getProperty(doc, "eventSize"));
+        this.eventSize = this.eventSize * (this.bitsPerChar / 8);            
+        
+        /* Get the name of the object file reader class. */
+        this.binaryParserClass = getProperty(doc, "binaryParser"); 
         
         return ("");
     }
     
+    /*!
+     *  ======== getProperty ========
+     *  Helper function to retrieve the specified target property from the RTA
+     *  XML file.
+     *  
+     *  These target properties are single XML elements whose values are the
+     *  text content of the element.
+     */
+    public String getProperty(Document doc, String name) {
+        /* Retrieve this properties node */
+        Node n = doc.getElementsByTagName(name).item(0);
+        
+        /* Return the value of this property */
+        return (n.getFirstChild().getNodeValue());
+    }
+    
+    public String getProperty(Element elem, String name) {
+        /* Retrieve the property node. */
+        Node n = elem.getElementsByTagName(name).item(0);
+        
+        /* Return the value of this property */
+        return (n.getFirstChild().getNodeValue());
+    }
+        
     /*
      *  ======== parseLoggers ========
      *  Retrieve the list of loggers so that we have them in the same
@@ -241,11 +260,8 @@
             /* The log's id is its index in the list. */
             logger.id = i;
             
-            /* Get all of the logger's properties. */
-            NodeList loggerProps = elem.getChildNodes();
-            
             /* Preserve compatibility. Older XML files just have logger name. */
-            if (loggerProps.getLength() == 1) {
+            if (elem.getChildNodes().getLength() == 1) {
                 logger.name = elem.getTextContent();
                 loggers.add(logger);
                 this.loggerToId.put(logger.name, i);
@@ -253,23 +269,14 @@
                 continue;
             }
             
-            /* Retrieve all of the logger's properties */
-            for (int j = 0; j < loggerProps.getLength(); j++) {
-                Node n = loggerProps.item(j);
-                String nodeName = n.getNodeName(); 
-                /* Check for logger name */
-                if (nodeName.equals("name")) {
-                    logger.name = n.getTextContent();
-                }
-                /* Check for logger type */
-                else if (nodeName.equals("type")) {
-                    logger.type = n.getTextContent();
-                }
-                /* Check for logger buffer symbol */
-                else if (nodeName.equals("metaArgs")) {
-                    logger.metaArgs = n;
-                }
-                }
+            /* Get the logger name. */
+            logger.name = getProperty(elem, "name");
+
+            /* Get the logger type. */
+            logger.type = getProperty(elem, "type");
+            
+            /* Get the meta args. */
+            logger.metaArgs = elem.getElementsByTagName("metaArgs").item(0);
             
             /* Map id to logger and logger to id */
             loggers.add(logger);
@@ -288,25 +295,32 @@
      *  Parse the modMap, which maps module names to their id, logger,
      *  and diags settings.
      */
-    private String parseModules(Document doc, String xmlFile) 
+    private void parseModules(Document doc, String xmlFile) 
     {
+        /* Get all of the module nodes. */
         NodeList modMap = doc.getElementsByTagName("modMap");
+        
+        /* For each module... */
         for (int i = 0; i < modMap.getLength(); i++) {
-            Element elem = (Element)modMap.item(i);
+            Element elem = (Element) modMap.item(i);
+            
+            /* Get the module's name which is stored in the 'key' attribute. */
             String modName = elem.getAttribute("key");
-            NodeList children = elem.getChildNodes();
-            for (int j = 0; j < children.getLength(); j++) {
-                Node n = children.item(j); 
-                if (n.getNodeType() == 1) {
-                    if (n.getNodeName().equals("id")) {
-                        int id = Integer.parseInt(n.getTextContent());
+            
+            /* Get the module's id. */
+            int id = Integer.parseInt(getProperty(elem, "id"));
+            
+            /* Map the module's id to name and vice versa. */
                         this.modNameToId.put(modName, id);
                         this.modIdToName.put(id, modName);
-                    }
-                    else if (n.getNodeName().equals("logger")) {
-                        String loggerName = n.getTextContent();
                         
-                        /* Don't add modules with null logger. */
+            /* Get the module's logger. */
+            String loggerName = getProperty(elem, "logger");
+
+            /* 
+             * Map the module to its logger, but don't map modules with a
+             * null logger. 
+             */
                         if (!loggerName.equals("null")) {
                             /* Map module name to logger */
                             this.modNameToLogger.put(modName, loggerName);
@@ -316,37 +330,45 @@
                             Logger logger = loggers.get(loggerId);
                             logger.modules.add(modName);
                         }
-                    }
-                    else if (n.getNodeName().equals("diagsMask")) {
-                        String diagsMask = n.getTextContent();
+            
+            /* Get the module's initial diags mask. */
+            String diagsMask = getProperty(elem, "diagsMask");
+            
+            /* Create a DiagConfig object from the mask string */
                         DiagConfig diags = new DiagConfig(diagsMask);
-                        
+
+            /* Map the module to its diags mask. */
                         this.modNameToDiags.put(modName, diags);
-                    }                        
                 }
             }
-        }
         
-        return ("");
-    }
-    
     /*
      *  ======== parseEventMap ========
+     *  Helper function to retrieve all of the event information.
      */
     private String parseEventMap(Document doc, String xmlFile)
     {
-        /*
-         * Parse the event map.
-         */
+        /* Get all of the events. */
         NodeList evtMap = doc.getElementsByTagName("evtMap");
+        
+        /* For each event... */
         for (int i = 0; i < evtMap.getLength(); i++) {
-            Element elem = (Element)evtMap.item(i);
+            Element elem = (Element) evtMap.item(i);
+            
+            /* Get the event's name in the 'key' attribute */
             String name = elem.getAttribute("key");
-            int id = Integer.parseInt(
-                elem.getElementsByTagName("id").item(0).getFirstChild().getNodeValue());
+            
+            /* Get the event's id. */
+            int id = Integer.parseInt(getProperty(elem, "id"));
+            
+            /* Map the event name to id and vice versa. */
             this.evtNameToId.put(name, id);
             this.evtIdToName.put(id, name);
-            String msg = elem.getElementsByTagName("msg").item(0).getFirstChild().getNodeValue();
+            
+            /* Get the event's message. */
+            String msg = getProperty(elem, "msg");
+            
+            /* Map the event id to the event message. */
             try {
                 this.evtIdToMsg.put(id, java.net.URLDecoder.decode(msg, "UTF-8"));
             }
@@ -359,7 +381,57 @@
     }
     
     /*
+     *  ======== initOfReader ========
+     *  Initialize the object file reader used to retrieve Log_print format
+     *  strings.
+     *  
+     *  The object file reader class name comes from the RTA XML file.
+     */
+    private void initOfReader(String executable) 
+        throws java.lang.InstantiationException,
+               java.lang.ClassNotFoundException,
+               java.lang.IllegalAccessException
+    {
+        if (executable == null) {
+            return;
+        }
+        
+        try {
+            /* Instantiate the object file reader. */
+            Class<?> c = Class.forName(this.binaryParserClass);
+            ofReader = (IOFReader) c.newInstance();
+        
+            /* Initialize the object file reader. */
+            String err = ofReader.parse(executable);
+            if (err != "") {
+                System.err.println("Failed to parse " + executable
+                                   + ": " + err);
+                ofReader = null;
+                return;
+            }
+            else {
+                /* 
+                 * Close the file. Reader will re-open it automatically to
+                 * read strings.
+                 */
+                ofReader.close();
+            }
+        }
+        catch (IOException e) {
+            System.err.println("Failed to parse object file.");
+            e.printStackTrace();
+        }
+        
+        /* 
+         * Set the Formatter's OFReader so that it can perform String
+         * lookups (%s) when formatting printf strings.
+         */
+        Formatter.setOFReader(ofReader);
+    }
+    
+    /*
      *  ======== getBitsPerChar ========
+     *  Returns the MAU size for this target in bits.
      */
     public int getBitsPerChar()
     {
@@ -538,18 +610,27 @@
         return (this.endian);
     }
 
+    /*
+     *  ======== getDataTransportClass ========
+     */
     public String getDataTransportClass()
     {
         /* TODO - This should come from RTA XML file. */
         return ("ti.rta.rtdx.DataTransport");
     }
     
+    /*
+     *  ======== getControlTransportClass ========
+     */
     public String getControlTransportClass()
     {
         /* TODO - This should come from RTA XML file. */
         return ("ti.rta.rtdx.ControlTransport");
     }
     
+    /*
+     *  ======== getOFReader ========
+     */
     public IOFReader getOFReader()
     {
         return (ofReader);
diff --git a/packages/xdc/rta/Recap.java b/packages/xdc/rta/Recap.java
index cc93ff5..07bb712 100644
--- a/packages/xdc/rta/Recap.java
+++ b/packages/xdc/rta/Recap.java
@@ -16,7 +16,7 @@
  */
 package xdc.rta;
 
-import xdc.services.global.Vers;
+import xdc.services.global.What;
 import java.io.File;
 
 /*
@@ -27,7 +27,7 @@
     /*
      *  ======== locateRecap ========
      *  Finds the specified recap file for the given executable by running
-     *  the Vers utility on it to extract the path to the configuration.
+     *  the What utility on it to extract the path to the configuration.
      */
     public static String locateRecap(String executable, String extension) throws Exception
     {
@@ -37,9 +37,9 @@
         }    
     
         /* Extract the path from the executable. */
-        String line = Vers.getWhatString(executable);
+        String line = What.getWhatString(executable);
     
-        /* For non-RTSC executable, Vers returns "" */
+        /* For non-RTSC executable, What returns "" */
         if (line.equals("")) {
         	throw (new Exception("Can't extract RTSC configuration package path from '" + executable + "'"));
         }
diff --git a/packages/xdc/runtime/Assert__epilogue.h b/packages/xdc/runtime/Assert__epilogue.h
index a37573e..ad6c8a0 100644
--- a/packages/xdc/runtime/Assert__epilogue.h
+++ b/packages/xdc/runtime/Assert__epilogue.h
@@ -10,18 +10,26 @@
  *  Contributors:
  *      Texas Instruments - initial implementation
  * --/COPYRIGHT--*/
+
+/*
+ *  ======== xdc_runtime_Assert_getMask ========
+ *  Convert an id into a mask
+ */
+#define xdc_runtime_Assert_getMask(id) ( \
+    (id) ? ((id) & 0x0000FFFF & ~xdc_runtime_Diags_ASSERT) \
+         : xdc_runtime_Diags_INTERNAL \
+)
+
 /*
  *  ======== xdc_runtime_Assert_isTrue ========
  */
-#define xdc_runtime_Assert_isTrue( expr, id ) \
-    if (xdc_runtime_Diags_query(xdc_runtime_Diags_ASSERT)) { \
-        xdc_runtime_Diags_Mask mask = (id) ? \
-            ((id) & 0x0000FFFF & ~xdc_runtime_Diags_ASSERT) \
-            : xdc_runtime_Diags_INTERNAL; \
-        if ((!mask || xdc_runtime_Diags_query(mask)) && !(expr)) { \
-            xdc_runtime_Assert_raise__I(Module__MID, xdc_FILE__, __LINE__, (id)); \
-        } \
-    } \
+#define xdc_runtime_Assert_isTrue( expr, id ) (\
+    (xdc_runtime_Diags_query(xdc_runtime_Diags_ASSERT)) ? ( \
+        (((!xdc_runtime_Assert_getMask(id) || xdc_runtime_Diags_query(xdc_runtime_Assert_getMask(id))) && !(expr)) ? \
+            xdc_runtime_Assert_raise__I(Module__MID, xdc_FILE__, __LINE__, (id)) : (void)0) \
+    ) : (void)0)
+
+
 
 
 
diff --git a/packages/xdc/runtime/ILogger.xs b/packages/xdc/runtime/ILogger.xs
index f607a61..76e32da 100644
--- a/packages/xdc/runtime/ILogger.xs
+++ b/packages/xdc/runtime/ILogger.xs
@@ -11,11 +11,11 @@
  *      Texas Instruments - initial implementation
  * --/COPYRIGHT--*/
 
-/*
- *  ======== getMetaArgs ========
- *  For RTA MetaData. Default implementation.
- */
-function getMetaArgs(inst, instNum)
-{
-    return (null);
+/*
+ *  ======== getMetaArgs ========
+ *  For RTA MetaData. Default implementation.
+ */
+function getMetaArgs(inst, instNum)
+{
+    return (null);
 }
\ No newline at end of file
diff --git a/packages/xdc/runtime/Log__epilogue.h b/packages/xdc/runtime/Log__epilogue.h
index dfcbadb..bccc426 100644
--- a/packages/xdc/runtime/Log__epilogue.h
+++ b/packages/xdc/runtime/Log__epilogue.h
@@ -67,10 +67,10 @@
     xdc_runtime_Log_write4(evt, a1, a2, a3, 0)
 
 #define xdc_runtime_Log_write4(evt, a1, a2, a3, a4) \
-    if (Module__LOGDEF && xdc_runtime_Diags_query((evt))) { \
+    ((Module__LOGDEF && xdc_runtime_Diags_query(evt)) ? \
         xdc_runtime_Log_put4( ((evt) & 0xffff0000) | Module__MID, \
-            (a1), (a2), (a3), (a4)); \
-    } \
+            (a1), (a2), (a3), (a4)) : (void)0 \
+    )
 
 #define xdc_runtime_Log_write5(evt, a1, a2, a3, a4, a5) \
     xdc_runtime_Log_write8(evt, a1, a2, a3, a4, a5, 0, 0, 0)
@@ -80,10 +80,10 @@
     xdc_runtime_Log_write8(evt, a1, a2, a3, a4, a5, a6, a7, 0)
 
 #define xdc_runtime_Log_write8(evt, a1, a2, a3, a4, a5, a6, a7, a8) \
-    if (Module__LOGDEF && xdc_runtime_Diags_query((evt))) { \
+    ( (Module__LOGDEF && xdc_runtime_Diags_query(evt)) ? \
         xdc_runtime_Log_put8(((evt) & 0xffff0000) | Module__MID, \
-            (a1), (a2), (a3), (a4), (a5), (a6), (a7), (a8)); \
-    } \
+            (a1), (a2), (a3), (a4), (a5), (a6), (a7), (a8)) : (void)0 \
+    )
 
 /*
  *  ======== xdc_runtime_Log_print* ========
@@ -99,9 +99,9 @@
     xdc_runtime_Log_print3(mask, fmt, a1, a2, 0)
 
 #define xdc_runtime_Log_print3(mask, fmt, a1, a2, a3) \
-    if (Module__LOGDEF && xdc_runtime_Diags_query((mask))) { \
-        xdc_runtime_Log_put4(Module__MID, (IArg)fmt, (a1), (a2), (a3)); \
-    } \
+    ( (Module__LOGDEF && xdc_runtime_Diags_query(mask)) ? \
+        xdc_runtime_Log_put4(Module__MID, (IArg)fmt, (a1), (a2), (a3)) : (void)0 \
+    )
 
 #define xdc_runtime_Log_print4(mask, fmt, a1, a2, a3, a4) \
     xdc_runtime_Log_print6(mask, fmt, a1, a2, a3, a4, 0, 0)
@@ -109,8 +109,8 @@
     xdc_runtime_Log_print6(mask, fmt, a1, a2, a3, a4, a5, 0)
 
 #define xdc_runtime_Log_print6(mask, fmt, a1, a2, a3, a4, a5, a6) \
-    if (Module__LOGDEF && xdc_runtime_Diags_query((mask))) {    \
+    ( (Module__LOGDEF && xdc_runtime_Diags_query(mask)) ?    \
         xdc_runtime_Log_put8(Module__MID,                     \
-            (IArg)fmt, (a1), (a2), (a3), (a4), (a5), (a6), 0);  \
-    } \
+            (IArg)fmt, (a1), (a2), (a3), (a4), (a5), (a6), 0) : (void)0  \
+    )
     
diff --git a/packages/xdc/runtime/LoggerBuf.c b/packages/xdc/runtime/LoggerBuf.c
index 52fe423..9888d75 100644
--- a/packages/xdc/runtime/LoggerBuf.c
+++ b/packages/xdc/runtime/LoggerBuf.c
@@ -346,6 +346,22 @@
  *      0   - no entry in the log
  *      1,2 - read one or two complete entries (write4, write8)
  *      -1  - read one but there may be another
+ *
+ *  Below are some notes on the implementation.
+ *
+ *  Pointers:
+ *  - cureEntry points to the next entry to write
+ *  - endEntry points to the last entry (not past it)
+ *  - readEntry points to the entry that will be read on the next call to
+ *    getNextEntry. 
+ *
+ *  Edge cases:
+ *  - An extension record can be orphaned (the base can be missing)
+ *  - A base record cannot be missing its extension (the records are written in
+ *    order, so the base is always overwritten first)
+ *  - The serial number can wrap from 0xFFFFFFFF to 0x0.
+ *  - If a base record is at the end of the buffer, its extension may be at
+ *    the beginning.
  */
 Int LoggerBuf_getNextEntry(LoggerBuf_Object *obj, Log_EventRec *evtRec)
 {
diff --git a/packages/xdc/runtime/LoggerBuf.xdc b/packages/xdc/runtime/LoggerBuf.xdc
index 8e6c5f5..5e5fc4b 100644
--- a/packages/xdc/runtime/LoggerBuf.xdc
+++ b/packages/xdc/runtime/LoggerBuf.xdc
@@ -96,7 +96,9 @@
     metaonly struct BasicView {
         String label;
         Int lastSerial;
-        Bool enabledFlag;
+        Int numEntries;
+        String type;
+        Bool enabledFlag;  
     };
 
     metaonly struct RecordView {
diff --git a/packages/xdc/runtime/LoggerBuf.xs b/packages/xdc/runtime/LoggerBuf.xs
index 6db9e65..9a93763 100644
--- a/packages/xdc/runtime/LoggerBuf.xs
+++ b/packages/xdc/runtime/LoggerBuf.xs
@@ -99,7 +99,7 @@
     
     /* Create a new StopModeData structure to populate. */
     var data = new LoggerBuf.StopModeData();
-    data.bufferSymbol = "_xdc_runtime_LoggerBuf_Instance_State_" + 
+    data.bufferSymbol = "xdc_runtime_LoggerBuf_Instance_State_" + 
                        instNum + "_entryArr__A";;
     data.bufferSize = inst.numEntries * LoggerBuf.Entry.$sizeof();
     
@@ -108,12 +108,34 @@
  
 /*
  *  ======== viewInitBasic ========
- *  ROV code
+ *  Initializes the 'Basic' ROV instance view.
  */
 function viewInitBasic(view, obj)
 {
+    var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
+    
+    /* Retrieve the LoggerBuf instance's name */
     view.label = Program.getShortName(obj.$label);
-    view.lastSerial = obj.serial;
+    
+   /* 
+     * Determine the serial number of the last record, convert it to a
+     * sequential number.
+     */
+    view.lastSerial = ((obj.serial + 1) / 2) - 1;
+    
+    /* Display the configured number of entries. */
+    view.numEntries = obj.numEntries;
+    
+    /* Determine the type of the LoggerBuf, FIXED or CIRCULAR. */
+    if ((obj.advance == LoggerBuf.FULL) || 
+        (obj.advance == Number(LoggerBuf.BufType_FIXED))) {
+        view.type = "FIXED";
+    }
+    else {
+        view.type = "CIRCULAR";
+    }
+    
+    /* Show whether the LoggerBuf instance is currently enabled. */
     view.enabledFlag = obj.enabled;
 }
 
diff --git a/packages/xdc/runtime/LoggerBufDecoder.java b/packages/xdc/runtime/LoggerBufDecoder.java
index e52c4af..3b4fe8f 100644
--- a/packages/xdc/runtime/LoggerBufDecoder.java
+++ b/packages/xdc/runtime/LoggerBufDecoder.java
@@ -7,16 +7,32 @@
 import java.util.Vector;
 import java.util.HashMap;
 
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
+import org.w3c.dom.Element;
 
 /*
  *  ======== LoggerBufDecoder ========
  *  Decodes whole LoggerBuf buffers and returns an array of HostEvent objects.
  *
- *  This decoder is used to optimize the performance of the 
- *  xdc.runtime.LoggerBuf 'Records' ROV view, and is also used by stop-mode
- *  RTA.
+ *  This decoder is shared between ROV and RTA. In ROV, it is used to optimize  
+ *  the performance of the xdc.runtime.LoggerBuf 'Records' ROV view. In RTA, it
+ *  is used to support the stop mode collection of records from LoggerBuf 
+ *  instances.
+ *  
+ *  This decoder contains some APIs and fields which are used by StopMode RTA 
+ *  but not by ROV. This is because in ROV the LoggerBuf 'Records' view
+ *  performs the memory reads and passes the buffers into the decoder, but in
+ *  RTA the LoggerBufDecoder is responsible for reading the buffers.
+ *  
+ *  ROV has easy access to all of the LoggerBuf instance state structures and
+ *  uses the 'entryArr' and 'numEntries' fields to locate and read in the 
+ *  target buffers. The LoggerBuf 'Records' ROV view performs the memory read
+ *  and passes the buffer into the LoggerBufDecoder to decode.
+ *  
+ *  In RTA, the LoggerBufDecoder is responsible for locating and reading the
+ *  memory buffers. The 'initStopMode' API is called to initialize the 
+ *  LoggerBufDecoder to locate all of the buffers. It does this using meta
+ *  information stored in the RTA XML file. The 'readBuffer' API is then
+ *  called to retrieve the buffer for each LoggerBuf instance.
  */
 public class LoggerBufDecoder {
         
@@ -46,18 +62,22 @@
     /* MetaData object for retrieving event names, messages, etc. */
     private IEventMetaData meta;  
     
-    /* Size of a LoggerBuf_Entry in bytes on all targets */
-    private static final int entrySize = 32;
+    /* Size of a LoggerBuf_Entry in bytes. */
+    private int entrySize;
     
-    /* map of the memory reads to perform for each logger instance. */
-    private HashMap<Integer, LoggerRead> loggerReads = new HashMap<Integer, LoggerRead>();
+    /* 
+     * Map of the memory reads to perform for each LoggerBuf instance in 
+     * StopMode RTA 
+     */
+    private HashMap<Integer, LoggerRead> loggerReads;
     
-    /* memory reader used by 'readBuffer' for StopMode RTA. */
+    /* Memory reader used by 'readBuffer' for StopMode RTA. */
     private MemoryImage memReader;
     
     /*
      *  ======== LoggerRead ========
-     *  Contains the necessary information to read a logger's buffer.
+     *  Contains the necessary information to read a LoggerBuf's buffer.
+     *  Used for StopMode RTA.
      */
     private class LoggerRead {
         public long address;
@@ -65,65 +85,107 @@
     }
     
     /*
-     *  ======== ROV Constructor ========
-     *  ROV constructs an object to implement IEventMetaData which references
-     *  the application configuration through the ROV recap file.
+     * ======== Constructors ========
+     * The LoggerBufDecoder requires:
+     *   - Target endianess
+     *   - Target MAU size
+     *   - IEventMetaData implementation
+     * 
+     * This data comes from different sources in ROV and StopMode RTA.
      */
-    public LoggerBufDecoder(TargetType.Endianess endianess, int bitsPerChar, 
-                            IEventMetaData meta) throws Exception
-    {       
-    	this.targDec = new TargetDecoder(endianess, bitsPerChar);
-        this.meta = meta;
-    }
     
     /*
      *  ======== RTA Constructor ========
-     *  With RTA, the IEventMetaData interface is implemented by the 
-     *  xdc.rta.MetaData class.
+     *  In RTA, the LoggerBufDecoder can get everything it needs from an
+     *  xdc.rta.MetaData instance, which also implements the IEventMetaData
+     *  interface.
      */
     public LoggerBufDecoder(MetaData meta)
     {
     	this.targDec = new TargetDecoder(meta.getEndianess(), 
     								     meta.getBitsPerChar());
     	this.meta = meta;
+        
+        /* 
+         * Initialize the size of a LoggerBuf entry. It is dependent on the
+         * target size of the IArg type. 
+         */
+        this.entrySize = 16 + (4 * meta.getTargetArgSize());
+    }
+    
+    /*
+     *  ======== ROV Constructor ========
+     *  ROV retrieves the target endianess and MAU size from the ROV recap
+     *  file. The ROV recap file also contains all of the information needed
+     *  to implement the IEventMetaData interface. ROV constructs an object
+     *  which references the ROV recap file through xdc.runtime.Log APIs, and
+     *  wraps it to create an IEventMetaData implementation.
+     */
+    public LoggerBufDecoder(TargetType.Endianess endianess, int bitsPerChar, 
+                            IEventMetaData meta) throws Exception
+    {       
+    	this.targDec = new TargetDecoder(endianess, bitsPerChar);
+        this.meta = meta;
+        
+        /* 
+         * Initialize the size of a LoggerBuf entry. It is dependent on the
+         * target size of the IArg type. 
+         */
+        this.entrySize = 16 + (4 * meta.getTargetArgSize());
     }
     
     /*
      *  ======== initStopMode ========
      *  Initialize the LoggerBufDecoder to perform memory reads for stop mode 
      *  RTA.
+     *  
+     *  When the RTA XML file is generated, each LoggerBuf instance provides
+     *  the information needed to retrieve its buffer: a symbol which points to
+     *  the address of the buffer, and the number of entries the buffer holds.
+     *  This information is retrieved here from the xdc.rta.MetaData instance.
+     *  
+     *  The memory reader is not needed to locate the buffers, but is stored
+     *  away to use later to perform the actual memory reads.
      */
     public void initStopMode(ISymbolTable symTab, MemoryImage memReader, MetaData metaData)
     {
+        /* 
+         * Create a map of the data needed to perform the memory read for each
+         * LoggerBuf instance.
+         */
+        this.loggerReads = new HashMap<Integer, LoggerRead>();
+        
+        /* Store off the memory reader to use later in the 'readBuffer' API. */
         this.memReader = memReader;
         
         int numLoggers = metaData.getLoggerNames().length;
         
         /* For each logger instance... */
         for (int i = 0; i < numLoggers; i++) {
-            /* Only retrieve LoggerBuf instances. */
+            /* Only deal with LoggerBuf instances. */
             if (metaData.getLogger(i).type.equals("xdc.runtime.LoggerBuf")) {                
-                Node metaArgs = meta.getLoggerMetaArgs(i);
-                
-                NodeList loggerProps = metaArgs.getChildNodes();
-                
+                /* 
+                 * Retrieve the meta data which each LoggerBuf instance 
+                 * provided during the generation of the RTA XML file.
+                 */
+                Element metaArgs = (Element) metaData.getLoggerMetaArgs(i);
+
                 LoggerRead read = new LoggerRead();
                 
-                /* Retrieve all of the logger's properties */
-                for (int j = 0; j < loggerProps.getLength(); j++) {
-                    Node n = loggerProps.item(j);
-                    String nodeName = n.getNodeName(); 
                     /* Get the symbol at which the buffer can be found. */
-                    if (nodeName.equals("bufferSymbol")) {
-                        String bufferSymbol = n.getTextContent();
+                String bufferSymbol = metaData.getProperty(metaArgs,
+                                                           "bufferSymbol");
+                
+                /* Look up the buffer address. */
                         read.address = symTab.getSymbolValue(bufferSymbol);
-                    }
-                    /* Get the size of the buffer in MAUs, convert to bytes. */
-                    else if (nodeName.equals("bufferSize")) {
-                        read.numBytes = Integer.parseInt(n.getTextContent()) * 
+
+                /* Get the size of the buffer in MAUs. */
+                String bufferSize = metaData.getProperty(metaArgs, 
+                                                         "bufferSize");
+                
+                /* Convert the size to bytes. */
+                read.numBytes = Integer.parseInt(bufferSize) * 
                                         (metaData.getBitsPerChar() / 8);
-                    }
-                }
                 
                 /* Map the logger id to the read info */
                 loggerReads.put(i, read);   
@@ -134,9 +196,13 @@
     /*
      *  ======== readBuffer ========
      *  Read the buffer for the specified logger.
+     *  
+     *  This is only used by StopMode RTA. 'initStopMode' must be called to
+     *  initialize the memory reads before calling this API. 
      */
     public byte[] readBuffer(int loggerId) throws Exception
     {
+        /* Retrieve the memory read for the specified logger. */
         LoggerRead read = loggerReads.get(loggerId);
      
         /* Perform the memory read. */
@@ -149,6 +215,18 @@
     /*
      *  ======== decodeBuffer ========
      *  Decode an entire buffer of LoggerBuf.Entry structs from the target.
+     *  
+     *  LoggerBuf records can not be decoded one at a time, the entire buffer
+     *  must be considered. This is because a single LoggerBuf entry only holds
+     *  four arguments; LoggerBuf makes use of 'continuation' records to
+     *  support records with more than four arguments.
+     *  
+     *  All records have an odd serial number, and continuation records are
+     *  marked with an even serial number.
+     *  
+     *  If the buffer supports wrapping, it is possible that the entry at the
+     *  beginning of the buffer will be the continuation to the last record
+     *  in the buffer.
      */
     public HostEvent[] decodeBuffer(byte[] buffer, int offset, int length)
     {
diff --git a/packages/xdc/runtime/Rta.c b/packages/xdc/runtime/Rta.c
new file mode 100644
index 0000000..625bef9
--- /dev/null
+++ b/packages/xdc/runtime/Rta.c
@@ -0,0 +1,193 @@
+/* --COPYRIGHT--,ESD
+ *  Copyright (c) 2008 Texas Instruments. All rights reserved. 
+ *  This program and the accompanying materials are made available under the 
+ *  terms of the Eclipse Public License v1.0 and Eclipse Distribution License
+ *  v. 1.0 which accompanies this distribution. The Eclipse Public License is
+ *  available at http://www.eclipse.org/legal/epl-v10.html and the Eclipse
+ *  Distribution License is available at 
+ *  http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ *  Contributors:
+ *      Texas Instruments - initial implementation
+ * --/COPYRIGHT--*/
+/*
+ *  ======== Rta.xdc ========
+ */
+
+#include <xdc/std.h>
+
+#include <xdc/runtime/Assert.h>
+#include <xdc/runtime/Error.h>
+#include <xdc/runtime/Log.h>
+#include <xdc/runtime/Types.h>
+#include <xdc/runtime/Timestamp.h>
+
+#include "package/internal/Rta.xdc.h"
+
+/* Value to respond to host that command was received and processed. */
+#define ACKNOWLEDGED    1
+
+/*
+ *  ======== Rta_processCommand ========
+ */
+Void Rta_processCommand(Rta_CommandPacket *cmd, Rta_ResponsePacket *resp)
+{       
+    /* Log receipt of a command. */
+    Log_write3(Rta_LD_cmdRcvd, cmd->cmdId, cmd->arg0, cmd->arg1);
+    
+    /* Include the cmd id in the response */
+    resp->cmdId = cmd->cmdId;
+    
+    /* Handle the command. */
+    switch (cmd->cmdId) {
+        case Rta_Command_READ_MASK:
+            Rta_readMask(resp, cmd->arg0);
+            break;
+        case Rta_Command_WRITE_MASK:
+            Rta_writeMask(resp, cmd->arg0, cmd->arg1);
+            break;
+        case Rta_Command_LOGGER_OFF:
+            Rta_disableLog(resp, cmd->arg0);
+            break;
+        case Rta_Command_LOGGER_ON:
+            Rta_enableLog(resp, cmd->arg0);
+            break;
+        case Rta_Command_GET_CPU_SPEED:
+            Rta_getCpuSpeed(resp);
+            break;
+        case Rta_Command_RESET_LOGGER:
+            Rta_resetLog(resp, cmd->arg0);
+            break;
+        case Rta_Command_CHANGE_PERIOD:
+            Rta_changePeriod(resp, cmd->arg0);
+            break;
+        default:
+            Error_raise(NULL, Rta_E_badCommand, cmd->cmdId, 0);
+            break;
+    }
+}
+
+/*
+ *  ======== Rta_acknowledgeCmd ========
+ *  For commands that have no response, send an acknowledgement that the
+ *  command was received and processed.
+ */
+Void Rta_acknowledgeCmd(Rta_ResponsePacket *resp)
+{
+    resp->resp0 = ACKNOWLEDGED;    
+}
+ 
+/*
+ *  ======== Rta_readMask ========
+ */
+Void Rta_readMask(Rta_ResponsePacket *resp, UArg addr)
+{
+    /* 
+     * The address passed in is the address of diagsMask__C, which holds the
+     * address of the actual diagsMask in the module state structure. So
+     * the address passed in must be dereferenced twice. 
+     * The diagsMask is a Bits16.
+     */
+    Bits16 *maskAddr = *((Bits16 **) addr);
+    
+    resp->resp0 = *maskAddr;    
+}
+
+/*
+ *  ======== Rta_writeMask ========
+ */
+Void Rta_writeMask(Rta_ResponsePacket *resp, UArg addr, UArg val)
+{
+    /* 
+     * The address passed in is the address of diagsMask__C, which holds the
+     * address of the actual diagsMask in the module state structure. So
+     * the address passed in must be dereferenced twice. 
+     */
+    Bits16 *maskAddr = *((Bits16 **) addr);
+    
+    /* The diagsMask is a Bits16. */
+    *maskAddr = (Bits16) val;
+    
+    Log_write2(Rta_LD_writeMask, (UArg) maskAddr, (Bits16) val);
+    
+    /* Acknowledge the command. */
+    Rta_acknowledgeCmd(resp);
+}
+
+/*
+ *  ======== Rta_enableLog ========
+ *  TODO - Currently not supported for all ILoggers.
+ */
+Void Rta_enableLog(Rta_ResponsePacket *resp, UArg log)
+{
+    //UInt32 logNum = (UInt32) log;
+
+    // TODO - Enable the log
+    
+    /* Acknowledge the command. */
+    Rta_acknowledgeCmd(resp);
+}
+
+/*
+ *  ======== Rta_disableLog ========
+ *  TODO - Currently not supported for all ILoggers.
+ */
+Void Rta_disableLog(Rta_ResponsePacket *resp, UArg log)
+{
+    //UInt32 logNum = (UInt32) log;
+
+    // TODO - Disable the log
+    
+    /* Acknowledge the command. */
+    Rta_acknowledgeCmd(resp);
+}
+
+/*
+ *  ======== Rta_resetLog ========
+ *  TODO - Currently not supported for all ILoggers.
+ */
+Void Rta_resetLog(Rta_ResponsePacket *resp, UArg log)
+{
+    //UInt32 logNum = (UInt32) log;
+    
+    // TODO - Reset the log
+    
+    /* Acknowledge the command. */
+    Rta_acknowledgeCmd(resp);
+}
+
+/*
+ *  ======== Rta_changePeriod ========
+ *  TODO - Currently unsupported. User needs to provide a function handle to
+ *  perform this task.
+ */
+Void Rta_changePeriod(Rta_ResponsePacket *resp, UArg period)
+{
+    //UInt32 newPeriod = (UInt32) period;
+
+    // TODO - Change the period
+    
+    /* Acknowledge the command. */
+    Rta_acknowledgeCmd(resp);
+}
+ 
+/*
+ *  ======== Rta_getCpuSpeed ========
+ */
+Void Rta_getCpuSpeed(Rta_ResponsePacket *resp)
+{
+    Types_FreqHz freq;
+    
+    /* Get the Timestamp frequency. */
+    Timestamp_getFreq(&freq);
+    
+    resp->resp0 = freq.hi;
+    resp->resp1 = freq.lo;    
+}
+
+/*
+ *! Revision History
+ *! ================
+ *! 08-Sep-2009 cmcc    Created
+ */
+
diff --git a/packages/xdc/runtime/Rta.xdc b/packages/xdc/runtime/Rta.xdc
new file mode 100644
index 0000000..736798f
--- /dev/null
+++ b/packages/xdc/runtime/Rta.xdc
@@ -0,0 +1,141 @@
+/*
+ *  ======== Rta.xdc ========
+ *
+ *! Revision History
+ *! ================
+ *! 08-Sep-2009 cmcc    Created
+ */
+ 
+package xdc.runtime;
+
+/*!
+ *  ======== Rta ========
+ *  The Rta module contains target and configuration code for providing RTA
+ *  support.
+ *
+ *  The 'Command' enum defines the available control commands, and the
+ *  'CommandPacket' structure defines the format of commands received from
+ *  the host. 
+ *
+ *  All commands should send back a response, even if only to acknowledge
+ *  receipt and completion of the command. The format of the response
+ *  is defined by the 'ResponsePacket' structure.
+ *
+ *  The Rta_processCommand can be used to process commands received from a
+ *  host to call the appropriate API. Alternatively, the individual APIs can
+ *  be called if not all of the defined commands are used.
+ */
+module Rta {
+
+    /*! Logged when the Agent receives a command */
+    config Log.Event LD_cmdRcvd = {
+        mask: Diags.USER2,
+        msg: "LD_cmdRcvd: Received command: %d, arg0: 0x%x, arg1: 0x%x"
+    };
+
+    /*! Logged when a diags mask is changed */
+    config Log.Event LD_writeMask = {
+        mask: Diags.USER2,
+        msg: "LD_writeMask: Mask addres: 0x%x, New mask value: 0x%x"
+    };
+    
+    /*! Assert if logger id in control command is invalid. */
+    config Assert.Id A_invalidLogger = {
+        msg: "A_invalidLogger: The logger id %d is invalid."
+    };
+    
+    /*! Error raised if Agent receives an invalid command. */
+    config Error.Id E_badCommand  = {
+        msg: "E_badCommand: Received invalid command, id: %d."
+    };
+
+    /*! Command ids */
+    enum Command : Int {
+        Command_READ_MASK = 0,	
+        Command_WRITE_MASK = 1,	
+        Command_LOGGER_OFF = 2,
+        Command_LOGGER_ON = 3,
+        Command_GET_CPU_SPEED = 4,
+        Command_RESET_LOGGER = 5,
+        Command_CHANGE_PERIOD = 6
+    };
+    
+    /*! 
+     * Structure of command received from host 
+     * TODO - Either the types should be changed to 32-bits, or the packet
+     * size information should be added to the RTA XML file.
+     */
+    struct CommandPacket {
+        Command  cmdId;
+        UArg     arg0;
+        UArg     arg1;
+    }
+
+    /*! Structure of response packet sent back to host */
+    struct ResponsePacket {
+        Command  cmdId;
+        UArg     resp0;
+        UArg     resp1;
+    }
+    
+    /*!
+     *  ======== processCommand ========
+     *  Executes a command packet and prepares the response packet.
+     *  
+     *  This API will execute the command specified by the command packet
+     *  argument, and will store the response information in the response
+     *  packet argument.
+     *
+     *  @param(cmd)    The CommandPacket to execute.
+     *  @param(resp)   The ResponsePacket to populate with the response.
+     */
+    Void processCommand(CommandPacket *cmd, ResponsePacket *resp);
+    
+    /*!
+     *  ======== acknowledgeCmd ========
+     */
+    Void acknowledgeCmd(ResponsePacket *resp);
+
+    /*!
+     *  ======== readMask ========
+     */
+    Void readMask(ResponsePacket *resp, UArg addr);
+    
+    /*!
+     *  ======== writeMask ========
+     */   
+    Void writeMask(ResponsePacket *resp, UArg addr, UArg val);
+    
+    /*!
+     *  ======== enableLog ========
+     */
+    Void enableLog(ResponsePacket *resp, UArg log);
+    
+    /*!
+     *  ======== disableLog ========
+     */
+    Void disableLog(ResponsePacket *resp, UArg log);
+    
+    /*!
+     *  ======== getCpuSpeed ========
+     */
+    Void getCpuSpeed(ResponsePacket *resp);
+    
+    /*!
+     *  ======== resetLog ========
+     */
+    Void resetLog(ResponsePacket *resp, UArg log);
+    
+    /*!
+     *  ======== changePeriod ========
+     */
+    Void changePeriod(ResponsePacket *resp, UArg period);
+
+    /*!
+     *  @_nodoc
+     *  ======== genRta ========
+     *  Generates the Rta XML file.
+     */
+    function genRta(outputFileName);
+
+}
diff --git a/packages/xdc/runtime/Rta.xs b/packages/xdc/runtime/Rta.xs
new file mode 100644
index 0000000..49ac427
--- /dev/null
+++ b/packages/xdc/runtime/Rta.xs
@@ -0,0 +1,131 @@
+/*
+ *  ======== genRta ========
+ */
+function genRta(outputFileName)
+{
+    var file = new java.io.File(outputFileName);
+    file["delete"]();
+    var out = new java.io.FileWriter(outputFileName);
+    out = new java.io.BufferedWriter(out);
+
+    var rts = xdc.om['xdc.runtime'];
+
+    var data = new rts.Types.RtaDecoderData;
+    data.targetName = Program.build.target.$name;
+    data.binaryParser = Program.build.target.binaryParser;
+
+    /* 
+     * Add all instances of modules which implement ILogger to the meta data.
+     * This list is primarily used for supporting control commands.
+     */
+    var ILogger = xdc.module('xdc.runtime.ILogger');
+    for (var i = 0; i < xdc.om.$modules.length; i++) {
+        var mod = xdc.om.$modules[i];
+        
+        /* If this module implements the ILogger interface. */
+        if (mod instanceof ILogger.Module) {
+            /* Add each of the module's instances. */
+            for (var j = 0; j < mod.$instances.length; j++) {
+                addLoggerInst(data, mod, mod.$instances[j].$orig, j);
+            }
+            
+            /* get emebdded loggers too */
+            for (var j = 0; j < mod.$objects.length; j++) {
+                addLoggerInst(data, mod, mod.$objects[j].$orig, j);
+            }
+        }
+    }
+    
+    /*
+     * For each module, store the logger associated with it and its initial
+     * diags configuration.
+     */
+    var targetModules = Program.targetModules();
+    for (var i = 0; i < targetModules.length; i++) {
+        var mod = targetModules[i];
+        if (!mod.PROXY$) {
+
+            var loggerInst = "";
+            if (mod.common$.logger == null) {
+                loggerInst = "null";
+            }
+            else if (mod.common$.logger.$orig.instance.name) {
+                loggerInst = mod.common$.logger.$orig.instance.name;
+            }
+            else {
+                loggerInst = String(mod.common$.logger.$orig);
+            }
+
+            data.modMap[mod.$name] = {
+                id: mod.Module__id,
+                logger: loggerInst,
+                /*
+                 * Mask has the form EXLIA00012345678, with 3 unused bits
+                 * between Assert and User1
+                 */
+                diagsMask: String(Number(mod.common$.diags_ENTRY)) +
+                       String(Number(mod.common$.diags_EXIT)) +
+                       String(Number(mod.common$.diags_LIFECYCLE)) +
+                       String(Number(mod.common$.diags_INTERNAL)) +
+                       String(Number(mod.common$.diags_ASSERT)) +
+                       "000" +
+                       String(Number(mod.common$.diags_USER1)) +
+                       String(Number(mod.common$.diags_USER2)) +
+                       String(Number(mod.common$.diags_USER3)) +
+                       String(Number(mod.common$.diags_USER4)) +
+                       String(Number(mod.common$.diags_USER5)) +
+                       String(Number(mod.common$.diags_USER6)) +
+                       String(Number(mod.common$.diags_USER7)) +
+                       String(Number(mod.common$.diags_USER8))
+            };
+        }
+    }
+
+    /* Create the event map */
+    for (var id in rts.Log.idToInfo) {
+        var info = rts.Log.idToInfo[id].split('::');
+        data.evtMap[info[0]] = {
+            id: Number(id.substring(1)),
+            msg: java.net.URLEncoder.encode(info[1], 'UTF-8')
+        };
+    }
+
+    /* Target specific constants. */
+    data.eventSize = rts.Log.EventRec.$sizeof();
+    data.argSize = Program.build.target.stdTypes.t_IArg.size;
+
+    data.bitsPerChar = Program.build.target.bitsPerChar;
+    data.endian = Program.build.target.model.endian;
+
+    out.write(String(data.$xml()));
+    out.write('\n');
+
+    out.close();
+}
+/*
+ *  ======== addLoggerInst ========
+ */
+function addLoggerInst(data, mod, inst, index)
+{    
+    data.loggers.length++;
+    
+    var logger = {};
+    
+    /* Store the instance name if one was given. */
+    if (inst.instance.name) {
+        logger.name = inst.instance.name;
+    }
+    else {
+        logger.name = String(inst);
+    }
+    
+    /* Store the type of the logger instance. */
+    logger.type = String(mod);
+    
+    /* Store the meta data provided for this logger instance. */
+    var metaArgs = mod.getMetaArgs(inst, index);
+    logger.metaArgs = metaArgs;
+    
+    /* Add the logger to the list */
+    data.loggers[data.loggers.length - 1] = logger;
+}
diff --git a/packages/xdc/runtime/Startup.xdt b/packages/xdc/runtime/Startup.xdt
index 22f2253..47c57aa 100644
--- a/packages/xdc/runtime/Startup.xdt
+++ b/packages/xdc/runtime/Startup.xdt
@@ -1,80 +1,81 @@
-%%{
-/* --COPYRIGHT--,ESD
- *  Copyright (c) 2008 Texas Instruments. All rights reserved. 
- *  This program and the accompanying materials are made available under the 
- *  terms of the Eclipse Public License v1.0 and Eclipse Distribution License
- *  v. 1.0 which accompanies this distribution. The Eclipse Public License is
- *  available at http://www.eclipse.org/legal/epl-v10.html and the Eclipse
- *  Distribution License is available at 
- *  http://www.eclipse.org/org/documents/edl-v10.php.
- *
- *  Contributors:
- *      Texas Instruments - initial implementation
- * --/COPYRIGHT--*/
-
-            /*
-             * ======== Startup.xdt ========
-             */
-
-            var mcnt = 0;
-            var mobj = '(&xdc_runtime_Startup_Module__state__V)';
-
-%%}
-
-        %    var Startup = xdc.module('xdc.runtime.Startup');
-        %    if (Startup.resetFxn != null) {
-        %        var cname = Startup.resetFxn.$name;
-        %        cname = cname.replace(/\./g, '_');
-extern Void `cname`(void);
-        %    }
-        %   for each (var mod in Program.targetModules()) {
-        %       if (!mod.MODULE_STARTUP$) continue;
-        %       if (mod.$$scope != -1) {
-        %           var mn = mod.$name.replace(/\./g, '_');
-xdc_Bool `mn`_Module__startupDone__F(void) {
-    return `mobj`->stateTab == 0 || `mobj`->stateTab[`mcnt`] < 0;
-}
-        %       }
-        %       mcnt++;
-        %   }
-
-        %if (Program.$$isrom) return;
-% /* 
-%  * reset__I and exec__I are internal entry points called by target/platform boot code.
-%  * Boot code is not brought into a partial-link assembly. So without this pragma,
-%  * whole program optimizers would otherwise optimize-out these functions.
-%  *
-%  * reset__I invokes the function bound to `resetFxn` if non-NULL. 
-%  */
-#ifdef __ti__
-#pragma FUNC_EXT_CALLED(xdc_runtime_Startup_exec__I);
-#pragma FUNC_EXT_CALLED(xdc_runtime_Startup_reset__I);
-#endif
-
-#ifdef __GNUC__
-#if __GNUC__ >= 4
-xdc_Void xdc_runtime_Startup_exec__I(void) __attribute__ ((externally_visible));
-xdc_Void xdc_runtime_Startup_reset__I(void) __attribute__ ((externally_visible));
-#endif
-#endif
-
-xdc_Void xdc_runtime_Startup_exec__I(void)
-{
-    xdc_Int state[`mcnt + 1`];
-    xdc_runtime_Startup_startModsFxn__C(state, `mcnt`);
-}
-
-/*
- *  ======== xdc_runtime_Startup_reset__I ========
- *  This function is called by bootstrap initialization code as early as
- *  possible in the startup process.  This function simply calls any
- *  configured `Startup.resetFxn`.
- */
-xdc_Void xdc_runtime_Startup_reset__I(void)
-{
-        %    if (Startup.resetFxn != null) {
-        %        var cname = Startup.resetFxn.$name;
-        %        cname = cname.replace(/\./g,'_');
-    `cname`();
-        %    }
-}
+%%{
+/* --COPYRIGHT--,ESD
+ *  Copyright (c) 2008 Texas Instruments. All rights reserved. 
+ *  This program and the accompanying materials are made available under the 
+ *  terms of the Eclipse Public License v1.0 and Eclipse Distribution License
+ *  v. 1.0 which accompanies this distribution. The Eclipse Public License is
+ *  available at http://www.eclipse.org/legal/epl-v10.html and the Eclipse
+ *  Distribution License is available at 
+ *  http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ *  Contributors:
+ *      Texas Instruments - initial implementation
+ * --/COPYRIGHT--*/
+
+            /*
+             * ======== Startup.xdt ========
+             */
+
+            var mcnt = 0;
+            var mobj = '(&xdc_runtime_Startup_Module__state__V)';
+
+%%}
+
+        %    var Startup = xdc.module('xdc.runtime.Startup');
+        %    if (Startup.resetFxn != null) {
+        %        var cname = Startup.resetFxn.$name;
+        %        cname = cname.replace(/\./g, '_');
+extern Void `cname`(void);
+        %    }
+        %   for each (var mod in Program.targetModules()) {
+        %       if (!mod.MODULE_STARTUP$) continue;
+        %       if (mod.$$scope != -1) {
+        %           var mn = mod.$name.replace(/\./g, '_');
+xdc_Bool `mn`_Module__startupDone__F(void) {
+    return `mobj`->stateTab == 0 || `mobj`->stateTab[`mcnt`] < 0;
+}
+        %       }
+        %       mcnt++;
+        %   }
+
+        %if (Program.$$isrom) return;
+% /* 
+%  * reset__I and exec__I are internal entry points called by target/platform
+%  * boot code. Boot code is not brought into a partial-link assembly. So,
+%  * without this pragma, whole program optimizers would otherwise optimize-out
+%  * these functions.
+%  *
+%  * reset__I invokes the function bound to `resetFxn` if non-NULL. 
+%  */
+#ifdef __ti__
+#pragma FUNC_EXT_CALLED(xdc_runtime_Startup_exec__I);
+#pragma FUNC_EXT_CALLED(xdc_runtime_Startup_reset__I);
+#endif
+
+#ifdef __GNUC__
+#if __GNUC__ >= 4
+xdc_Void xdc_runtime_Startup_exec__I(void) __attribute__ ((externally_visible));
+xdc_Void xdc_runtime_Startup_reset__I(void) __attribute__ ((externally_visible));
+#endif
+#endif
+
+xdc_Void xdc_runtime_Startup_exec__I(void)
+{
+    xdc_Int state[`mcnt + 1`];
+    xdc_runtime_Startup_startModsFxn__C(state, `mcnt`);
+}
+
+/*
+ *  ======== xdc_runtime_Startup_reset__I ========
+ *  This function is called by bootstrap initialization code as early as
+ *  possible in the startup process.  This function simply calls any
+ *  configured `Startup.resetFxn`.
+ */
+xdc_Void xdc_runtime_Startup_reset__I(void)
+{
+        %    if (Startup.resetFxn != null) {
+        %        var cname = Startup.resetFxn.$name;
+        %        cname = cname.replace(/\./g,'_');
+    `cname`();
+        %    }
+}
diff --git a/packages/xdc/runtime/build.xs b/packages/xdc/runtime/build.xs
index a578491..02ee162 100644
--- a/packages/xdc/runtime/build.xs
+++ b/packages/xdc/runtime/build.xs
@@ -19,7 +19,7 @@
  *  ======== makePrologue ========
  *  prologue used by clients to portably locate xdc.runtime sources
  */
-var makePrologue = "vpath %.c $(subst ;,  ,$(PKGPATH))\nvpath %.cpp $(subst ;,  ,$(PKGPATH))";
+var makePrologue = "vpath %.c $(subst ;,  ,$(XPKGPATH))\nvpath %.cpp $(subst ;,  ,$(XPKGPATH))";
 
 /*
  *  ======== common_objs ========
@@ -40,6 +40,7 @@
     "xdc/runtime/LoggerBuf.c",
     "xdc/runtime/LoggerSys.c",
     "xdc/runtime/Memory.c",
+    "xdc/runtime/Rta.c",
     "xdc/runtime/Startup.c",
     "xdc/runtime/System.c",
     "xdc/runtime/SysMin.c",
diff --git a/packages/xdc/runtime/knl/Thread.xdc b/packages/xdc/runtime/knl/Thread.xdc
index 92695e7..9f40a6f 100644
--- a/packages/xdc/runtime/knl/Thread.xdc
+++ b/packages/xdc/runtime/knl/Thread.xdc
@@ -99,6 +99,7 @@
      *                  If the current thread is the main thread, this function 
      *                  returns `NULL`. NULL is also returned in case of error.
      */
+    @DirectCall
     Handle self(Error.Block *eb);
 
     /*!
diff --git a/packages/xdc/runtime/package.xdc b/packages/xdc/runtime/package.xdc
index 739178e..962d8fe 100644
--- a/packages/xdc/runtime/package.xdc
+++ b/packages/xdc/runtime/package.xdc
@@ -118,6 +118,7 @@
     module Log, LoggerBuf, LoggerSys;
     module Main;
     module Memory, HeapMin, HeapStd;
+    module Rta;
     module Startup;
     module System, SysStd, SysMin;
     module Text;
diff --git a/packages/xdc/services/global/Vers.java b/packages/xdc/services/global/Vers.java
index 0677faa..830a98f 100644
--- a/packages/xdc/services/global/Vers.java
+++ b/packages/xdc/services/global/Vers.java
@@ -538,127 +538,21 @@
         return (result);
     }
     
-    static private final int MAXNULL = 3;
-    
     /*
      *  ======== getWhatString ========
      */
     public static String getWhatString(String fileName)
         throws java.io.IOException
     {
-        return (getWhatString(new File(fileName)));
+        return What.getWhatString(fileName);
     }
     
     public static String getWhatString(File file)
         throws java.io.IOException
     {
-        BufferedReader src = new BufferedReader(new FileReader(file));
-        StringBuffer result = new StringBuffer(80);
-        int nullCount = 0;
-        int cur;
-        char ch; 
-        int state;
-        
-        /* infinite loop - nextCh() will exit() */
-        for (cur = src.read(), state = 0; cur >= 0;) {
-    
-            ch = (char)cur;
-
-            switch (state) {
-    
-                /* initial state */
-                case 0 : {
-                    state = (ch == '@') ? 1 : 0;
-                    cur = src.read();
-
-                    /* compute null padding (for non-byte addressable ISAs) */
-                    nullCount = 0;
-                    for (int i = 0; (char)cur == '\0' && i < MAXNULL; i++) {
-                        nullCount++;
-                        cur = src.read();
-                    }
-
-                    break;
-                }
-    
-                /* previous character was a '@' */
-                case 1 : {
-                    if (ch == '(') {
-                        state = 2;	    /* proceed to next state */
-                        cur = nextChar(src, nullCount);
-                    }
-                    else {
-                        state = 0;	    /* return to initial state */
-                    }
-                    break;
-                }
-    
-                /* previous two characters we "@(" */
-                case 2 : {
-                    if (ch == '#') {
-                        state = 3;	    /* proceed to next state */
-                        cur = nextChar(src, nullCount);
-                    }
-                    else {
-                        state = 0;	    /* return to initial state */
-                    }
-                    break;
-                }
-    
-                /* previous three characters we "@(#" */
-                case 3 : {
-                    if (ch == ')') {
-                        result.append('\t');
-                        state = 4;	    /* proceed to next state */
-                        cur = nextChar(src, nullCount);
-                    }
-                    else {
-                        state = 0;	    /* return to initial state */
-                    }
-                    break;
-                }
-    
-                /* previous characters were "@(#)", print version string! */
-                case 4 : {
-                    /* if we reach the end of the version string return
-                     * to the initial state.
-                     */
-                    if (ch == '\000' || ch == '\n' || ch == '"') {
-                        result.append('\n');
-                        state = 0;	    /* return to initial state */
-                        cur = src.read();
-                        break;
+        return What.getWhatString(file);
                     }
     
-                    /* Otherwise, output next character in version string
-                     * and stay in this state.
-                     */
-                    result.append(ch);
-                    cur = nextChar(src, nullCount);
-                    break;
-                }
-    
-                /* we should never get here! */
-                default : {
-                    cur = -1;   /* terminate the loop */
-                    break;
-                }
-            }
-        }
-
-        return (result.toString());
-    }
-    
-    private static int nextChar(BufferedReader src, int nbytes)
-        throws java.io.IOException
-    {
-        for (int i = 0; i < nbytes; i++) {
-            src.read();
-        }
-
-        return (src.read());
-    }
-
     /*
      *  ======== main ========
      *  Read XML file specified on the command line, display its contents,
diff --git a/packages/xdc/services/global/What.java b/packages/xdc/services/global/What.java
new file mode 100644
index 0000000..b144ef4
--- /dev/null
+++ b/packages/xdc/services/global/What.java
@@ -0,0 +1,149 @@
+/* --COPYRIGHT--,EPL
+ *  Copyright (c) 2008 Texas Instruments and others.
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License v1.0
+ *  which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ * 
+ *  Contributors:
+ *      Texas Instruments - initial implementation
+ * 
+ * --/COPYRIGHT--*/
+/*
+ *  ======== What.java ========
+ *  This helper class extracts an SCCS "what" string from a file.
+ */
+package xdc.services.global;
+
+import java.io.FileReader;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+
+/*
+ *  ======== What ========
+ */
+public class What {
+
+    static private final int MAXNULL = 3;
+    
+    /*
+     *  ======== getWhatString ========
+     */
+    public static String getWhatString(String fileName)
+        throws java.io.IOException
+    {
+        return (getWhatString(new File(fileName)));
+    }
+    
+    public static String getWhatString(File file)
+        throws java.io.IOException
+    {
+        BufferedReader src = new BufferedReader(new FileReader(file));
+        StringBuffer result = new StringBuffer(80);
+        int nullCount = 0;
+        int cur;
+        char ch; 
+        int state;
+        
+        /* infinite loop - nextCh() will exit() */
+        for (cur = src.read(), state = 0; cur >= 0;) {
+    
+            ch = (char)cur;
+
+            switch (state) {
+    
+                /* initial state */
+                case 0 : {
+                    state = (ch == '@') ? 1 : 0;
+                    cur = src.read();
+
+                    /* compute null padding (for non-byte addressable ISAs) */
+                    nullCount = 0;
+                    for (int i = 0; (char)cur == '\0' && i < MAXNULL; i++) {
+                        nullCount++;
+                        cur = src.read();
+                    }
+
+                    break;
+                }
+    
+                /* previous character was a '@' */
+                case 1 : {
+                    if (ch == '(') {
+                        state = 2;	    /* proceed to next state */
+                        cur = nextChar(src, nullCount);
+                    }
+                    else {
+                        state = 0;	    /* return to initial state */
+                    }
+                    break;
+                }
+    
+                /* previous two characters we "@(" */
+                case 2 : {
+                    if (ch == '#') {
+                        state = 3;	    /* proceed to next state */
+                        cur = nextChar(src, nullCount);
+                    }
+                    else {
+                        state = 0;	    /* return to initial state */
+                    }
+                    break;
+                }
+    
+                /* previous three characters we "@(#" */
+                case 3 : {
+                    if (ch == ')') {
+                        result.append('\t');
+                        state = 4;	    /* proceed to next state */
+                        cur = nextChar(src, nullCount);
+                    }
+                    else {
+                        state = 0;	    /* return to initial state */
+                    }
+                    break;
+                }
+    
+                /* previous characters were "@(#)", print version string! */
+                case 4 : {
+                    /* if we reach the end of the version string return
+                     * to the initial state.
+                     */
+                    if (ch == '\000' || ch == '\n' || ch == '"') {
+                        result.append('\n');
+                        state = 0;	    /* return to initial state */
+                        cur = src.read();
+                        break;
+                    }
+    
+                    /* Otherwise, output next character in version string
+                     * and stay in this state.
+                     */
+                    result.append(ch);
+                    cur = nextChar(src, nullCount);
+                    break;
+                }
+    
+                /* we should never get here! */
+                default : {
+                    cur = -1;   /* terminate the loop */
+                    break;
+                }
+            }
+        }
+
+        return (result.toString());
+    }
+    
+    private static int nextChar(BufferedReader src, int nbytes)
+        throws java.io.IOException
+    {
+        for (int i = 0; i < nbytes; i++) {
+            src.read();
+        }
+
+        return (src.read());
+    }
+
+}
diff --git a/packages/xdc/services/intern/gen/Config.java b/packages/xdc/services/intern/gen/Config.java
index ca78136..44f5642 100644
--- a/packages/xdc/services/intern/gen/Config.java
+++ b/packages/xdc/services/intern/gen/Config.java
@@ -1856,7 +1856,7 @@
                 glob.out.printf(fmt, "Module_startup__E");
             }
 
-            for (Decl.Fxn fxn : unit.getAllFxns()) {
+            for (Decl.Fxn fxn : unit.getFxns()) {
                 if (fxn.attrBool(Attr.A_DirectCall)) {
                     String fn = glob.cname + fxn.getName() + "__E";
                     clink(fn + 'D');
@@ -1867,7 +1867,7 @@
                 if (fxn.attrBool(Attr.A_Macro)) {
                     continue;
                 }
-                if (!fxn.isMeta() && !fxn.isSys() && fxn.overrides() == null) {
+                if (!fxn.isMeta() && !fxn.isSys()) {
                     String suf = !isrom ? "__E" : "__R";
                     glob.out.printf(fmt, fxn.getName() + suf);
                     if (isrom && fxn.isVarg()) {
@@ -1900,8 +1900,8 @@
             glob.out.printf("%tconst CT__%1 %1__C __attribute__ ((externally_visible));\n",
                     glob.cname + cfg.getName());
         }
-        for (Decl.Fxn fxn : unit.getAllFxns()) {
-            if (fxn.isMeta() || fxn.attrBool(Attr.A_Macro) || fxn.overrides() != null
+        for (Decl.Fxn fxn : unit.getFxns()) {
+            if (fxn.isMeta() || fxn.attrBool(Attr.A_Macro)
                 || fxn.attrBool(Attr.A_DirectCall)) {
                 continue;
             }
diff --git a/packages/xdc/services/intern/xsr/XScriptO.java b/packages/xdc/services/intern/xsr/XScriptO.java
index 94cdffc..4ca0358 100644
--- a/packages/xdc/services/intern/xsr/XScriptO.java
+++ b/packages/xdc/services/intern/xsr/XScriptO.java
@@ -66,7 +66,7 @@
 
     public void error( String msg )
     {
-        Err.exit((String)this.getDefaultValue(null)+ ": " + msg);
+        Err.exit(this.getDefaultValue(null) + ": " + msg);
     }
     
     static void errorThrow( String msg )
diff --git a/packages/xdc/services/spec/Decl.java b/packages/xdc/services/spec/Decl.java
index 6d50f98..0663e08 100644
--- a/packages/xdc/services/spec/Decl.java
+++ b/packages/xdc/services/spec/Decl.java
@@ -301,6 +301,33 @@
             }
         }
 
+        // checkInit
+        void checkInit()
+        {
+            // minimal checking of top-level struct-field name correctness
+            // much, much more is possible!!!
+            
+            if (!(this.init instanceof Expr.Hash)) {
+                return;
+            }
+            
+            if (!this.type.tcode().equals("S")) {
+                return;
+            }
+            
+            Decl.Struct str = (Decl.Struct)this.type.raw().tspec().getRef().getNode();
+            HashSet<String> fldNames = new HashSet<String>();
+            for (Decl.Field fld : str.getChildren()) {
+                fldNames.add(fld.getName());
+            }
+            
+            for (Atom a : ((Expr.Hash)this.init).getIds()) {
+                if (!fldNames.contains(a.getText())) {
+                    ses.msg.error(a, "no field of this name in the corresponding struct type");
+                }
+            }
+        }
+        
         // finalCheck
         void finalCheck()
         {
@@ -311,8 +338,12 @@
             if (this.hasAttr(Attr.A_Facet)) {
                 this.checkFacet();
             }
+
+            if (this.init != null) {
+                this.checkInit();
+            }
         }
-        
+
         // getInit
         public final Expr getInit()
         {
@@ -474,11 +505,17 @@
         // sizeof
         public void sizeof( List<String> sL )
         {
+            StringBuffer suffix = new StringBuffer("");
+            for (EnumVal val : this.vals) {
+                suffix.append(";" + Expr.toText(val.init));
+            }
             if (this.rep != null) {
-                this.rep.sizeof(sL);
+                List<String> tL = new Vector<String>();
+                this.rep.sizeof(tL);
+                sL.add("N" + this.getQualName() + ";" + tL.get(0) + suffix);
             }
             else {
-                sL.add("N" + this.getQualName());
+                sL.add("N" + this.getQualName() + ";" + suffix);
             }
         }
     }
diff --git a/packages/xdc/services/spec/DocComment.java b/packages/xdc/services/spec/DocComment.java
index 157c2fc..b429b43 100644
--- a/packages/xdc/services/spec/DocComment.java
+++ b/packages/xdc/services/spec/DocComment.java
@@ -19,13 +19,17 @@
 {
 	// Static Serialization UID
 	static final long serialVersionUID = 7216773336916227011L;
+
     String arg;
     Atom   body;
     String mode;
     int    pid;
     String tag;
 
-    DocComment( Atom body )
+    /*
+     *  ======== DocComment ========
+     */
+    DocComment(Atom body)
     {
         this.body = body;
 
@@ -35,43 +39,55 @@
         this.tag = null;
     }
     
-    // getArg
+    /*
+     *  ======== getArg ========
+     */
     public final String getArg()
     {
         return this.arg;
     }
     
-    // getBody
+    /*
+     *  ======== getBody ========
+     */
     public final String getBody()
     {
         return this.body.text;
     }
     
-    // getMode
+    /*
+     *  ======== getMode ========
+     */
     public final String getMode()
     {
         return this.mode;
     }
     
-    // getTag
+    /*
+     *  ======== getTag ========
+     */
     public final String getTag()
     {
         return this.tag;
     }
     
-    // getParId
+    /*
+     *  ======== getParId ========
+     */
     public final int getParId()
     {
         return this.pid;
     }
 
-    // isParsed
+    /* ======== isParsed ======== */
     /**
      * Identify whether the given list of comments has already been parsed.
+     *
      * @param docs The list of comments to inspect.
+     *
      * @return true if the list has already been parsed.
      */
-    public static Boolean isParsed( List<DocComment> docs )
+    public static Boolean isParsed(List<DocComment> docs)
     {
         if (docs == null || docs.size() == 0) {
             return true;
@@ -100,8 +116,10 @@
         return false;
     }
 
-    // parse
-    static ArrayList<DocComment> parse( List<DocComment> docs )
+    /*
+     *  ======== parse ========
+     */
+    static ArrayList<DocComment> parse(List<DocComment> docs)
     {
         ArrayList<DocComment> res = new ArrayList();
 
@@ -142,8 +160,10 @@
          *  3: optional mode, including parens
          *  4: optional mode, excluding parens
          *  5: trailing text
+         *
+         *  Note: @ tags allow white space separated words to support tags
+         *  like "@a(Source Files)".
          */
-        /* SDSCM00012325 */
         Pattern p = Pattern.compile(
             "\\s*(@)(\\w+)(\\([ \\t]*([\\w \\t]+)[ \\t]*\\))?(.*)\\s*"
         );
@@ -182,8 +202,8 @@
                 curtag = m.group(2);
                 curarg = m.group(4);
                 curmode = null;
-                ad.body.text = (m.group(5).length() == 0 || !m.group(5)
-                        .matches(".*\\S.*")) ? null : m.group(5);
+                ad.body.text = (m.group(5).length() == 0
+                    || !m.group(5).matches(".*\\S.*")) ? null : m.group(5);
             }
 
             ad.tag = curtag;
diff --git a/packages/xdc/services/spec/Import.java b/packages/xdc/services/spec/Import.java
index 3b6bcf9..f5739af 100644
--- a/packages/xdc/services/spec/Import.java
+++ b/packages/xdc/services/spec/Import.java
@@ -11,8 +11,6 @@
  * --/COPYRIGHT--*/
 package xdc.services.spec;
 
-import java.util.EnumSet;
-
 public class Import
     implements java.io.Serializable
 {
diff --git a/packages/xdc/services/spec/Msg.java b/packages/xdc/services/spec/Msg.java
index 1780e59..104dd3e 100644
--- a/packages/xdc/services/spec/Msg.java
+++ b/packages/xdc/services/spec/Msg.java
@@ -24,8 +24,7 @@
      */
     void error(String s)
     {
-        err.println(s);
-        errors = true;
+        error((Atom)null, s);
     }
 
     /*
@@ -51,9 +50,7 @@
      */
     void warn(String s)
     {
-        if (warnings) {
-            err.println(s);
-        }
+        warn((Atom)null, s);
     }
 
     /*
@@ -71,8 +68,13 @@
      */
     private void output(Atom a, String s)
     {
-        err.println("\"" + a.file + "\", line " + a.line + ":  "
-                + s + " (" + a.text + ")");
+        if (a == null) {
+            err.println(s);
+        }
+        else {
+            err.println("\"" + a.file + "\", line " + a.line + ":  "
+                + s + " (" + a.text + ")");
+        }
     }
 
     /**************************************/
@@ -80,31 +82,37 @@
     /**
      * Forget that any fatal errors have been reported.
      */
-    public void clearErrors() {
+    public void clearErrors()
+    {
         this.errors = false;
     }
 
     /**
      * Report whether any fatal errors have been reported.
+     * @return true iff an error has occured since the last time errors
+     *         were cleared
      */
-    public boolean hasErrors() {
-        return this.errors;
+    public boolean hasErrors()
+    {
+        return (this.errors);
     }
 
     /**
      * Set whether or not to report warnings.
      * @return true iff warnings were enabled previously.
      */
-    public boolean setWarnings(boolean warnings) {
+    public boolean setWarnings(boolean warnings)
+    {
         boolean old = this.warnings;
         this.warnings = warnings;
-        return old;
+        return (old);
     }
 
     /**
      * Set the stream that receives warning and error reports.
      */
-    public void setErr(PrintWriter err) {
+    public void setErr(PrintWriter err)
+    {
         this.err = err;
     }
 
@@ -112,7 +120,7 @@
 
     private boolean errors = false;        /* an error has occured */
     private boolean warnings = false;     /* display warnings (or not) */
+
     /* by default, report to stderr with automatic flushing */
     private PrintWriter err = new PrintWriter(System.err, true);
-
 }
diff --git a/packages/xdc/services/spec/ParserSession.java b/packages/xdc/services/spec/ParserSession.java
index 6c56be2..db25887 100644
--- a/packages/xdc/services/spec/ParserSession.java
+++ b/packages/xdc/services/spec/ParserSession.java
@@ -29,9 +29,9 @@
     private Pkg curPkg = null;
     private boolean verbose = true;
     private boolean strict = false;
-    private Clock clock = new Clock();
-    private int unitCnt;
-
+    private Clock clock = new Clock();
+    private int unitCnt;
+
     /**
      * No arg constructor
      */
@@ -105,7 +105,7 @@
         
         /* discard old errors */
         msg.clearErrors();
-
+        
         this.curPkg = (pkg == null) ? this.scan(pkgFile) : pkg;
         this.curPkg.bindSession(this);
         this.enterNode(this.curPkg.getQualName(), this.curPkg);
@@ -165,7 +165,7 @@
     // loadUnit
     Unit loadUnit( String name )
     {
-        return (this.pass2(this.pass1(name, Kind.ANY)));
+    	return (this.pass2(this.pass1(name, Kind.ANY)));
     }
     
     // pass1
diff --git a/packages/xdc/services/spec/Session.java b/packages/xdc/services/spec/Session.java
index 8b31e77..f77efe2 100644
--- a/packages/xdc/services/spec/Session.java
+++ b/packages/xdc/services/spec/Session.java
@@ -9,9 +9,9 @@
  *      Texas Instruments - initial implementation
  * 
  * --/COPYRIGHT--*/
-//
-// ======== xdc.services.spec.Session ========
-//
+/*
+ * ======== xdc.services.spec.Session ========
+ */
 
 package xdc.services.spec;
 
diff --git a/packages/xdc/services/spec/Type.java b/packages/xdc/services/spec/Type.java
index 3e3e131..ec58f0e 100644
--- a/packages/xdc/services/spec/Type.java
+++ b/packages/xdc/services/spec/Type.java
@@ -246,7 +246,7 @@
             return this.base.sig(kind) + '[' + doms + ']';
         }
 
-        // sizeof
+        // Array.sizeof
         public void sizeof( List<String> sL )
         {
             if (this.kind == Kind.VEC) {
@@ -356,7 +356,7 @@
             }
         }
 
-        // sizeof
+        // Declarator.sizeof
         public void sizeof( List<String> sL )
         {
             this.tspec.sizeof(sL);
@@ -460,7 +460,7 @@
             return res + ")";
         }
 
-        // sizeof
+        // Fxn.sizeof
         public void sizeof( List<String> sL )
         {
             sL.add("U" + Type.FXN);
@@ -516,7 +516,7 @@
             return "(" + this.base.sig(kind) + ")";
         }
 
-        // sizeof
+        // Paren.sizeof
         public void sizeof( List<String> sL )
         {
             this.base.sizeof(sL);
@@ -585,7 +585,7 @@
             return this;
         }
 
-        // sizeof
+        // Ptr.sizeof
         public void sizeof( List<String> sL )
         {
             sL.add("U" + Type.PTR);
@@ -766,7 +766,7 @@
             }
         }
 
-        // sizeof
+        // Spec.sizeof
         public void sizeof( List<String> sL )
         {
             if (this.std != null) {
diff --git a/packages/xdc/services/spec/Unit.java b/packages/xdc/services/spec/Unit.java
index 0070db0..edbb77a 100644
--- a/packages/xdc/services/spec/Unit.java
+++ b/packages/xdc/services/spec/Unit.java
@@ -46,7 +46,8 @@
     transient List<Impl.Body> fxnBodies;
     transient String codeFrag;
 
-    static HashSet<String> reservedAttrs    = new HashSet(Arrays.asList(new String[] {
+    static HashSet<String> reservedAttrs =
+        new HashSet(Arrays.asList(new String[] {
             Attr.A_CustomHeader,
             Attr.A_Facet,
             Attr.A_Gated,
@@ -59,15 +60,11 @@
             Attr.A_Proxy,
             Attr.A_TargetHeader,
             Attr.A_Template,
-                                            }));
+        })
+    );
 
-    Unit(
-    		Atom name,
-    		String pkgName,
-    		EnumSet<Qual> quals,
-    		List<Decl> decls,
-    		List<Import> imps,
-            Sup isa, Sup dlg )
+    Unit(Atom name, String pkgName, EnumSet<Qual> quals, List<Decl> decls,
+        List<Import> imps, Sup isa, Sup dlg)
     {
         this.name = name;
         this.pkgName = pkgName;
@@ -97,7 +94,9 @@
             return;
         }
         
-        if (this.isa == null && !this.isMeta() && !this.getQualName().equals("xdc.runtime.IModule")) {
+        if (this.isa == null && !this.isMeta()
+            && !this.getQualName().equals("xdc.runtime.IModule")) {
+
             Atom a = this.name.copy("xdc.runtime.IModule");
             this.isa = new Sup(a);
             // TODO: add to incvec???
@@ -105,7 +104,7 @@
     }
     
     // addProxy
-    private void addProxy( Decl.Proxy prx, boolean strict )
+    private void addProxy(Decl.Proxy prx, boolean strict)
     {
         prx.sup.resolve(this);
 
@@ -123,8 +122,9 @@
         
         Unit pu;
         
-        pu = new Unit(prx.name.copy(this.name.text + '_' + prx.name.text), this.pkgName, qS,
-                new ArrayList(), new ArrayList(), prx.sup, null);
+        pu = new Unit(prx.name.copy(this.name.text + '_' + prx.name.text),
+                      this.pkgName, qS, new ArrayList(), new ArrayList(),
+                      prx.sup, null);
 
         pu.bindParent(this.getParent());
         pu.proxy = true;
@@ -136,35 +136,8 @@
         this.uses.add(pu);
     }
 
-/*
-    private void addProxy( Decl.Proxy prx, String pre )
-    {
-        EnumSet<Qual> qS = EnumSet.copyOf(prx.sup.unit.quals);
-        qS.remove(Qual.INTERFACE);
-        qS.add(Qual.MODULE);
-        
-        Unit pu;
-        
-        pu = new Unit(prx.name.copy(this.name.text + pre + "_" + prx.name.text), this.pkgName, qS,
-                new ArrayList(), new ArrayList(), prx.sup, null);
-
-        pu.bindParent(this.getParent());
-        pu.proxy = true;
-        pu.pass1Check();
-        pu.pass2Check();
-
-        this.prxs.add(pu);
-        this.uses.add(pu);
-        
-        for (Decl d : prx.sup.unit.decls) {
-            if (d instanceof Decl.Proxy) {
-                this.addProxy((Decl.Proxy)d, "_" + prx.name.text);
-            }
-        }
-    }
-*/
     // addUse
-    void addUse( Ref ref )
+    void addUse(Ref ref)
     {
         // TODO: not needed ???
     }
@@ -188,7 +161,7 @@
     }
 
     // checkOver
-    private void checkOver( Decl d, boolean strict )
+    private void checkOver(Decl d, boolean strict)
     {
         if (d.isInternal() || this.getSuper() == null) {
             return;
@@ -251,8 +224,10 @@
         }
     }
 
-    // decl
-    public final Decl decl( String name )
+    /**
+     *  @deprecated replaced by {@link #getDecl()}
+     */
+    @Deprecated public final Decl decl(String name)
     {
         return this.parent.ses.findDecl(this.getQualName() + '.' + name);
     }
@@ -382,6 +357,23 @@
         return this.cfgs;
     }
 
+    /**
+     *  Get the named declaration from this unit
+     *
+     *  This method returns the most specific declaration named by
+     *  name for this unit.  If the named declaration does not exist, null is
+     *  returned.
+     */
+    public final Decl getDecl(String name)
+    {
+        for (Decl d: this.decls) {
+            if (d.name.text.equals(name)) {
+                return (d);
+            }
+        }
+        return null;
+    }
+
     // getDecls
     public final List<Decl> getDecls()
     {
@@ -523,7 +515,7 @@
     }
 
     // lookupSup
-    private Decl lookupSup( String name, Unit su )
+    private Decl lookupSup(String name, Unit su)
     {
         Decl cur = null;
 
@@ -636,7 +628,7 @@
             }
             if (this.isMeta() != this.isa.unit.isMeta()) {
                 ses.msg.error(this.name,
-                        "can't inherit an interface with a different metaonly qualifier");
+                    "can't inherit an interface with a different metaonly qualifier");
             }
             this.uses.add(this.isa.unit);
             if (!this.isa.iid.text.equals("xdc.runtime.IModule")) {
@@ -654,7 +646,7 @@
             }
             if (this.isMeta() != this.dlg.unit.isMeta()) {
                 ses.msg.error(this.name,
-                        "can't delegate to a module with a different metaonly qualifier");
+                    "can't delegate to a module with a different metaonly qualifier");
             }
             boolean iflg = false;
             for (Sup sup = this.dlg.unit.isa; sup != null; sup = sup.unit.isa) {
@@ -663,7 +655,8 @@
                 }
             }
             if (!iflg) {
-                ses.msg.error(this.name, "delegate must inherit from this module's interface");
+                ses.msg.error(this.name,
+                    "delegate must inherit from this module's interface");
             }
             this.uses.add(this.dlg.unit);
             this.sizeFlag = this.dlg.unit.sizeFlag;
@@ -711,9 +704,9 @@
 
         if (this.attrBool(Attr.A_Gated) && this.isMod() && !this.isProxy()) {
             Decl.Proxy prx = new Decl.Proxy(
-                    new Atom("Module_GateProxy"),
-                    EnumSet.of(Qual.INTERNAL),
-                    new Sup(new Atom("xdc.runtime.IGateProvider"))
+                new Atom("Module_GateProxy"),
+                EnumSet.of(Qual.INTERNAL),
+                new Sup(new Atom("xdc.runtime.IGateProvider"))
             );
             this.decls.add(prx);
             prx.bindParent(this);
@@ -734,7 +727,8 @@
             }
             if (this.hasAttr(Attr.A_CustomHeader)) {
                 if (this.isMeta()) {
-                    ses.msg.error(this.name, "@CustomHeader can't be used in metaonly units");
+                    ses.msg.error(this.name,
+                        "@CustomHeader can't be used in metaonly units");
                 }
                 else {
                     this.custHdr = true;
@@ -743,7 +737,8 @@
                 }
             }
             if (this.hasAttr(Attr.A_TargetHeader) && !this.isMeta()) {
-                ses.msg.error(this.name, "@TargetHeader must be used in metaonly units");
+                ses.msg.error(this.name,
+                    "@TargetHeader must be used in metaonly units");
             }
         }
 
@@ -755,21 +750,24 @@
             ses.msg.error(this.name, "@Facet units must be metaonly");
         }
         
-        if (this.isMod() && this.isInst() && !this.isProxy() && !this.isMeta() && !this.isHeir()) {
+        if (this.isMod() && this.isInst() && !this.isProxy()
+            && !this.isMeta() && !this.isHeir()) {
+
             if (this.getSession().findDecl(this, "Instance_State") == null) {
-                ses.msg.error(this.name, "missing internal Instance_State declaration");
+                ses.msg.error(this.name,
+                    "missing internal Instance_State declaration");
             }
         }
         
         for (Decl d : this.decls) {
-        	
-        	boolean flg = d.getName().equals("ticksPerSecond");
-        	
-        	if (d.parent != this && d instanceof Decl.AuxDef &&
-            		!(d instanceof Decl.OverridableDef) && !(d instanceof Decl.Struct)) {
+
+            if (d.parent != this && d instanceof Decl.AuxDef
+                && !(d instanceof Decl.OverridableDef)) {
+
                 String qn = this.getQualName() + '.' + d.getName();
                 if (!this.getSession().enterNode(qn, d)) {
-                    ses.msg.error(d.name, "multiple declaration in current unit");
+                    ses.msg.error(d.name,
+                        "multiple declaration in current unit");
                     continue;
                 }
             }
@@ -839,13 +837,19 @@
         Impl.resolveUnit(this);
     }
         
-    // queryFacet
-    public String queryFacet( String uName )
+    /**
+     *  Query unit for the specified facet type
+     *
+     *  @return the name of the config parameter that corresponds to the
+     *  type named by tName
+     */
+    public String queryFacet(String tName)
     {
         String res = null;
         
         for (Decl.Config cfg : this.cfgs) {
-            if (cfg.hasAttr(Attr.A_Facet) && cfg.type.tspec().getRef().getNode().getQualName().equals(uName)) {
+            if (cfg.hasAttr(Attr.A_Facet)
+                && cfg.type.tspec().getRef().getNode().getQualName().equals(tName)) {
                 res = cfg.getName();
                 break;
             }
diff --git a/packages/xdc/services/spec/custom.mak b/packages/xdc/services/spec/custom.mak
index 5a9d242..f65cf90 100644
--- a/packages/xdc/services/spec/custom.mak
+++ b/packages/xdc/services/spec/custom.mak
@@ -13,6 +13,7 @@
 JAVADOCDIR  = $(DOCDIR)/javadoc
 PKGNAME     = $(subst /,.,$(PKGDIR))
 
+ANTLR_TOOL   = $(XDCROOT)/packages/xdc/shelf/local/java/antlr_tool.jar
 ANTLR   = $(XDCROOT)/packages/xdc/shelf/java/antlr.jar
 RHINO	= $(XDCROOT)/packages/xdc/shelf/java/js.jar
 ECLIPSE = $(XDCROOT)/packages/xdc/shelf/java/ecj.jar
@@ -22,7 +23,7 @@
 .interfaces: GrammarParser.java
 
 %Lexer.java %.tokens %Parser.java: %.g $(ANTLR)
-	$(JAVA) $(JOPTS) -cp $(ANTLR) org.antlr.Tool -o . $*.g
+	$(JAVA) $(JOPTS) -cp "$(ANTLR)$(PATHCHAR)$(ANTLR_TOOL)" org.antlr.Tool -o . $*.g
 
 .libraries: $(JARFILE)
 $(JARFILE): $(patsubst %,$(CLASSDIR)/%.class,$(CLASSES))
diff --git a/packages/xdc/tools/cdoc/Example.xdc b/packages/xdc/tools/cdoc/Example.xdc
index 2151ac8..5650130 100644
--- a/packages/xdc/tools/cdoc/Example.xdc
+++ b/packages/xdc/tools/cdoc/Example.xdc
@@ -62,7 +62,7 @@
      *  ======== u ========
      *  Example statically initialized union documentation
      */
-    config AUnion u = {s: 'hello', i: 1234};
+    config AUnion u = {aString: 'hello', anInt: 1234};
 
     /*!
      *  ======== ATypedEnum ========
diff --git a/packages/xdc/tools/cdoc/package.xdc b/packages/xdc/tools/cdoc/package.xdc
index 3e0e272..9ad3c4c 100644
--- a/packages/xdc/tools/cdoc/package.xdc
+++ b/packages/xdc/tools/cdoc/package.xdc
@@ -10,6 +10,10 @@
  * 
  * --/COPYRIGHT--*/
 
+/*!
+ *  ======== xdc.tools.cdoc ========
+ *  RTSC Document Generator Tool
+ */
 package xdc.tools.cdoc [1,0,0,0] {
     module Main;
     module Markup;
diff --git a/packages/xdc/xdc.tci b/packages/xdc/xdc.tci
index da052fc..f564724 100644
--- a/packages/xdc/xdc.tci
+++ b/packages/xdc/xdc.tci
@@ -4,10 +4,10 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *      Texas Instruments - initial implementation
- * 
+ *
  * --/COPYRIGHT--*/
 /*
  *  ======== xdc.tci ========
@@ -17,7 +17,7 @@
 addJars(environment['xdc.root'] + '/packages/xdc/services/spec/java');
 addJars(environment['xdc.root'] + '/packages/xdc/services/intern/cmd/java');
 addJars(environment['xdc.root'] + '/packages/xdc/services/intern/gen/java');
-addJars(environment['xdc.root'] + '/packages/xdc/shelf/java');  
+addJars(environment['xdc.root'] + '/packages/xdc/shelf/java');
 
 /*
  *  ======== xdc ========
@@ -191,9 +191,9 @@
 
     var base = xdc.findFile(fname + psf);
     if (base == null) {
-        throw xdc.$$failPackageNotFound(pname);
+        xdc.$$failPackageNotFound(pname);
     }
-    
+
     var apath = "" + java.io.File(base).getCanonicalPath();
 
     var len = psf.length - 1;
@@ -216,7 +216,7 @@
 {
     var fileName = pname.replace(/\./g, '/');
     var path = xdc.curPath();
-    
+
     /* search along path for specified file */
     var dirArray = path.split(';');
     for (var i = 0; i < dirArray.length; i++) {
@@ -228,7 +228,7 @@
     }
 
     /* if package is not found, throw exception */
-    throw xdc.$$failPackageNotFound(pname);
+    xdc.$$failPackageNotFound(pname);
 };
 
 xdc.$$pkgStack = [];
@@ -256,7 +256,7 @@
 {
     $$JCLS = true;
     $$ECHO = false;
-    
+
     if (!('$$ses' in xdc)) {
         xdc.$$ses = new Packages.xdc.services.spec.BrowserSession(
             xdc.curPath().split(';'),
@@ -269,7 +269,7 @@
 
     /* If a package is loading itself, just return. */
     if (xdc.om.$curpkg == qn) {
-        return (xdc.om[qn]);      
+        return (xdc.om[qn]);
     }
 
     var dependencyKey;
@@ -297,7 +297,7 @@
     var $om = xdc.om;
     var stat = qn + '$$stat';
     var pkgStack = xdc.$$pkgStack;
-    
+
     if (stat in $om) {
         switch ($om[stat]) {
             case 0:
@@ -315,12 +315,12 @@
 
     if (cname == null) {
         /* If the error is caught, $require can be still traversed and packages
-         * in it referenced, so we have to remove 'dependencyKey' from 
+         * in it referenced, so we have to remove 'dependencyKey' from
          * $require to avoid referencing 'qn' package, which we couldn't find.
          */
         delete xdc.om.$require[dependencyKey];
 
-        throw xdc.$$failPackageNotFound(qn);
+        xdc.$$failPackageNotFound(qn);
     }
 
     var apath = "" + java.io.File(cname).getAbsolutePath();
@@ -329,7 +329,7 @@
     var packageBase = apath.substring(0, apath.indexOf(pdir + qn) + 1);
     var packageRepository = packageBase.substring(0,
         packageBase.length - (fname.length + 1));
-    
+
     xdc.$$trace("loadPackage: " + qn + " loaded from " + packageRepository, 0,
         ["packageLoad"]);
 
@@ -367,13 +367,21 @@
         try {
             var pkgspec = xdc.$$ses.findPkg(qn);
         }
-        catch(e) {
+        catch (e) {
             /* If the on-the-fly compilation fails, a RuntimeException is
              * thrown. It's caught here temporarily until we decide what to
              * do in such cases. We obviously catch other exceptions.
              */
             delete xdc.om.$require[dependencyKey];
-            throw xdc.$$failPackageNotFound(qn);
+            xdc.$$failPackageReparseFailed(qn, e);
+        }
+
+        /* TO DO: It seems that pkgspec can be 'null' without an exception
+         * being thrown. Find out if that's a bug.
+         */ 
+        if (pkgspec == null) {
+            delete xdc.om.$require[dependencyKey];
+            xdc.$$failPackageNotFound(qn);
         }
 
         var cacheElem = new xdc.jre.xdc.services.global.CacheElem(
@@ -420,7 +428,7 @@
  *  ======== xdc.loadTemplate ========
  *  Load template specified by fname
  *
- *  @param  fname - string file name of the template to be loaded.  The 
+ *  @param  fname - string file name of the template to be loaded.  The
  *                  actual file is determined via xdc.findFile().
  *
  *  @return template object
@@ -432,7 +440,7 @@
 {
     var path = xdc.findFile(fname);
     if (path == null) {
-        throw xdc.$$failFileNotFound(fname);
+        xdc.$$failFileNotFound(fname);
     }
 
     var file = new java.io.File(path);
@@ -454,7 +462,7 @@
  *  ======== xdc.loadXML ========
  *  Load XML specified by XMLfile
  *
- *  @param  fname - file name of the XML file to be loaded.  The 
+ *  @param  fname - file name of the XML file to be loaded.  The
  *                  actual file is determined via xdc.findFile().
  *
  *  @return XMLobject
@@ -466,11 +474,11 @@
 {
     var path = xdc.findFile(fname);
     if (path == null) {
-        throw xdc.$$failFileNotFound(fname);
+        xdc.$$failFileNotFound(fname);
     }
     var fr = new java.io.FileReader(path);
     var br = new java.io.BufferedReader(fr);
-    
+
     var sb = new java.lang.StringBuilder();
 
     var line = "";
@@ -505,7 +513,7 @@
     var k = qname.lastIndexOf('.');
     if (k == -1) {
         if (pkg == null) {
-            throw new Packages.xdc.services.global.XDCException(
+            throw xdc.$$XDCException(
                 "xdc.MODULE_NOT_FOUND",
                 "xdc.module: module name '"
                     + qname + "' must be qualified with its package name");
@@ -520,7 +528,7 @@
 
     /* no uname in this package */
     if (!(uname in pkg)) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.MODULE_NOT_FOUND",
             "xdc.module: no module named " + qname
                 + " in the package " + pkg.$name);
@@ -530,13 +538,26 @@
 };
 
 /*
+ *  ======== xdc.$$XDCException ========
+ *  Returns a wrapped XDCException
+ */
+xdc.$$XDCException = function(errorId, message) 
+{
+    return Packages.org.mozilla.javascript.Context.
+               currentContext.throwAsScriptRuntimeEx(
+                   new Packages.xdc.services.
+                       global.XDCException(
+                           "XDCException: " + errorId, message)); 
+}
+
+/*
  *  ======== xdc.$$run ========
  *  Run main method of specified capsule
  */
 xdc.$$run = function(args)
 {
     if (args.length == 0) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.TOOL_USAGE_ERROR", "usage: xs [-m] name args");
     }
 
@@ -545,7 +566,7 @@
         var fname = args.shift();
         var cname = xdc.findFile(fname);
         if (cname == null) {
-            throw xdc.$$failFileNotFound(fname);
+            xdc.$$failFileNotFound(fname);
         }
         else {
             xdc.loadCapsule(cname);
@@ -563,7 +584,7 @@
         Cap.main(args);
     }
     else {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.MODULE_UNDEFINED_MAIN_FUNCTION",
             "the module '" + qn + "' does not define a main() function");
     }
@@ -578,8 +599,8 @@
     var file = new java.io.File(ps);
     if (!file.exists()) {
         /* TODO: this should probably be a "not a package" message */
-        throw new Packages.xdc.services.global.XDCException(
-            "xdc.FILE_NOT_FOUND", "file '" + ps + "' does not exist");  
+        throw xdc.$$XDCException(
+            "xdc.FILE_NOT_FOUND", "file '" + ps + "' does not exist");
     }
 
     /* scan the package specification to get package name */
@@ -592,7 +613,7 @@
         xdc.$$private.Env.setCurPkgBase(pbase, pname);
     }
     catch (e) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.SPEC_FILE_ERROR",
             file.getCanonicalPath() + " is not a valid package spec: " + e);
     }
@@ -623,7 +644,7 @@
  *  variable 'xdc.traceEnable', if the latter is defined.
  *
  *  @param mask     (optional) new trace mask string
- *  
+ *
  *  @return         previous (or current) trace mask string
  */
 xdc.traceEnable = function (mask)
@@ -660,7 +681,6 @@
  */
 xdc.useModule = function(qname)
 {
-
     var unit = xdc.module(qname);
 
     /* mark it used (if not an interface) and return */
@@ -699,27 +719,27 @@
 
     if (e.rhinoException) {
         print(e.rhinoException.getScriptStackTrace());
-    } 
+    }
     else if (e instanceof java.lang.Exception) {
         e.printStackTrace();
     }
-
 };
 
 
 /*
- *  ======== DEPRECATED ALIASES ========
+ *  ======== xdc.importPackage ========
+ *  DEPRECATED ALIAS
  */
-xdc.importPackage = function(qn)
+xdc.importPackage = function (qn)
 {
-    throw new Packages.xdc.services.global.XDCException(
+    throw xdc.$$XDCException(
         "xdc.DEPRECATED_FUNCTION",
         "The function xdc.importPackage() is deprecated." +
         "Please use xdc.loadPackage() instead.");
 };
 
 /*
- *  ======== xdc fatal errors ========
+ *  ======== xdc.$$failPackageNotFound ========
  */
 xdc.$$failPackageNotFound = function (pname)
 {
@@ -732,27 +752,50 @@
     }
     else {
         msg = pfile
-            + " found along the package path, but no schema file was found." 
+            + " found along the package path, but no schema file was found."
             + "  Ensure that the package '" + pname + "' is completely built.";
     }
 
-    return (new Packages.xdc.services.global.XDCException(
-		"xdc.PACKAGE_NOT_FOUND", msg));
-};
-
-xdc.$$failFileNotFound = function (fname)
-{
-    return (new Packages.xdc.services.global.XDCException(
-        "xdc.FILE_NOT_FOUND", "can't locate file '" + fname
-            + "' along the path: " + utils.csd + ';' + xdc.curPath()));
+    throw xdc.$$XDCException("xdc.PACKAGE_NOT_FOUND", msg);
 };
 
 /*
- *  ======== initialization ========
+ *  ======== xdc.$$failPackageReparseFailed ========
+ */
+xdc.$$failPackageReparseFailed = function (pname, e)
+{
+    var pfile = pname.replace(/\./g, '/') + "/package.xdc";
+    var msg;
+    if ((pfile = xdc.findFile(pfile)) == null) {
+        msg = "can't locate the package '" + pname
+            + "' along the path: '" + xdc.curPath()
+            + "'. Ensure that the package path is set correctly.";
+    }
+    else {
+        msg = pfile
+            + " found along the package path, but it's package files are incompatible with the current tools and could not be regenerated ("
+            + e + ").  The package " + pname + " must be rebuilt with the current tools.";
+    }
+
+    throw xdc.$$XDCException("xdc.PACKAGE_REPARSE_FAILED", msg);
+};
+
+/*
+ *  ======== xdc.$$failFileNotFound ========
+ */
+xdc.$$failFileNotFound = function (fname)
+{
+    throw xdc.$$XDCException("xdc.FILE_NOT_FOUND", "can't locate file '"
+        + fname + "' along the path: " + utils.csd + ';' + xdc.curPath());
+};
+
+/*
+ *  ======== xdc.$$init ========
  */
 xdc.$$init = function ()
 {
     xdc.loadCapsule('template.xs');
 };
 
+/* ======== initialization ======== */
 xdc.$$init();
diff --git a/packages/xdc/xs.js b/packages/xdc/xs.js
index c3a139b..f4aa285 100644
--- a/packages/xdc/xs.js
+++ b/packages/xdc/xs.js
@@ -59,8 +59,23 @@
 if (environment['xdc.tracePackages']) {
     Trace.packageEnable(environment['xdc.tracePackages'].split(";"));	
 }
+var previousGroups = [];
 if (environment['xdc.traceGroups']) {
-    Trace.groupEnable(environment['xdc.traceGroups'].split(";"));	
+    previousGroups = environment['xdc.traceGroups'].split(";");
+    Trace.groupEnable(previousGroups);	
+}
+if (environment['xdc.traceEnable']) {
+    var simpleInput = environment['xdc.traceEnable'];
+    if (simpleInput == "all") {
+        Trace.setLevel(utils.trace.$maxLevel);
+        previousGroups.push("all");
+        Trace.groupEnable(previousGroups);
+    }
+    if (simpleInput == "load") {
+        Trace.setLevel(utils.trace.$maxLevel);
+        previousGroups.push("packageLoad");
+        Trace.groupEnable(previousGroups);
+    }
 }
                
 /* interpret the arguments */
@@ -71,7 +86,7 @@
     mod = arguments.shift();
     /* 'mod' is the name of the module to be found on XDCPATH */
     if (mod == null) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.TOOL_USAGE_ERROR",
             "xs: option -m must be followed by a module name");
     }
@@ -86,7 +101,7 @@
         utils.csd = save;
     }
     else {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.MODULE_UNDEFINED_MAIN_FUNCTION", "the module '" + mod
             + "' does not define a main() function");
     }
@@ -97,7 +112,7 @@
     var spath = './' + ';' + xdc.curPath();
     var fname = arguments.shift();
     if (fname == null) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.TOOL_USAGE_ERROR", "xs:option " + flag
             + " must be followed by a file name");  
     }
@@ -105,7 +120,7 @@
 
     var cname = utils.findFile(fname, spath, ';');
     if (cname == null) {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.FILE_NOT_FOUND", "xs: can't find '" + fname
             + "' along the path '" + spath + "'"
             + "; Ensure that environment variable XDCPATH is set correctly."
@@ -116,7 +131,7 @@
     if (flag == "-c") {
         var Cap = xdc.loadCapsule(cname);
         if (typeof Cap.main != "function") {
-            throw new Packages.xdc.services.global.XDCException(
+            throw xdc.$$XDCException(
                 "xdc.UNDEFINED_MAIN_FUNCTION", "the module '" + cname
                 + "' does not define a main() function");
         }
@@ -146,13 +161,13 @@
             utils.csd = save;
         }
         else {
-            throw new Packages.xdc.services.global.XDCException(
+            throw xdc.$$XDCException(
                 "xdc.UNDEFINED_MAIN_FUNCTION", "the module '" + pkg.Main.$name
                 +"' does not define a main() function");
         }
     }
     else {
-        throw new Packages.xdc.services.global.XDCException(
+        throw xdc.$$XDCException(
             "xdc.UNDEFINED_MAIN_FUNCTION", "the package '" + pkgName
             + "' does not have a module 'Main'");
     }
