I have gone one more step in trying to isolate the problem. Given the existence of models/[menu.py, db.py] in the previous post, when default-fail.py is copied to controllers/default.py, the sub-menus DO NOT show up when hovered over.
However, when default-welcome209.py is copied to controllers/default.py, the sub-menus DO INDEED show up when hovered over. Here is default-fail.py # -*- coding: utf-8 -*- #ContactUs def update_t_contactus00(): return dict(form=crud.update(db.t_contactus00, request.args(0))) #Appointment def update_t_appointment00(): return dict(form=crud.update(db.t_appointment00, request.args(0))) indexMM = '''## Stock Forms for Web2py ### Background While using the web2py App Wizard, I got frustrated at needing to define the model for a "Contact Us" form for the *90 millionth time*. So, i made a suggestion in code.google/p/web2py in Issue 982. **Massimo liked the idea and said, "If you have done work in this direction feel free to post a patch."** ''' def index(): """ example action using the internationalization operator T and flash rendered by views/default/index.html or views/generic.html if you need a simple wiki simple replace the two lines below with: return auth.wiki() """ #response.flash = T("Welcome to web2py!") #return dict(message=T('Hello World')) return dict(message=MARKMIN(indexMM)) Here is default-welcome209.py # -*- coding: utf-8 -*- # this file is released under public domain and you can use without limitations ######################################################################### ## This is a samples controller ## - index is the default action of any application ## - user is required for authentication and authorization ## - download is for downloading files uploaded in the db (does streaming) ## - call exposes all registered services (none by default) ######################################################################### def index(): """ example action using the internationalization operator T and flash rendered by views/default/index.html or views/generic.html if you need a simple wiki simple replace the two lines below with: return auth.wiki() """ response.flash = T("Welcome to web2py!") return dict(message=T('Hello World')) def user(): """ exposes: http://..../[app]/default/user/login http://..../[app]/default/user/logout http://..../[app]/default/user/register http://..../[app]/default/user/profile http://..../[app]/default/user/retrieve_password http://..../[app]/default/user/change_password use @auth.requires_login() @auth.requires_membership('group name') @auth.requires_permission('read','table name',record_id) to decorate functions that need access control """ return dict(form=auth()) def download(): """ allows downloading of uploaded files http://..../[app]/default/download/[filename] """ return response.download(request,db) def call(): """ exposes services. for example: http://..../[app]/default/call/jsonrpc decorate with @services.jsonrpc the functions to expose supports xml, json, xmlrpc, jsonrpc, amfrpc, rss, csv """ return service() @auth.requires_signature() def data(): """ http://..../[app]/default/data/tables http://..../[app]/default/data/create/[table] http://..../[app]/default/data/read/[table]/[id] http://..../[app]/default/data/update/[table]/[id] http://..../[app]/default/data/delete/[table]/[id] http://..../[app]/default/data/select/[table] http://..../[app]/default/data/search/[table] but URLs must be signed, i.e. linked with A('table',_href=URL('data/tables',user_signature=True)) or with the signed load operator LOAD('default','data.load',args='tables',ajax=True,user_signature=True) """ return dict(form=crud()) Thanks for the help. Love and peace, Joe --