diff --git a/tconfpy.py b/tconfpy.py
index 4be09f2..0765e49 100755
--- a/tconfpy.py
+++ b/tconfpy.py
@@ -6,7 +6,7 @@
 # Program Information
 
 PROGNAME = "tconfpy"
-RCSID = "$Id: tconfpy.py,v 2.106 2005/01/19 10:03:33 tundra Exp $"
+RCSID = "$Id: tconfpy.py,v 2.107 2005/01/19 11:08:24 tundra Exp $"
 VERSION = RCSID.split()[2]
 
 # Copyright Information
@@ -268,21 +268,25 @@
 eBADDEFAULT   = "Type Of Default Value Does Not Agree With Type Declared"
 eBADLEGALVAL  = "Type Of One Or More LegalVals Does Not Agree With Type Declared"
 eBADMINMAX    = "Type Of Min Or Max Value Not Appropriate For" 
-eBADVARREF     = "Attempt To Get Value Of Non-Existent Variable"
+eBADTEMPLNAME = "Template Name Not Canonical"
+eBADVALTYP    = "Initial Value Has Wrong Type"
+eBADVARREF    = "Attempt To Get Value Of Non-Existent Variable"
 eIFBAD        = "'%s' Or '%s' Missing" % (EQUIV, NOTEQUIV)
+eINITSYMTBL   = "InitialSymTable"
 eLEGALVALLIST = "The LegalVal Attribute Is Wrong Type (Must Be A List)"
 eNOTDESCRIPT  = "Invalid Descriptor Type"
 eNOVARS       = "This Conditional Requires At Least One Variable Name To Test"
 eSTARTUP      = "<Program Starting>"
+eTEMPLATES    = "Templates"
 
 # Error Messages
 
+Messages["eAPIPARAMBAD"]      = "API Error: %s For Variable '%s' In '%s' Passed To The API"
 Messages["eBADCOND"]          = FILENUM + "Bad '%s' Directive. %s"
 Messages["eBADREGEX"]         = FILENUM + "Bad Regular Expression, '%s', In Legal Values List For Variable '%s'"
 Messages["eBADSYNTAX"]        = FILENUM + "Syntax Error.  Statement Not In Known Form"
 Messages["eCONFIGTYPE"]       = "Don't Know How To Process Configurations Of Type '%s'"
 Messages["eCONFOPEN"]         = FILENUM + "Cannot Open The File '%s'"
-Messages["eDESCRIPTBAD"]      = "API Error: %s For Variable '%s'"
 Messages["eELSENOIF"]         = FILENUM + "'%s' Without Preceding '%s' Form" % (ELSE, IF)
 Messages["eENDIFEXTRA"]       = FILENUM + "'" + ENDIF + "' Without Matching Condition"
 Messages["eENDIFMISS"]        = FILENUM + "Missing %d" + " '%s' " % ENDIF + " Statement(s)"
@@ -406,14 +410,38 @@
 
     global SymTable
     
-    # Set the name of the calling program for output messages
-    
-    mkmsg.proginfo = CallingProgram
-    
-    # Create and initialize a new symbol table
-
+    # Create a new symbol table
     SymTable = SymbolTable()
 
+    # Set the name of the calling program for output messages
+    mkmsg.proginfo = CallingProgram
+
+    # Validate the passed symbol table
+    symtblok = ValidateSymbolTable(InitialSymTable.Symbols, eINITSYMTBL)
+
+    # Validate the passed template table
+    templok = ValidateSymbolTable(Templates.Symbols, eTEMPLATES, istemplate=True)
+
+    # Both of these must be OK or we're done
+
+    if not (symtblok and templok):
+        return SymTable
+
+    # Everything was fine
+    
+    else:
+        # Load the symbol table
+        
+        for sym in InitialSymTable.Symbols:
+            SymTable.Symbols[sym] = InitialSymTable.Symbols[sym]
+
+        # Load the template table
+
+        for sym in Templates.Symbols:
+            SymTable.Templates.Symbols[sym] = Templates.Symbols[sym]
+        
+
+    
     # Initialize the globals
 
     SymTable.ALLOWNEWVAR   = AllowNewVars
@@ -423,7 +451,7 @@
     SymTable.INLITERAL     = False
     SymTable.DEBUG         = Debug
 
-    # Load the predefines symbols
+    # Load the predefined symbols
 
     for var in Predefined.keys():
 
@@ -433,80 +461,6 @@
         SymTable.Symbols[var] = d
 
 
-
-    # Add any passed symbols to the SymbolTable
-
-    deserror = False
-    for sym in InitialSymTable.Symbols:
-
-        des = InitialSymTable.Symbols[sym]
-
-        # Make sure a valid descriptor was passed for each variable
-
-        desok    = True
-
-        # Make sure we got a Var Descriptor Object
-
-        if not isinstance(des, VarDescriptor):
-            desok = False
-            ErrorMsg("eDESCRIPTBAD", (eNOTDESCRIPT, sym))
-            des = VarDescriptor()    # Make a fake one so the following tests don't blow up
-
-        # Check various entries for type agreement
-
-        dt = des.Type
-
-        # Make sure default value agrees with variable type
-
-        if des.Default and type(des.Default) != dt:
-            desok = False
-            ErrorMsg("eDESCRIPTBAD", (eBADDEFAULT, sym))
-
-        # Make sure that LegalVals is a list type
-
-        if type(des.LegalVals) != type([]):
-            desok = False
-            ErrorMsg("eDESCRIPTBAD", (eLEGALVALLIST, sym))
-            
-        # Then check each value in the list for type agreement
-        else:
-
-            for lv in des.LegalVals:
-                if type(lv) != dt:
-                    desok = False
-                    ErrorMsg("eDESCRIPTBAD", (eBADLEGALVAL, sym))
-
-        # Make sure min and max limits are of the correct type
-
-        for mm in (des.Min, des.Max):
-
-            # Floats can accept Float or Int boundaries
-            # Ints, & Strings can accept Int boundaries
-            # Boundaries not relevant for  Bool and Complex
-            # Anything else is an error
-
-            if mm and dt == TYPE_FLOAT and type(mm) != TYPE_FLOAT and type(mm) != TYPE_INT:
-                desok = False
-                ErrorMsg("eDESCRIPTBAD", (eBADMINMAX, sym))
-
-            if mm and dt in (TYPE_INT, TYPE_STRING) and type(mm) != TYPE_INT:
-                desok = False
-                ErrorMsg("eDESCRIPTBAD", (eBADMINMAX, sym))
-
-        # Only load the symbol table with valid entries
-        if desok:
-            SymTable.Symbols[sym] = des
-
-        # Indicate that a problem was encountered
-        else:
-            deserror = True
-
-    # If any of the passed symbols had bogus descriptor contents, we're done
-
-    if deserror:
-        return SymTable
-
-
     # Symbol Table passed to API was OK, so keep going
 
     # Make sure the symbol table has a valid namespace
@@ -1361,6 +1315,91 @@
 # End Of 'ValidateSymbolName()'
 
 #####
+# Validate Symbol Table Content
+#####
+
+def ValidateSymbolTable(symtbl, name, istemplate=False):
+
+    errors = 0
+    
+    for sym in symtbl:
+
+        # Template names cannot contain a namespace separator character
+        
+        if istemplate and sym.count(NSSEP):
+            ErrorMsg("eAPIPARAMBAD", (eBADTEMPLNAME, sym, name))
+            errors += 1
+        
+        des = symtbl[sym]
+
+        # Make sure a valid descriptor was passed for each variable
+        # Make sure we got a Var Descriptor Object
+
+        if not isinstance(des, VarDescriptor):
+            errors += 1
+            ErrorMsg("eAPIPARAMBAD", (eNOTDESCRIPT, sym, name))
+            des = VarDescriptor()    # Make a fake one so the following tests don't blow up
+
+        # Check various entries for type agreement
+
+        dt = des.Type
+
+        # Make sure default value agrees with variable type
+
+        if des.Value and type(des.Value) != dt:
+            errors += 1
+            ErrorMsg("eAPIPARAMBAD", (eBADVALTYP, sym, name))
+
+        # Make sure default value agrees with variable type
+
+        if des.Default and type(des.Default) != dt:
+            errors += 1
+            ErrorMsg("eAPIPARAMBAD", (eBADDEFAULT, sym, name))
+
+        # Make sure that LegalVals is a list type
+
+        if type(des.LegalVals) != type([]):
+            errors += 1
+            ErrorMsg("eAPIPARAMBAD", (eLEGALVALLIST, sym, name))
+            
+        # Then check each value in the list for type agreement
+        else:
+
+            for lv in des.LegalVals:
+                if type(lv) != dt:
+                    errors += 1
+                    ErrorMsg("eAPIPARAMBAD", (eBADLEGALVAL, sym, name))
+
+        # Make sure min and max limits are of the correct type
+
+        for mm in (des.Min, des.Max):
+
+            # Floats can accept Float or Int boundaries
+            # Ints, & Strings can accept Int boundaries
+            # Boundaries not relevant for  Bool and Complex
+            # Anything else is an error
+
+            if mm and dt == TYPE_FLOAT and type(mm) != TYPE_FLOAT and type(mm) != TYPE_INT:
+                errors += 1
+                ErrorMsg("eAPIPARAMBAD", (eBADMINMAX, sym, name))
+
+            if mm and dt in (TYPE_INT, TYPE_STRING) and type(mm) != TYPE_INT:
+                errors += 1
+                ErrorMsg("eAPIPARAMBAD", (eBADMINMAX, sym, name))
+
+    # Return success of validation
+
+    symtblok = True
+
+    if errors:
+        symtblok = False
+
+    return symtblok
+
+# End Of 'ValidateSymbolTable()'
+
+
+#####
 # Validate Value
 #####